美文网首页
Android MultiTouch 多点触控

Android MultiTouch 多点触控

作者: _年少 | 来源:发表于2019-08-20 00:13 被阅读0次

    演示效果

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


      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 多点触控

          本文链接:https://www.haomeiwen.com/subject/tbuysctx.html