【问题标题】:I need to make my app support pinch zoom, but not double tap我需要让我的应用程序支持捏缩放,但不支持双击
【发布时间】:2017-07-21 13:30:24
【问题描述】:

这是我为 onTouchListener 编写的代码:

if(event.getAction() == MotionEvent.ACTION_UP) {
                Log.i("", "double touch  : " + timeLastTouch + "... time passed: " + (System.currentTimeMillis() - timeLastTouch));
                if (System.currentTimeMillis() - timeLastTouch < 500) {
                    Log.i("", "double touch TRUE");
                    timeLastTouch = System.currentTimeMillis();
                    return true;
                } else {
                    Log.i("", "double touch FALSE");
                    timeLastTouch = System.currentTimeMillis();
                    return false;
                }
            }else if(event.getAction() == MotionEvent.ACTION_DOWN) {
                Log.i("", "double touch DOWN : " + timeLastTouch + "... time passed: " + (System.currentTimeMillis() - timeLastTouch));
                if (System.currentTimeMillis() - timeLastTouch < 500) {
                    Log.i("", "double touch TRUE DOWN");
                    timeLastTouch = System.currentTimeMillis();
                    return true;
                }else {
                    Log.i("", "double touch FALSE DOWN");
                    return false;
                }
            }else {
                timeLastTouch = System.currentTimeMillis();
                Log.i("","double touch ELSE FALSE");
                return false;
            }

但它不起作用。 此视图位于 Surface 视图之上。现在我只需要将事件发送到 SurfaceView 进行捏合(捏合缩放) 现在我尝试制定逻辑,如果它有双重触摸,那么我返回 true(它已经消耗了触摸,所以表面视图没有触摸)。 但是如果我这样做,缩放缩放也不起作用。 如果我删除这个逻辑,捏缩放,工作,所以我添加了一些日志,并遵循它们。我注意到,对于捏缩放,您会得到 2 个向下事件,并且仅在调用 ACTION_MOVE 之后。大概是因为当你捏缩放时,你放下2根手指,然后缩放。我的问题是我的代码正在设置它,以便第二个 Action_down 消耗触摸,这意味着缩放缩放不会开始。任何想法如何解决这个问题?

【问题讨论】:

  • 你可能想看看existing pinch implementations,看看他们是怎么做的。
  • 好吧,我不需要实现捏合逻辑。已经存在。在我的观点下方的观点上。我想要的只是让我的视图消耗双击的触摸,而不是捏。 (记录 event.action)返回:0 0 1 (action_down, action_down, action_up) 用于双击,返回 0 0 2/1 (action_down, action_down, move or up) 用于捏合。因此我的问题。原因 如果我阻止了第二个 Action_down 事件,我将无法进行缩放。如果我不阻止它,它就会被发送到下一个视图,而这绝不能发生
  • 因此,在调用“移动”的 MotionEvent 之前,我需要一个逻辑来知道何时发生捏合缩放。我尝试使用 event.getIndexCounter() 或检查它是否是多点触控,但它只为我返回 1

标签: android ontouchlistener touch-event pinchzoom motionevent


【解决方案1】:

我确实做到了,逻辑如下:

viewTop.setOnTouchListener(new View.OnTouchListener() {
        @Override
        public boolean onTouch(View v, MotionEvent event) {
            Log.i("","double touch event action: ===========================");
            Log.i("","double touch event action:" + event.getAction());
            if(event.getAction() == MotionEvent.ACTION_DOWN) {
                Log.i("", "double touch DOWN : " + timeLastTouch + "... time passed: " + (System.currentTimeMillis() - timeLastTouch) + "..... location diff: " + (event.getX() - xLastTouch));
                if (System.currentTimeMillis() - timeLastTouch < 1000 && Math.abs(event.getX() - xLastTouch) < 150 && Math.abs(event.getY() - yLastTouch) < 150) {
                    Log.i("", "double touch TRUE DOWN");
                    timeLastTouch = System.currentTimeMillis();
                    xLastTouch = event.getX();
                    yLastTouch = event.getY();
                    return true;
                } else {
                    timeLastTouch = System.currentTimeMillis();
                    xLastTouch = event.getX();
                    yLastTouch = event.getY();
                    Log.i("", "double touch FALSE DOWN");
                    return false;
                }
            }else if(event.getAction() == MotionEvent.ACTION_UP) {
                timeLastTouch = System.currentTimeMillis();
                xLastTouch = -1f;
                yLastTouch = -1f;
                return false;
            }else {
                timeLastTouch = System.currentTimeMillis();
                xLastTouch = event.getX();
                yLastTouch = event.getY();
                Log.i("","double touch ELSE FALSE");
                return false;
            }
        }
    });

但是如果我双击,第二次点击在另一个地方,它就会发生。对此不太满意,所以我需要对此进行更多研究,所以我还不会接受这个答案。在夹点调用 action_move 之前,我不知何故需要知道我是否消耗了第二个 Action_Down。

【讨论】:

    猜你喜欢
    • 2014-06-14
    • 2012-05-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-25
    • 1970-01-01
    相关资源
    最近更新 更多