Android中onTouch事件、onClick事件、onLongClick事件区别以及联系

来源:互联网 发布:如何清空淘宝收藏夹 编辑:程序博客网 时间:2024/06/05 07:04

前不久,需要做一个效果。大概是这样的:监听ImageView,如果是短点击,则触发响应的点击事件;如果是滑动或者长点击,则改变该图片的src。具体就是这样。于是,很容易想到监听ImageView的onTouch和onClick事件。然而,发现问题,onTouch和onClick是怎么才能共存的?

分析:

1、手指按在屏幕:首先会触发onTouch的down事件;

2、判断onTouch事件的返回值:

如果return false,而且按下的时间比较长,则会触发onLongClick事件,然后触发up事件,最后触发onClick事件;

如果return true,则不会触发onLongClick事件和onClick事件,直接触发up事件。

说明:

(1)如果onLongClick返回true,表示该事件在此被消费,不会再触发onClick事件。

(2)由此可见,在事件返回值中,return true表示事件在此被消费,不再继续传递;return false表示事件仍然继续传递。

继续分析:

判断onTouch事件的返回值:

(1)手指按在屏幕,首先触发onTouch的down事件;

(2)判断onTouch事件中down和up事件的返回值:

如果down事件返回true,up事件返回false;则不会触发onLongClick和onClick事件,直接触发up事件。

如果up事件返回false,down事件返回true;分两种情况:

长按,触发onLongClick事件,然后是onTouch事件的up事件发生,完毕。
短按,先触发onTouch的up事件, 到一定时间后,自动触发onLongClick事件。

可见:如果up返回false,down事件返回true,无论如何不执行onClick事件。

事件分析:

1、给同一个View设置了OnTouchEvent事件、OnClickListener事件与OnLongClickListener事件,当点击View的时候,事件的响应顺序是:
Touch事件的ACTION_DOWN -> ACTION_UP -> OnClick/OnLongClick。
该View是怎么响应这个点击动作的呢?
首先,该View会先响应ACTION_DOWN事件,并返回一个boolean值,这里有两种判断:
a:返回True,表示该View接受此按下动作,就是说这个点击动作的按下操作被中止,然后就是响应ACTION_UP事件。点击动作的按下操作被ACTION_DOWN接受之后就结束了,所以之后的OnClick/OnLongClick事件就不会响应了。
b:返回false,表示该View不接受此按下动作,响应完之后,按下操作继续往下发,之后是响应ACTION_UP事件,这里又有一个判断:
如果ACTION_UP事件返回True,表示ACTION_UP接受松开操作,松开操作中止;View会一直处于按下状态,之后View便会响应OnLongClick事件。
如果ACTION_UP事件返回false,表示ACTION_UP不接收松开操作,松开操作继续下发;因为按下与松开操作都没有被中止,所以之后View就会响应OnClick事件。
解决思路:
mIvLauncher.setOnTouchListener(new OnTouchListener() {            @Override            public boolean onTouch(View v, MotionEvent event) {                               switch (event.getAction()) {                    case MotionEvent.ACTION_DOWN:                        firstX = event.getX();                        firstY = event.getY();                        return true;                    case MotionEvent.ACTION_MOVE:                        break;                    case MotionEvent.ACTION_UP:                        float secondX = event.getX();                        float secondY = event.getY();                        if (Math.abs(secondX - firstX) < 5 && Math.abs(secondY - firstY) < 5) {                            Toast.makeText(MainActivity.this, "点击事件", Toast.LENGTH_SHORT).show();                        } else {                            Toast.makeText(MainActivity.this, "触摸滑动事件", Toast.LENGTH_SHORT).show();                        }                        break;                    default:                        break;                }                return false;            }        });
通过手指在屏幕上滑动的距离判断该事件是滑动事件还是点击事件,在此处理响应的逻辑。


0 0