Android中如何实现嵌套滚动


这篇文章主要介绍了Android中如何实现嵌套滚动的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Android中如何实现嵌套滚动文章都会有所收获,下面我们一起来看看吧。业务需求是:
VT容器可以滚动;书籍封面可以滚动,并且有视差;当VT容器滚动到顶部时,滚动列表,并且滚动可以衔接。当列表滚动到顶部时,可以滚动书籍封面以及VT容器,并且滚动可以衔接逻辑清楚了,接下来就看如何实现了。在android5以前,对于这种滚动,我们只能选择自己去拦截事件并处理,但在后面的某个版本,android推出了NestingScroll机制,开发者的日子免费云主机域名就好过多了,并且android提供了一个非常好的容器类:CoordinatorLayout,极大的简化了开发者的工作。当然我们也需要投入精力去学习并运用这些新的Api了。当然,我们也要知道如果没有这些API,我们应当如何去实现这些效果。因此本文会用三种方式去实现这个效果:纯事件拦截与派发方案基于NestingScroll机制的实现方案基于CoordinatorLayout与Behavior方案的实现示例代码放在Github上,可以clone下来结合文章观看纯事件拦截与派发方案这是最为原始的方案,当然也灵活性***的了。其它的方案原理上都是系统基于它提供的封装。使用这种方案时,我们需要解决以下几个问题:view的滚动(Scroller);view的速度追踪(VelocityTracker);当VT容器滚动到顶部时,我们如何将事件传递给ListView?当ListView滚动到顶部时,VT容器如何拦截到事件?1、2两点属于滚动的基础知识,这里不会做细致的讲解。而第3点为何会出现呢?因为android系统在事件派发时,如果事件被拦截,那么之后的事件都将不会传递给子view了。其解决方案也很简单:在滚动到顶部时主动派发一次Down事件:那么第4点是什么问题呢?这里就需要清楚一个坑点了:不是所用的事件都会走入onInterceptTouchEvent。有一种情况是子View主动调用parent.requestDisallowInterceptTouchEvent(true)来告诉系统说:这个事件我要了,父View不要拦截了。这就是所谓的内部拦截法。在ListView的某些时刻它会去调用这个方法。因此一旦事件传递给了ListView,外部容器就拿不到这个事件了。因此我们要打破它的内部拦截:方法如上,把requestDisallowInterceptTouchEvent的实现干掉就可以了。主要的技术点已近提出来了。那么下面就看具体实现,首先看使用xml:EventDispatchTargetLayout实现了自定义接口ITargetView:这是因为与具体业务抽离,我并不清楚内层盒子是怎样的(有可能就是ListView了,也有可能是ViewPager包裹ListView)主要的实现在EventDispatchPlanLayout,使用时在xml中指定header_init_offset、target_init_offset等变量就可以了,基本上与业务逻辑独立。其重点实现逻辑在onInterceptTouchEvent与onTouchEvent中了。个人不是很建议去动dispatchTouchEvent,虽然所有事件都会经过这里,但是这也明显会增加代码处理复杂度:代码逻辑很清晰,应该不用多说。接下来看onTouchEvent的处理逻辑。或许有人会说:为何与onInterceptTouchEvent与有很多重复代码?这是因为如果事件不打断,并且子类不处理,就会走进onTouchEvent逻辑,所以这些重复处理是有意义的(其实是抄SwipeRefreshLayout的)。里面主要的逻辑就是两个:滚动容器TouchUp时滚动到特定位置以及fling传递滚动容器的逻辑:TouchUp的滚动逻辑:当然这里会打上一些标志位,具体实现是在computeScroll中,这属于Scroller的功能,这里就不展开了。这样大体逻辑就讲述清楚了,其它细节就请看官直接看源码了。基于NestingScroll机制的实现方案NestingScroll机制是在某个版本support包加入的,不过外界极少有文章介绍,所以应该大多数人并不知道这个机制。NestingScroll主要有两个接口:NestedScrollingParentNestedScrollingChild当我们需要使用NestingScroll特性时,我们去实现这两个接口就好了。NestingScroll本质是内部拦截发然后将相应的接口开给外界。因此实现NestedScrollingChild接口是有难度的,不过像RecyclerView这些控件,官方已经帮我们实现好了NestedScrollingChild,要完成我们的需求,我们直接拿来用就好了(ListView就没办法使用了,当然你也可以去实现NestedScrollingChild接口)。并且NestedScrollingChild与NestedScrollingParent只要有嵌套关系就行了,并不一定NestedScrollingChild是直接的子View。我们来来看看NestedScrollingParent的定义:关于“Android中如何实现嵌套滚动”这篇文章的内容就介绍到这里,感谢各位的阅读!相信大家对“Android中如何实现嵌套滚动”知识都有一定的了解,大家如果还想学习更多知识,欢迎关注百云主机行业资讯频道。

相关推荐: react element指的是什么

本篇内容介绍了“react element指的是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成! react element是“React.createEle…

免责声明:本站发布的图片视频文字,以转载和分享为主,文章观点不代表本站立场,本站不承担相关法律责任;如果涉及侵权请联系邮箱:360163164@qq.com举报,并提供相关证据,经查实将立刻删除涉嫌侵权内容。

(0)
打赏 微信扫一扫 微信扫一扫
上一篇 04/19 09:44
下一篇 04/19 09:44

相关推荐