View(2)-事件分发-创新互联
一、体系
目前创新互联已为超过千家的企业提供了网站建设、域名、虚拟主机、网站托管维护、企业网站设计、桓仁网站维护等服务,公司将坚持客户导向、应用为本的策略,正道将秉承"和谐、参与、激情"的文化,与客户和合作伙伴齐心协力一起成长,共同发展。Activity -> phoneWindow ->DecorView -> 各ViewGroup等
1.DecorView包含StateView、TitileView、ContentView 等子View ,setContentView 设置的是DecorView子View。
2.Activity 托管 phonwWindow实例对象,phoneWindow管理DecorView。因此在Activity中可以getWindow().DecorView得到顶层View。
3.decorView https://blog.csdn.net/guxiao1201/article/details/41744107
二、类型
1.ACTION_DOWN:手指刚接触屏幕,按下去的那一瞬间产生该事件
2.ACTION_MOVE:手指在屏幕上移动时候产生该事件
3.ACTION_UP:手指从屏幕上松开的瞬间产生该事件
4.ACTION_CANCLE : 手指从当前控件移动到控件外
正常情况下,呈现在MotionEvent上来讲分为3种
1.点击后抬起,也就是单击操作:ACTION_DOWN -> ACTION_UP
2.点击后再风骚的滑动一段距离,再抬起:ACTION_DOWN -> ACTION_MOVE -> ... -> ACTION_MOVE -> ACTION_UP
3.MotionEvent.ACTION_CANCEL滑动问题解决
https://blog.csdn.net/kingofhacker/article/details/75111372
三、原理
1.dispatchTouchEvent(MotionEvent event) 事件分发 返回true 表示此事件已消费
2.onInterceptTouchEvent(MotionEvent ev) 事件拦截 返回true 表示此事件需拦截
3. onTouchEvent(MotionEvent ev) 事件处理 返回true 表示此事件已消费
备注:
1.viewGroup首先会执行dispatchTouchEvent,dispatchTouchEvent调用onInterceptTouchEvent
如果返回true,则交由自己的onTouchEvent处理。返回false,交由子view的dispatchTouchEvent处理,一直递归下去。如果到最底层view onTouchEvent还是false,则事件开始交给该view的父view onTouchEvent解决。如果没有view处理,最后交由Activity onTouchEvent解决。
2.View类没有onInterceptTouchEvent()。如果子View是View,DispatchTouchEvent()会直接调用onTouchEvent()处理。
3.子View可以通过requestDisallowInterceptTouchEvent方法干预父View的事件分发过程(ACTION_DOWN事件除外)。
4.方法执行顺序 onTouch -> onTouchEvent -> onClickListener . 如前面方法返回true 后面方法收不到事件,onClickListener是在onTouchEvent中被调用的。
5.View的onTouchEvent方法默认都会消费掉事件(返回true),除非它是不可点击的(clickable和longClickable都是false),View的longClickable默认为false,clickable需要区分情况,如Button的clickable默认为true,而TextView的clickable默认为false。
参考:https://www.jianshu.com/p/238d1b753e64
四、事件冲突
种类
1.内外层滑动方向不一致,外层ViewGroup是可以横向滑动的,内层View是可以竖向滑动的,例如外层是ViewPager,内层是ListView。
2.内外层滑动方向一致,外层ViewGroup是可以竖向滑动的,内层View同样也是竖向滑动的,例如ScrollView包裹ListView。
解决
1.外部拦截法 在父View中onInterceptTouchEvent 判断事件交由谁处理
2.内部拦截法 在父View中 onInterceptTouchEvent() 对Action_Down事件不拦截。
在子View中 dispatchTouchEvent 根据业务判断是否交由父类处理parent.requestDisallowInterceptTouchEvent(false);
参考:https://www.jianshu.com/p/982a83271327
判断触摸点是否在view的区域:https://blog.csdn.net/u013651026/article/details/80446541
另外有需要云服务器可以了解下创新互联scvps.cn,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。
名称栏目:View(2)-事件分发-创新互联
路径分享:http://ybzwz.com/article/cscjdp.html