关于Android触控事件的讲解已经有很多了,相信大家很容易找到,我就不介绍基本概念,只是网上大部分代码都是复制黏贴,而且介绍的也不全,这里就直接贴上我的Demo,展示了如何运用触摸事件的Up、Down和Move事件获取各个触控点的坐标,至于如何运用这些坐标,大家可以自己扩展。
public class MoveView extends View { private boolean isDrawCircle; private Paint paint; private float radius; private static float DEFAULT_RADIUS = 100; //保存触摸点的坐标集合 private List<PointF> list; public MoveView(Context context) { super(context); init(context); } public MoveView(Context context, AttributeSet attrs) { super(context, attrs); init(context); } public MoveView(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); init(context); } @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); if (isDrawCircle && list != null) { for (int i = 0; i < list.size(); i++) { PointF pointF = list.get(i); canvas.drawCircle(pointF.x, pointF.y, radius, paint); } } } private void init(Context context) { paint = new Paint(); paint.setColor(Color.RED); paint.setStyle(Paint.Style.FILL); DisplayMetrics displayMetrics = context.getResources().getDisplayMetrics(); radius = displayMetrics.density * DEFAULT_RADIUS + 0.5F; } @Override public boolean onTouchEvent(MotionEvent event) { int actionIndex = event.getActionIndex(); float x = event.getX(actionIndex); float y = event.getY(actionIndex); //根据触摸事件修改触摸点集合 switch (event.getActionMasked()) { case MotionEvent.ACTION_DOWN: isDrawCircle = true; list = new ArrayList<>(); PointF point = new PointF(x, y); list.add(point); break; case MotionEvent.ACTION_MOVE: for (int i = 0; i < event.getPointerCount(); i++) { x=event.getX(i); y=event.getY(i); list.get(i).set(x, y); } break; case MotionEvent.ACTION_UP: list.clear(); isDrawCircle = false; break; case MotionEvent.ACTION_POINTER_DOWN: point = new PointF(x, y); list.add(point); break; case MotionEvent.ACTION_POINTER_UP: list.remove(actionIndex); break; } invalidate(); return true; } }这是一个支持多点触摸的控件,可以跟随手指的移动绘制圆点,大家可以放到自己的xml布局里试试效果。
