Android 高级开发瓶颈突破 扔物线 HenCoder Plus

时间:2021-6-12 作者:qvyue

拖拽和嵌套滑动

拖拽

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接口来实现自定义的嵌套滑动逻辑

声明:本文内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:qvyue@qq.com 进行举报,并提供相关证据,工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。