OnTouchListener()的onTouch(View v, MotionEvent event)事件以及按键onKeyDown()事件

以前没有太在意 touch(事件)返回值,今天写onTouch事件让控件随着手指移动时,发现 只执行了MotionEvent.ACTION_DOWN , MOVE和UP事件都没有执行,辗转反侧,发现是返回值得问题.

查看super.onTouch()是空的,所以就只有 true或false两种状态

当return false时,就是不消费事件,通知系统不关心这一次touch事件,事件会传给父容器,执行父容器的onTouch事件,这一次的touch事件之后发出的任何action,该View都不会再接受,onTouchEvent在这一次的touch事件中再也不会触发,也就是说一旦View返回false,那么之后的ACTION_MOVE,ACTION_UP等ACTION就不会在传入这个View,但是下一次touch事件的action还是会传进来的。

疑惑的是为什么return false时,会执行DOWN事件,

一个View的onTouch是否接收touch事件并进行处理是由这个view在接收到DOWN事件后没有返回的boolean值决定的。如果一个View的onTouch在接收到DOWN事件之后返回true这说明这个view要处理,后续的Touch事件都会继续传过来,如果返回false就说明不处理,后续的所有Touch事件都不会再传递下来。你在子View的OnTouch中接收到Move事件再返回false不会影响事件是否继续传递给子View。


按键事件

android的onKeyDown函数返回值是这个意思,假如你返回true就是告诉系统我已经对这个回调进行了处理了,不需要系统再处理了。但是你返回false就是告诉系统,我对这个回调做了处理,但是好像不完善,希望系统再帮我处理一下。比如你写这样一个函数
public boolean onKeyDown(int keyCode, KeyEvent event){ //截获按键事件 if(keyCode == KeyEvent.KEYCODE_BACK{//退出对话框 } } return false; }

你返回false那么依然会退出这个activity,就是系统调用的返回的处理。但是你要是返回true,那么就不会退出这个activity,就没有系统对返回的处理。

 当然也有例外的情况

onTouch()返回false时,ACTION_MOVE,ACTION_UP事件都执行了,那是因为你设置了点击事件,或者默认控件的Clickable为true。

比如ImageView 默认Clickable为false 与 ImageButton、button等默认Clickable为true


你可能感兴趣的:(Android)