点击事件:
-
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。 -
Activity、ViewGroup、View
-
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;
侧滑菜单原理
- 整体结构,功能性分析
- ViewDragHelper类: 主要用于帮助DrawerLayout进行触摸开启,关闭,拖动,释放滑动等逻辑的判断和处理,状态变化
- ViewDragCallback类 ViewDragHelper 与DrawerLayout进行交互
- DrawerListener接口 监听onDrawerSlide(抽屉滑动),onDrawerOpened(抽屉打开),onDrawerClosed(抽屉关闭),onDrawerStateChanged(抽屉状态变化)等事件
- DrawerLayoutCompatImpl 接口
- SavedState类 保存和恢复当前DrawerLayout状态的类,配合onSaveInstanceState保存状态数据,onRestoreInstanceState恢复状态数据
- LayoutParams类 额外属性的处理,这里有onScreen(划出屏幕百分比),openState(开启状态)
- 重点属性
- 三种状态 :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,左侧和右侧侧滑处理的回调接口。
- 布局实现分析
- onMeasure :DrawerLayout的布局高度宽度属性一般要设置为match_parent或者固定值
- onLayout : 布局判断左右划
- onDraw
- drawChild
- 触摸事件分析
DrawerLayout实现了onInterceptTouchEvent和onTouchEvent方法。
ViewDragHelper对象会在区域对操作进行拦截,这样子View就无法接收Touch事件了。onTouchEvent方法,会将Touch事件交给左,右ViewDragHelper对象帮助处理,然后自己还实现了发生ACTION_UP和ACTION_CANCEL时,关闭侧滑栏的操作。