【问题标题】:Move View on Touch and react on click?在触摸时移动视图并在点击时做出反应?
【发布时间】:2015-02-04 18:10:36
【问题描述】:

我创建了一个可以拖动的视图。这是我的来源:

imageView.setOnTouchListener(new View.OnTouchListener() {

        private int initialX;
        private int initialY;
        private float initialTouchX;
        private float initialTouchY;

        @Override
        public boolean onTouch(View v, MotionEvent event) {
            switch(event.getAction()) {
                case MotionEvent.ACTION_DOWN:
                    initialX = params.x;
                    initialY = params.y;
                    initialTouchX = event.getRawX();
                    initialTouchY = event.getRawY();
                    return true;
                case MotionEvent.ACTION_UP:
                    return true;
                case MotionEvent.ACTION_MOVE:
                    params.x = initialX + (int)(event.getRawX()-initialTouchX);
                    params.y = initialY + (int)(event.getRawY()-initialTouchY);
                    windowManager.updateViewLayout(imageView, params);
                    return true;
            }
            return false;
        }
    });

如您所见,通过触摸 imageview 并四处平移,视图本身会移动。现在我的问题是,我想区分移动视图和实际单击视图。我已经尝试了 stackoverflow 上显示的多种方法,但找不到任何解决我问题的方法。

如果图像视图被点击,它应该调用一个方法。否则,如果只是触摸移动视图,则不应调用该方法。

有人给点建议吗?

提前致谢

【问题讨论】:

    标签: android ontouchlistener touch-event


    【解决方案1】:

    当你的ACTION_UP 事件发生时,你想返回false,否则OnClickListener 不会被调用,因为你告诉系统你已经处理了那个触摸事件。

    您可能还想在您的第一个ACTION_DOWN 事件中获取并保存System.currentTimeMillis(),然后,仅当ACTION_UP 事件发生在代表点击的阈值时间之前才返回false。

    【讨论】:

    • 谢谢,我去看看
    • 告诉我进展如何
    【解决方案2】:

    我通过添加@ChrisMcJava 的想法和一些进一步的调整解决了我的问题:

    imageView.setOnTouchListener(new View.OnTouchListener() {
    
            private int initialX;
            private int initialY;
            private float initialTouchX;
            private float initialTouchY;
            private long time;
            private boolean hasMoved = false;
    
            @Override
            public boolean onTouch(View v, MotionEvent event) {
                switch(event.getAction()) {
                    case MotionEvent.ACTION_DOWN:
                        initialX = params.x;
                        initialY = params.y;
                        initialTouchX = event.getRawX();
                        initialTouchY = event.getRawY();
                        time = System.nanoTime();
                        hasMoved = false;
                        return true;
                    case MotionEvent.ACTION_UP:
                        if(System.nanoTime() - time < 1000000000  && !hasMoved) {
                            Toast.makeText(getApplicationContext(), "Click", Toast.LENGTH_SHORT).show();
                        }
                        return false;
                    case MotionEvent.ACTION_MOVE:
                        if(Math.pow(initialTouchX - (int)event.getRawX(), 2) > Math.pow(5, 2) || Math.pow(initialTouchY - (int)event.getRawY(), 2) > Math.pow(5, 2)) {
                            hasMoved = true;
                        }
                        params.x = initialX + (int)(event.getRawX()-initialTouchX);
                        params.y = initialY + (int)(event.getRawY()-initialTouchY);
                        windowManager.updateViewLayout(imageView, params);
                        return true;
                }
                return false;
            }
        });
    

    如您所见,点击不仅取决于它被点击的时间,还取决于视图是否被移动。我已经建立了移动 5px 和 1 秒的容差,这意味着: 如果按钮的按住时间小于或等于 1 秒,并且按钮的拖动距离不超过 5 像素,则为点击。

    感谢您的建议

    【讨论】:

      【解决方案3】:

      如下更新 ACTION_UP 案例:

      case MotionEvent.ACTION_UP:
      
                           if( (Math.abs(initialTouchX - event.getRawX())<5) && (Math.abs(initialTouchY - event.getRawY())<5) )
                           {
                               Log.e(TAG,"It's a click ! ");
      
      
                           }else{
                               Log.e(TAG,"you moved the head");
      
                           }
      
      
                           return true;
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-03-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-10-02
        相关资源
        最近更新 更多