android事件传递
2016-02-27 14:31
399 查看
本文部分摘自:http://www.xuebuyuan.com/1588148.html
onInterceptTouchEvent()用于处理事件并改变事件的传递方向。返回值为false时事件会传递给子控件的onInterceptTouchEvent();
返回值为true时事件会传递给当前控件的onTouchEvent(),而不在传递给子控件,这就是所谓的Intercept(截断)。
onTouchEvent() 用于处理事件,返回值决定当前控件是否消费(consume)了这个事件。可能你要问是否消费了又区别吗,反正我已经针对事件编写了处理代码?答案是有区别!比如ACTION_MOVE或者ACTION_UP发生的前提是一定曾经发生了ACTION_DOWN,如果你没有消费ACTION_DOWN,那么系统会认为ACTION_DOWN没有发生过,所以ACTION_MOVE或者ACTION_UP就不能被捕获。
由于onInterceptTouchEvent()的机制比较复杂,上面的说明写的也比较复杂,总结一下,基本的规则是:
1. down事件首先会传递到onInterceptTouchEvent()方法
2. 如果该ViewGroup的onInterceptTouchEvent()在接收到down事件处理完成之后return false,那么后续的move, up等事件将继续会先传递给该ViewGroup,之后才和down事件一样传递给最终的目标view的onTouchEvent()处理。
3. 如果该ViewGroup的onInterceptTouchEvent()在接收到down事件处理完成之后return true,那么后续的move, up等事件将不再传递给onInterceptTouchEvent(),而是和down事件一样传递给该ViewGroup的onTouchEvent()处理,注意,目标view将接收不到任何事件。
4. 如果最终需要处理事件的view的onTouchEvent()返回了false,那么该事件将被传递至其上一层次的view的onTouchEvent()处理。
5. 如果最终需要处理事件的view 的onTouchEvent()返回了true,那么后续事件将可以继续传递给该view的onTouchEvent()处理。
//setOnTouchListener先于onTouchEvent执行,若setOnTouchListener返回false才会调用onTouchEvent,反之不调用。
android中onTouchEvent和setOnTouchListener中onTouch的区别可以有些人并不了解,其实要说明白这个问题先要说下android的事件传递机制。首先看下以下的代码1,这段代码反应了View处理事件的过程:
代码1:
public boolean dispatchTouchEvent(MotionEvent event) {
if (mOnTouchListener != null && mOnTouchListener.onTouch(this, event)) {
return true;
}
return onTouchEvent(event);
}
在代码1中有一点首先需要明确:
1、如果dispatchTouchEvent返回值为true则本次事件被系统消耗掉(就是被控件处理了), 然后一个新的事件会被传入(如down事件返回true,则后续的move、up等事件也将被系统传入进行处理,否则move、up等事件不会响应);
2、如果dispatchTouchEvent返回值为false,则不会有新的事件被传入。
好,明白了这一点再看那个代码1中if语句后面的条件mOnTouchListener != null && mOnTouchListener.onTouch(this, event),mOnTouchListener 对象其实不就是你写的监听器对象吗?
比如下面代码2的这个匿名对象。
代码2:
xxxView.setOnTouchListener(new OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
return true;
}
});
好,我们再看下代码2中onTouch事件中的返回值:
1、如果代码2 return true则代表代码1中将不会执行 return onTouchEvent(event);语句,这也就是说这次系统事件会被消耗掉,将会再次执行dispatchTouchEvent这个方法。
2、如果代码2 return false则代表代码1会执行onTouchEvent(event);这个方法,本次事件是否会被消耗掉将取决于onTouchEvent的返回值。
总结:
1、如果setOnTouchListener中的onTouch方法返回值是true则onTouchEvent方法将不会被执行;
2、只有当setOnTouchListener中的onTouch方法返回值是false时onTouchEvent方法才被执行。
3、以上说的情况适用于View对象而不是ViewGroup对象
eg://禁止滑动的viewPager
public class MyViewPager extends ViewPager {
private boolean isPaggingEnabled = false;
// 使用说明×××××××××××××××××××××
// ViewPager.setScrollable(false);
// viewPager.setOnTouchListener(new OnTouchListener() {
//
// @Override
// public boolean onTouch(View arg0, MotionEvent arg1) {
// // TODO Auto-generated method stub
// return true;
// }
// });
public MyViewPager(Context context, AttributeSet attrs) {
super(context, attrs);
}
@Override
public boolean onTouchEvent(MotionEvent arg0) {
// return this.isPaggingEnabled && super.onTouchEvent(arg0);
return true;
}
@Override
public boolean onInterceptTouchEvent(MotionEvent arg0) {
// return this.isPaggingEnabled && super.onInterceptTouchEvent(arg0);
// 一律不拦截事件
return false;
}
public void setScrollable(boolean isScrollable) {
this.isPaggingEnabled = isScrollable;
}
}
onInterceptTouchEvent()用于处理事件并改变事件的传递方向。返回值为false时事件会传递给子控件的onInterceptTouchEvent();
返回值为true时事件会传递给当前控件的onTouchEvent(),而不在传递给子控件,这就是所谓的Intercept(截断)。
onTouchEvent() 用于处理事件,返回值决定当前控件是否消费(consume)了这个事件。可能你要问是否消费了又区别吗,反正我已经针对事件编写了处理代码?答案是有区别!比如ACTION_MOVE或者ACTION_UP发生的前提是一定曾经发生了ACTION_DOWN,如果你没有消费ACTION_DOWN,那么系统会认为ACTION_DOWN没有发生过,所以ACTION_MOVE或者ACTION_UP就不能被捕获。
由于onInterceptTouchEvent()的机制比较复杂,上面的说明写的也比较复杂,总结一下,基本的规则是:
1. down事件首先会传递到onInterceptTouchEvent()方法
2. 如果该ViewGroup的onInterceptTouchEvent()在接收到down事件处理完成之后return false,那么后续的move, up等事件将继续会先传递给该ViewGroup,之后才和down事件一样传递给最终的目标view的onTouchEvent()处理。
3. 如果该ViewGroup的onInterceptTouchEvent()在接收到down事件处理完成之后return true,那么后续的move, up等事件将不再传递给onInterceptTouchEvent(),而是和down事件一样传递给该ViewGroup的onTouchEvent()处理,注意,目标view将接收不到任何事件。
4. 如果最终需要处理事件的view的onTouchEvent()返回了false,那么该事件将被传递至其上一层次的view的onTouchEvent()处理。
5. 如果最终需要处理事件的view 的onTouchEvent()返回了true,那么后续事件将可以继续传递给该view的onTouchEvent()处理。
//setOnTouchListener先于onTouchEvent执行,若setOnTouchListener返回false才会调用onTouchEvent,反之不调用。
android中onTouchEvent和setOnTouchListener中onTouch的区别可以有些人并不了解,其实要说明白这个问题先要说下android的事件传递机制。首先看下以下的代码1,这段代码反应了View处理事件的过程:
代码1:
public boolean dispatchTouchEvent(MotionEvent event) {
if (mOnTouchListener != null && mOnTouchListener.onTouch(this, event)) {
return true;
}
return onTouchEvent(event);
}
在代码1中有一点首先需要明确:
1、如果dispatchTouchEvent返回值为true则本次事件被系统消耗掉(就是被控件处理了), 然后一个新的事件会被传入(如down事件返回true,则后续的move、up等事件也将被系统传入进行处理,否则move、up等事件不会响应);
2、如果dispatchTouchEvent返回值为false,则不会有新的事件被传入。
好,明白了这一点再看那个代码1中if语句后面的条件mOnTouchListener != null && mOnTouchListener.onTouch(this, event),mOnTouchListener 对象其实不就是你写的监听器对象吗?
比如下面代码2的这个匿名对象。
代码2:
xxxView.setOnTouchListener(new OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
return true;
}
});
好,我们再看下代码2中onTouch事件中的返回值:
1、如果代码2 return true则代表代码1中将不会执行 return onTouchEvent(event);语句,这也就是说这次系统事件会被消耗掉,将会再次执行dispatchTouchEvent这个方法。
2、如果代码2 return false则代表代码1会执行onTouchEvent(event);这个方法,本次事件是否会被消耗掉将取决于onTouchEvent的返回值。
总结:
1、如果setOnTouchListener中的onTouch方法返回值是true则onTouchEvent方法将不会被执行;
2、只有当setOnTouchListener中的onTouch方法返回值是false时onTouchEvent方法才被执行。
3、以上说的情况适用于View对象而不是ViewGroup对象
eg://禁止滑动的viewPager
public class MyViewPager extends ViewPager {
private boolean isPaggingEnabled = false;
// 使用说明×××××××××××××××××××××
// ViewPager.setScrollable(false);
// viewPager.setOnTouchListener(new OnTouchListener() {
//
// @Override
// public boolean onTouch(View arg0, MotionEvent arg1) {
// // TODO Auto-generated method stub
// return true;
// }
// });
public MyViewPager(Context context, AttributeSet attrs) {
super(context, attrs);
}
@Override
public boolean onTouchEvent(MotionEvent arg0) {
// return this.isPaggingEnabled && super.onTouchEvent(arg0);
return true;
}
@Override
public boolean onInterceptTouchEvent(MotionEvent arg0) {
// return this.isPaggingEnabled && super.onInterceptTouchEvent(arg0);
// 一律不拦截事件
return false;
}
public void setScrollable(boolean isScrollable) {
this.isPaggingEnabled = isScrollable;
}
}
相关文章推荐
- Android开发之PullToRefresh的Click点击事件的监听实现长按删除Item
- JNI开发的常见错误&&Android.mk文件说明&& jni开发的简便流程
- Android ContentProvider和Uri详解
- 安卓项目集成facebook-android-sdk 4.0版本
- Android Studio 各种快捷键
- PhoneGap或者Cordova框架下实现Html5中JS调用Android原生代码
- Android-----declare-styleable
- declare-styleable中format详解
- Android之ListView
- Android Studio快捷键【Android学习入门】
- android popwindow和dialog的取舍
- 第3章 Android Dalvik虚拟机 第三节(下)
- 2016/2/26Android实习笔记(Android签名和aapt)
- Ubuntu下更新android sdk(sdk manager没有Tools选项)
- Android 使用Intent和Bundle传递数据及如何传递enum
- android简单的自定义动画
- Android--自定义视图控件(一)(Android Studio)
- 解决Activity启动黑屏及设置android:windowIsTranslucent不兼容activity切换动画问题
- Android 日期格式化
- Android Studio如何快速生成get,set,tostring,构造函数