拖拽和嵌套滑动
拖拽
OnDragListener
通过startDrag()来启动拖拽
用 setOnDragListener()来监听
OnDragListener 内部只有一个方法:onDrag()
onDragEvent()方法也会收到拖拽回调(界面中的每个View都会收到)
ViewDragHelper
需要创建一个 ViewDragHelper 和 Callback()
需要写在 ViewGroup 里面,重写 onInterceptTouchEvent()和 onTouchevent()
为什么要这两个东西,而不是一个?
OnDragListener
API 11加入的工具类,用于拖拽操作。
使用场景:用户的「拖起-> 放下」操作,重在内容的移动。可以附加拖拽数据
不需要写自定义View,使用startDrag() / startDragAndDrop()手动开启拖拽
拖拽的原理是创造出一个图像在屏幕的最上层,用户的手指拖着图像移动
ViewDragHelper
2015年的support v4包中新增的工具类,用于拖拽操作。
使用场景:用户拖动ViewGroup中的某个子View
需要应用在自定义 ViewGroup 中调用 ViewDragHelper.shouldInterceptTouchEvent()和 processTouchEvent(),程序会自动开启拖拽
拖拽的原理是实时修改被拖拽的子View的mLeft, mTop, mRight, mBottom值
嵌套滑动
嵌套滑动的场景
不同向嵌套
onInterceptTouchEvent 父 View 拦截
requestDisallowInterceptTouchEvent()子 View 阻止父 View 拦截
同向嵌套
父View会彻底卡住子View
原因:抢夺条件一致,但父View的onInterceptTouchEvent()早于子View的 dispatchTouchEvent()
本质上是策略问题:嵌套状态下用户手指滑动,他是想滑谁?
场景一:NestedScrollView
子View能滑动的时候,滑子View;滑不动的时候,滑父View
场景二:Google的样例
父View展开的时候:
上滑:优先滑父View
下滑:滑不动(所以可以说还是优先滑父View)
父View半展开的时候:
向上:优先滑父View,滑到父View完全收齐之后开始滑子View
向下:滑父View,滑到父View完全展开之后开始滑子View
父View收起的时候:
上滑:滑子View (所以可以说是优先滑子View)
下滑:优先滑子View,滑到子View顶部的时候开始滑父View
解决方案:实现策略一一父View、子View谁来消费事件可以实时协商
实现?
其实大多数场景,SDK就解决了
案例1:ScrollView嵌套:没法滑动
案例2:换成NestedScrollView :可以滑动
自己实现?
案例3:按照课上代码,实现NestedScrollingChild2接口来实现自定义的嵌套滑动逻辑