Android MultiTouch 多点触控

演示效果

  • demo实现第一、二个触控点的坐标记录及绘制展示


    Android MultiTouch 多点触控_第1张图片
    e47k6-a128q.gif

多点触控操作判断的值

名称 简介
pointerId 该值从按下到抬起是固定的,用于判断具体的触控点,通过getPointerId(int pointerIndex)方法获得
pointerIndex 该值相当于数组中的下标,多个点按下时,抬起点之后的pointerIndex值会重置,用于获取多点的坐标等值,ACTION_DOWNACTION_UPACTION_POINTER_DOWNACTION_POINTER_UP事件中可通过getActionIndex()方法获得,也可通过findPointerIndex(int pointerId)方法获得

关键代码

    //第一个点的坐标
    private Point mPointer1;
    //第二个点的坐标
    private Point mPointer2;

    @Override
    protected void onDraw(Canvas canvas) {
        //第一个点不为空则在坐标位置画一个红色的圆
        if (mPointer1 != null) {
            Paint paint = new Paint();
            paint.setColor(Color.RED);
            canvas.drawCircle(mPointer1.x, mPointer1.y, 100, paint);
        }
        //第二个点不为空则在坐标位置画一个黄色的圆
        if (mPointer2 != null) {
            Paint paint = new Paint();
            paint.setColor(Color.YELLOW);
            canvas.drawCircle(mPointer2.x, mPointer2.y, 100, paint);
        }
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        int pointerId = event.getPointerId(event.getActionIndex());
        switch (event.getActionMasked()) {
            case MotionEvent.ACTION_DOWN:
                // 处理按下事件 第一个点按下时会触发
                handleTouchDown(event, pointerId);
                break;
            case MotionEvent.ACTION_UP:
                // 处理抬起事件 最后一个点抬起时会触发,抬起后将点都置为null
                mPointer1 = null;
                mPointer2 = null;
                break;
            case MotionEvent.ACTION_POINTER_DOWN:
                // 处理按下事件 非第一个点按下时会触发
                handleTouchDown(event, pointerId);
                break;
            case MotionEvent.ACTION_POINTER_UP:
                // 处理抬起事件 非最后一个点抬起时会触发
                handleTouchUp(pointerId);
                break;
            case MotionEvent.ACTION_CANCEL:
                // 事件取消时会被触发
                handleTouchUp(pointerId);
                break;
            case MotionEvent.ACTION_MOVE:
                // 触控滑动时触发
                handleTouchMove(event);
                break;
        }
        // 重新绘制
        invalidate();
        return true;
    }

    private void handleTouchMove(MotionEvent event) {
        int pointerId;
        // Move事件无法直接获得pointerIndex 直接通过遍历获得
        int count = event.getPointerCount();
        for (int i = 0; i < count; i++) {
            // 通过pointerIndex 获得pointerId 
            pointerId = event.getPointerId(i);
            // 通过pointerId 判断是哪个点
            switch (pointerId) {
                case 0:
                    mPointer1.set((int) event.getX(i), (int) event.getY(i));
                    break;
                case 1:
                    mPointer2.set((int) event.getX(i), (int) event.getY(i));
                    break;
            }
        }
    }

    private void handleTouchUp(int pointerId) {
        //判断抬起的点 清楚记录数据
        switch (pointerId) {
            case 0:
                mPointer1 = null;
                break;
            case 1:
                mPointer2 = null;
                break;
        }
    }

    private void handleTouchDown(MotionEvent event, int pointerId) {
        int pointerIndex = event.findPointerIndex(pointerId);
        //判断按下的点 记录相应的点
        switch (pointerId) {
            case 0:
                mPointer1 = new Point((int) event.getX(pointerIndex), (int) event.getY(pointerIndex));
                break;
            case 1:
                mPointer2 = new Point((int) event.getX(pointerIndex), (int) event.getY(pointerIndex));
                break;
        }
    }

你可能感兴趣的:(Android MultiTouch 多点触控)