DecorView 拦截上层app中的 触摸事件

发布时间:2017-6-29 10:29:58编辑:www.fx114.net 分享查询网我要评论
本篇文章主要介绍了"DecorView 拦截上层app中的 触摸事件",主要涉及到DecorView 拦截上层app中的 触摸事件方面的内容,对于DecorView 拦截上层app中的 触摸事件感兴趣的同学可以参考一下。

遇到一个 界面滑动的问题,在边界范围执行不了本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



上一篇:CSDN日报20170613 ——《 为什么说软件外包公司没前途》
下一篇:计数器参数详解

相关文章

相关评论

本站评论功能暂时取消,后续此功能例行通知。

一、不得利用本站危害国家安全、泄露国家秘密,不得侵犯国家社会集体的和公民的合法权益,不得利用本站制作、复制和传播不法有害信息!

二、互相尊重,对自己的言论和行为负责。

好贷网好贷款