android多点触摸实例及疑问
多点触摸的一个比较简明的示例:
示例代码出处:http://krvarma-android-samples.googlecode.com/svn/trunk/multitouchsample
在学习此示例的时候发现multitouch最多可以处理5个手指,5个以上的则不能处理~~
package com.varma.samples.multitouchsample; import java.util.ArrayList; import android.content.Context; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.DashPathEffect; import android.graphics.Paint; import android.graphics.PointF; import android.util.AttributeSet; //import android.util.FloatMath; import android.view.MotionEvent; import android.view.View; public class MultitouchView extends View { private static final int STROKE_WIDTH = 1; private static final int CIRCLE_RADIUS = 20; private ArrayList<PointF> touchPoints = null; private Paint drawingPaint = null; private boolean isMultiTouch = false; private int pathEffectPhase = 0; public MultitouchView(Context context) { super(context); initialize(context); } public MultitouchView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); initialize(context); } public MultitouchView(Context context, AttributeSet attrs) { super(context, attrs); initialize(context); } @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); if(touchPoints.size() > 0) { DashPathEffect effect = new DashPathEffect(new float[] {7,7}, pathEffectPhase); PointF midpt = null; drawingPaint.setPathEffect(effect); for(int index=1; index<touchPoints.size(); ++index) { midpt = getMidPoint( touchPoints.get(index - 1).x,touchPoints.get(index - 1).y, touchPoints.get(index).x,touchPoints.get(index).y); canvas.drawCircle( touchPoints.get(index - 1).x,touchPoints.get(index - 1).y, 1, drawingPaint); canvas.drawCircle( touchPoints.get(index - 1).x,touchPoints.get(index - 1).y, CIRCLE_RADIUS, drawingPaint); canvas.drawCircle(touchPoints.get(index).x,touchPoints.get(index).y, 1, drawingPaint); canvas.drawCircle(touchPoints.get(index).x,touchPoints.get(index).y, CIRCLE_RADIUS, drawingPaint); canvas.drawLine( touchPoints.get(index - 1).x,touchPoints.get(index - 1).y, touchPoints.get(index).x,touchPoints.get(index).y, drawingPaint); canvas.drawCircle(midpt.x,midpt.y, 10, drawingPaint); } ++pathEffectPhase; invalidate(); } } @Override public boolean onTouchEvent(MotionEvent event) { super.onTouchEvent(event); int action = event.getAction() & MotionEvent.ACTION_MASK; switch(action) { case MotionEvent.ACTION_DOWN: { invalidate(); break; } case MotionEvent.ACTION_POINTER_DOWN: { isMultiTouch = true; setPoints(event); invalidate(); break; } case MotionEvent.ACTION_POINTER_UP: { isMultiTouch = false; break; } case MotionEvent.ACTION_MOVE: { if(isMultiTouch) { setPoints(event); invalidate(); } break; } } return true; } private void initialize(Context context){ drawingPaint = new Paint(); drawingPaint.setColor(Color.RED); drawingPaint.setStrokeWidth(STROKE_WIDTH); drawingPaint.setStyle(Paint.Style.STROKE); drawingPaint.setAntiAlias(true); touchPoints = new ArrayList<PointF>(); } public void setPoints(MotionEvent event){ touchPoints.clear(); int pointerIndex = 0; for(int index=0; index<event.getPointerCount(); ++index) { pointerIndex = event.getPointerId(index); touchPoints.add(new PointF(event.getX(pointerIndex),event.getY(pointerIndex))); } } private PointF getMidPoint(float x1,float y1, float x2, float y2) { PointF point = new PointF(); float x = x1 + x2; float y = y1 + y2; point.set(x / 2, y / 2); return point; } }
示例图:
相关推荐
ECSHOP专属建设 2020-11-13
xzjforDream 2020-09-23
fenggit 2020-09-15
起点 2020-08-17
leehbhs 2020-07-26
leehbhs 2020-07-04
pub_svnserve.conf的 pub_authz.conf的配置文件有非法字符的原因引起,需要查找pub_authz.conf提的非法内容比如多余的空格删除或直接将pub_authz.conf
起点 2020-06-28
leehbhs 2020-06-20
dingqinghu 2020-06-16
dengweijunkedafu 2020-06-09
nebulali 2020-05-27
起点 2020-05-10
起点 2020-05-05
83520298 2020-05-04