Android -- 事件的传递机制

15 篇文章 0 订阅

点击事件:

  1. touch事件的传递流程
    联系copy/move的动画以及上下移动事件
    dispatchTouchEvent分发): Touch事件的入口方法 ,返回true是消费,返回false是返回给上级的onTouchEvent处理,Activity返回super是不处理传给子View,ViewGrop返回super是不处理给自身onInterceptTouchEvent拦截,View返回super是直接调用自身的onTouchEvent处理。
    onInterceptTouchEvent拦截):ViewGroup拦截事件。ViewGrop返回false/super,继续向下传递到子View的onDespachTouchEvent分发,返回true就是拦截了,走自身的onTouchEvent。只有ViewGrop有拦截
    onTouchEvent处理):是否消费事件。返回true,消费。返回false/super,向上传递,直接传递给父布局的onTouchEvent。

  2. Activity、ViewGroup、View

  3. Activity 不是父类视图是没有onInterceptTouchEvent这个回掉方法的,View也没有,只有ViewGrop有
    Android里面只有可以作为双亲的视图才会有onInterceptTouchEvent
    Activity 的拦截源码:getWindow().superDispatchTouchEvent(ev)–》PhoneWindow–》DecorView–》ViewGroup

Activity 和View只有分发和消费,没有拦截
ViewGrop都有

输入事件:

联系rename/createfolder事件
使用TextWatcher类,这种方式是可以监听软键盘和硬键盘的,我们只需要实现onTextChanged方法即可,另外TextWatcher还提供了beforeTextChanged和afterTextChanged方法,用于更加详细的输入监听处理

edittext.addTextChangedListener(new TextWatcher() {           
            @Override  
            public void onTextChanged(CharSequence s, int start, int before, int count) {  
                textview.setText(edittext.getText());  
            }  
            @Override  
            public void beforeTextChanged(CharSequence s, int start, int count,  int after) {                  
            }  
            @Override  
            public void afterTextChanged(Editable s) {                
            }  
        });  
ScrollView嵌套ListView

显式问题
1.通过Activity计算item的高度,重新布局
2.自定义listView,重写onMeasure方法

滑动问题:
原因:listview显式不全,
注意点1.一次完全触摸事件全部在listView覆盖范围,
2.设置父控件不拦截,getParent().requestDisallInterceptRouchEvent(true)
该方法是子控件命令父控件是否拦截的
处理方法:
1.设置setOnTouchListener(),监听到ACTION_UP事件时请求父控件不拦截
2.自定义ListView,重写分发拦截

ViewPage 加载fragment设置ViewPage不滑动
自定义ViewPage,分发和处理设置return false;

侧滑菜单原理

  1. 整体结构,功能性分析
  • ViewDragHelper类: 主要用于帮助DrawerLayout进行触摸开启,关闭,拖动,释放滑动等逻辑的判断和处理,状态变化
  • ViewDragCallback类 ViewDragHelper 与DrawerLayout进行交互
  • DrawerListener接口 监听onDrawerSlide(抽屉滑动),onDrawerOpened(抽屉打开),onDrawerClosed(抽屉关闭),onDrawerStateChanged(抽屉状态变化)等事件
  • DrawerLayoutCompatImpl 接口
  • SavedState类 保存和恢复当前DrawerLayout状态的类,配合onSaveInstanceState保存状态数据,onRestoreInstanceState恢复状态数据
  • LayoutParams类 额外属性的处理,这里有onScreen(划出屏幕百分比),openState(开启状态)
  1. 重点属性
  • 三种状态 :STATE_IDLE(已打开或已关闭), STATE_DRAGGING(正在拖动), STATE_SETTLING(执行打开或关闭的动画过程中)
  • 四种锁定模式 LOCK_MODE_UNLOCKED(未锁定,用户可以活动侧滑), LOCK_MODE_LOCKED_CLOSED(锁定并关闭菜单,用户无法侧滑,但是程序调用可以实现侧滑), LOCK_MODE_LOCKED_OPEN(锁定并打开菜单,用户无法侧滑,但是程序调用可以实现侧滑), LOCK_MODE_UNDEFINED(空白状态,初始状态)。
  • mLeftDragger,mRightDragger,用于处理左侧和右侧侧滑的辅助类ViewDragHelper对象。
  • mLeftCallback,mRightCallback,左侧和右侧侧滑处理的回调接口。
  1. 布局实现分析
  • onMeasure :DrawerLayout的布局高度宽度属性一般要设置为match_parent或者固定值
  • onLayout : 布局判断左右划
  • onDraw
  • drawChild
  1. 触摸事件分析
    DrawerLayout实现了onInterceptTouchEvent和onTouchEvent方法。
    ViewDragHelper对象会在区域对操作进行拦截,这样子View就无法接收Touch事件了。onTouchEvent方法,会将Touch事件交给左,右ViewDragHelper对象帮助处理,然后自己还实现了发生ACTION_UP和ACTION_CANCEL时,关闭侧滑栏的操作。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值