import net.sf.openrocket.android.db.DbAdapter;\r
import net.sf.openrocket.android.util.AndroidLogWrapper;\r
import android.graphics.Color;\r
-import android.graphics.Paint;\r
import android.graphics.PointF;\r
import android.os.Bundle;\r
import android.support.v4.app.Fragment;\r
import android.view.LayoutInflater;\r
-import android.view.MotionEvent;\r
-import android.view.ScaleGestureDetector;\r
import android.view.View;\r
-import android.view.View.OnTouchListener;\r
import android.view.ViewGroup;\r
\r
-import com.androidplot.xy.BoundaryMode;\r
import com.androidplot.xy.LineAndPointFormatter;\r
import com.androidplot.xy.LineAndPointRenderer;\r
import com.androidplot.xy.SimpleXYSeries;\r
import com.androidplot.xy.XYPlot;\r
import com.androidplot.xy.YValueMarker;\r
\r
-public class BurnPlotFragment extends Fragment implements OnTouchListener {\r
+public class BurnPlotFragment extends Fragment {\r
\r
private ExtendedThrustCurveMotor motor;\r
private long motorId;\r
\r
private XYPlot mySimpleXYPlot;\r
private SimpleXYSeries mySeries;\r
- private PointF minXY;\r
- private PointF maxXY;\r
-\r
- private float absMinX;\r
- private float absMaxX;\r
-\r
- private ScaleGestureDetector mScaleDetector;\r
- private float mScaleFactor = 1.f;\r
\r
public static BurnPlotFragment newInstance( long motorId ) {\r
BurnPlotFragment frag = new BurnPlotFragment();\r
AndroidLogWrapper.d(BurnPlotFragment.class,"onCreateView");\r
View v = inflater.inflate(R.layout.motor_burn, container, false);\r
mySimpleXYPlot = (XYPlot) v.findViewById(R.id.xyplot);\r
- mySimpleXYPlot.setOnTouchListener(this);\r
- mScaleDetector = new ScaleGestureDetector(v.getContext(), new ScaleListener());\r
init(motor);\r
return v;\r
}\r
mySeries = new SimpleXYSeries(data, SimpleXYSeries.ArrayFormat.XY_VALS_INTERLEAVED,"no data");\r
}\r
\r
- LineAndPointFormatter formatter= new LineAndPointFormatter(Color.RED, Color.GREEN, Color.GREEN);\r
+ LineAndPointFormatter formatter= new LineAndPointFormatter(Color.GREEN, Color.GREEN, Color.GREEN);\r
\r
formatter.getLinePaint().setShadowLayer(0, 0, 0, 0);\r
formatter.getVertexPaint().setShadowLayer(0, 0, 0, 0);\r
\r
mySimpleXYPlot.redraw();\r
\r
- minXY=new PointF(mySimpleXYPlot.getCalculatedMinX().floatValue(),mySimpleXYPlot.getCalculatedMinY().floatValue());\r
- maxXY=new PointF(mySimpleXYPlot.getCalculatedMaxX().floatValue(),mySimpleXYPlot.getCalculatedMaxY().floatValue());\r
-\r
- absMinX = minXY.x;\r
- absMaxX = maxXY.x;\r
-\r
- }\r
-\r
- private float mPosX;\r
- private float mPosY;\r
-\r
- private float mLastTouchX;\r
- private float mLastTouchY;\r
-\r
- private int mActivePointerId = -1;\r
-\r
- @Override\r
- public boolean onTouch(View arg0, MotionEvent event) {\r
- mScaleDetector.onTouchEvent(event);\r
-\r
- final int action = event.getAction();\r
- switch ( action & MotionEvent.ACTION_MASK ) {\r
- case MotionEvent.ACTION_DOWN: {\r
- final float x = event.getX();\r
- final float y = event.getY();\r
-\r
- mLastTouchX = x;\r
- mLastTouchY = y;\r
-\r
- mActivePointerId = event.getPointerId(0);\r
- break;\r
- }\r
-\r
- case MotionEvent.ACTION_MOVE: {\r
- final int pointerIndex = event.findPointerIndex(mActivePointerId);\r
- final float x = event.getX(pointerIndex);\r
- final float y = event.getY(pointerIndex);\r
-\r
- if (!mScaleDetector.isInProgress()) {\r
- final float dx = x - mLastTouchX;\r
- final float dy = y - mLastTouchY;\r
-\r
- mPosX += dx;\r
- mPosY += dy;\r
- scroll(dx);\r
- // do scroll.\r
-\r
- }\r
- mLastTouchX = x;\r
- mLastTouchY = y;\r
-\r
- break;\r
- }\r
-\r
- case MotionEvent.ACTION_UP: {\r
- mActivePointerId = -1;\r
- break;\r
- }\r
-\r
- case MotionEvent.ACTION_CANCEL: {\r
- mActivePointerId = -1;\r
- break;\r
- }\r
-\r
- case MotionEvent.ACTION_POINTER_UP: {\r
- final int pointerIndex = (action & MotionEvent.ACTION_POINTER_INDEX_MASK) >> MotionEvent.ACTION_POINTER_ID_SHIFT;\r
- final int pointerId = event.getPointerId(pointerIndex);\r
- if (pointerId == mActivePointerId) {\r
- // This was our active pointer going up. choose a new active pointer and adjust accordingly.\r
- final int newPointerIndex = pointerIndex ==0 ? 1:0;\r
- mLastTouchX = event.getX(newPointerIndex);\r
- mLastTouchY = event.getY(newPointerIndex);\r
- mActivePointerId = event.getPointerId(newPointerIndex);\r
- }\r
- break;\r
- }\r
- } \r
- return true;\r
- }\r
-\r
- private void zoom(float scale) {\r
- AndroidLogWrapper.d(BurnPlotFragment.class,"zoom by " + scale);\r
- float domainSpan = absMaxX - absMinX;\r
- AndroidLogWrapper.d(BurnPlotFragment.class,"domainSpan = " + domainSpan);\r
- float domainMidPoint = absMaxX - domainSpan / 2.0f;\r
- AndroidLogWrapper.d(BurnPlotFragment.class,"domainMidPoint = " + domainMidPoint);\r
- float offset = domainSpan / scale;\r
- AndroidLogWrapper.d(BurnPlotFragment.class,"offset " + offset);\r
- minXY.x=domainMidPoint- offset;\r
- AndroidLogWrapper.d(BurnPlotFragment.class,"min X " + minXY.x);\r
- maxXY.x=domainMidPoint+offset;\r
- AndroidLogWrapper.d(BurnPlotFragment.class,"max X " + maxXY.x);\r
- checkBoundaries();\r
- mySimpleXYPlot.setDomainBoundaries(minXY.x, maxXY.x, BoundaryMode.AUTO);\r
- mySimpleXYPlot.redraw();\r
- }\r
-\r
- private void scroll(float pan) {\r
- float domainSpan = maxXY.x - minXY.x;\r
- float step = domainSpan / mySimpleXYPlot.getWidth();\r
- float offset = pan * step;\r
- minXY.x+= offset;\r
- maxXY.x+= offset;\r
- checkBoundaries();\r
- mySimpleXYPlot.setDomainBoundaries(minXY.x, maxXY.x, BoundaryMode.AUTO);\r
- mySimpleXYPlot.redraw();\r
}\r
\r
- private void checkBoundaries() {\r
-\r
- if ( minXY.x < absMinX) \r
- minXY.x = absMinX;\r
- // else if ( minXY.x > maxNoError )\r
- // minXY.x = maxNoError;\r
-\r
- if ( maxXY.x > absMaxX)\r
- maxXY.x = absMaxX;\r
- // else if ( maxXY.x < minNoError)\r
- // maxXY.x = minNoError;\r
- }\r
- private class ScaleListener extends ScaleGestureDetector.SimpleOnScaleGestureListener {\r
- @Override\r
- public boolean onScale( ScaleGestureDetector detector ) {\r
- mScaleFactor *= detector.getScaleFactor();\r
-\r
- mScaleFactor = Math.max(1.0f, Math.min(mScaleFactor, 5.0f));\r
- zoom(mScaleFactor);\r
- return true;\r
- }\r
- }\r
}\r
\r