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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

空白的泡

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值