遇到一个 界面滑动的问题,在边界范围执行不了本app的操作, 在本模块中的,当前activity的 最上层父布局进行测试,未进入 onTouch
一开始以为是驱动的问题, 后来结果发现是 framework 层拦截了, 这里就需要对 android framework touch事件分发 以及 android Window 的布局层级比较清楚了
单手指操作:ACTION_DOWN—ACTION_MOVE—-ACTION_UP
多手指操作:ACTION_DOWN—ACTION_POINTER_DOWN—ACTION_MOVE–ACTION_POINTER_UP—ACTION_UP.
在dispathTouchEvent的源码里可以看到,如果 在这里,专门搜集了一些资料
无论是dispatchTouchEvent还是onTouchEvent,如果返回true表示这个事件已经被消费、处理了,不再往下传了。
如果希望一个View只onTouch而不onClick,在onTouch里return true就ok了。
dispatch是为了onTouch监听,onTouchEvent是为了onClick监听。
// dispatchTouchEvent 方法的源码 会调用 onTouchEvent表示执行事件
public boolean dispatchTouchEvent(MotionEvent event) {
if (mInputEventConsistencyVerifier != null) {
mInputEventConsistencyVerifier.onTouchEvent(event, 0);
}
if (onFilterTouchEventForSecurity(event)) {
//noinspection SimplifiableIfStatement
ListenerInfo li = mListenerInfo;
if (li != null && li.mOnTouchListener != null && (mViewFlags & ENABLED_MASK) == ENABLED
&& li.mOnTouchListener.onTouch(this, event)) {
return true;
}
if (onTouchEvent(event)) {
return true;
}
}
if (mInputEventConsistencyVerifier != null) {
mInputEventConsistencyVerifier.onUnhandledEvent(event, 0);
}
return false;
}
问题的引起是因为
/frameworks/base/core/java/com/android/internal/policy/DecorView.java
//源码
@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
final Window.Callback cb = mWindow.getCallback();
return cb != null && !mWindow.isDestroyed() && mFeatureId < 0
? cb.dispatchTouchEvent(ev) : super.dispatchTouchEvent(ev);
}
//DecorView 作为我们app的最顶层的view ,此方法是事件分发的方法 —–默认 return false , return true 就不向下分发了
@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
final Window.Callback cb = mWindow.getCallback();
if(ev.getAction() == MotionEvent.ACTION_DOWN){
mTouchDownY = ev.getY();
}
return mHasNavigationBar && (xxxxxx ) mTouchDownY > (getHeight() - 30) ? true : —-此处添加了自己的条件,如果满足自己的条件就返回true 拦截 在&& 后添加横竖屏判断
(cb != null && !mWindow.isDestroyed() && mFeatureId < 0? cb.dispatchTouchEvent(ev) : super.dispatchTouchEvent(ev));
}
其他具体相关的详细资料可以看 http://blog.csdn.net/kongbaidepao/article/details/47342937