Android MultiTouch 多点触控

演示效果

  • 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;
        }
    }
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 很多人私信告诉我,很喜欢我们first dance的镜头,希望多了解一下如何在婚礼中加入这个元素。今天和大家分享一...
    Vera_TheVows阅读 2,789评论 0 2
  • 2018年04月01日 晴 星期日 今天虽是晴天,整个世界却被雾霾笼罩着。最近这时好时坏的天气,犹如我这心情一般。...
    88e0f11044fa阅读 413评论 1 6
  • 2017年3月22日零时一刻,我的乖儿子松松走了!他才16岁!花一样的年龄!他到天堂去了!那里没有病疼的折磨!只有...
    闲度阅读 262评论 1 1
  • 我的
    二十八画后生阅读 174评论 0 0
  • 文/凉月西风 正月十七,开学第一天。 因为正月十三已经开过预备会,今天按照要求七点半就到学了。 学生还是狗年的学生...
    凉月西风阅读 278评论 2 6