您的位置:首页 > 移动开发 > Android开发

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;

}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: