触摸时移动视图并在点击时做出反应?

时间:2015-02-04 18:10:37

标签: android ontouchlistener ontouchevent

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

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;
        }
    });

正如您所看到的,通过触摸图像视图并平移,视图本身会移动。现在我的问题是,我想在移动视图和实际点击视图之间进行区分。我已经尝试了stackoverflow上显示的多个方法,但找不到任何能解决我问题的方法。

如果点击了imageview,它应该调用一个方法。否则,如果仅触摸移动视图,则不应调用该方法。

有人有建议吗?

提前致谢

3 个答案:

答案 0 :(得分:2)

当您发生ACTION_UP事件时,您希望返回false,否则OnClickListener不会被调用,因为您告诉系统您已处理该触摸事件。

您可能还希望在第一个System.currentTimeMillis()事件中获取并保存ACTION_DOWN,然后,如果ACTION_UP事件在表示点击的阈值时间之前出现,则仅返回false。

答案 1 :(得分:1)

我通过添加@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秒并且按钮没有被拖动超过5px,则只需点击一下。

感谢您的建议

答案 2 :(得分:0)

更新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;