Android ScrollView设置初始position的方法

最近接了产品的一个需求,需要在一个拥有标题栏,内容区,图片区的滚动视图中,默认隐藏标题栏,而且支持用户手动下拉出现标题。

刚听到这个需求的时候,觉得这个很简单,直接设置ScrollView的初始滚动值即可。然而,当真正实现的时候却发现,Android压根没有方法可以设置ScrollView的初始滚动值。经过一系列的尝试,最终通过反射,修改成员变量的方法,实现了产品的需求。下面记录一下具体的踩坑过程。

这个就是需求的效果图。

这个是产品的要求,第一次进入的时候先展示标题,然后慢慢的向上滚动,最终隐藏。之后进入发表页都默认不展示标题栏,但是要支持用户可以下拉拉出标题栏。

动画的实现方案比较简单,进来之后等待一段时间,然后通过smoothScrollTo方法一点点的滚动ScrollView。然而,实验之后发现这个方法并不好用,没办法控制动画时间。后来改用Animator来实现,具体实现代码如下:

但是为难的是如何做到初始化ScrollView的默认滚动值。如果在onCreate里面调用scrollTo是无效的,因为这时候ScrollView都没有布局好。如果延时200ms之后再调用scrollTo,则用户会先看到标题然后再看到标题消失,体验不好。看起来似乎无解,难道一定要自己重载ScrollView来提供相关接口吗?

当我看着上面动画的代码发呆的时候,突然注意到了scrollY这个值,为什么Animator能够通过这个值来调整ScrollView的滚动位置呢?难道是通过反射scrollY这个成员变量动态修改它的value?

于是自己动手在onCreate的时候通过反射修改ScrollView的scollY属性。结果调试发现ScrollView压根没有这个属性。为什么呢?

查看了一下Animator的底层实现,发现scrollY并不是一个具体的属性成员

Animator建立了一个映射表,scrollY对应的PreHoneycombCompat.SCROLL_Y的具体值如下:

也就是说其实Animator是通过setScollY这个方法来实现动态滚动ScrollView的。而setScrollY的底层其实就是调用scrollTo。

到此似乎饶了个大圈子又回到了起点。前面已经尝试scrollTo在onCreate的时候就设置的话是无效的。

当我感到绝望的时候,看到了上图中的view.getScrollX(),既然有getScroolX那一定有getScrollY,既然有getScrollY那么一定有一个属性成员保存这个scrollY。一定!

通过断点和查看源码确认,这个保存ScrollView当前滚动位置的scrollY属性全名叫做mScrollY,而这个mScrollY并不是ScrollView的成员,而是其父类View的属性成员。

发现这个之后,将之前的反射代码直接修改成获取View的mScrollY变量,然后直接反射设置其初始高度。

编包后自测OK。

总结

一个小小的需求,暴露了自己对View的成员的不够了解,记录一下,提醒自己也方便大家。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Android中高级开发

Android开发之漫漫长途 XVII——动画(续)

该文章是一个系列文章,是本人在Android开发的漫漫长途上的一点感想和记录,我会尽量按照先易后难的顺序进行编写该系列。该系列引用了《Android开发艺术探索...

501
来自专栏jianhuicode

仿腾讯课堂固定滚动列表ReactNative组件

前言 由于业务需要做成类似腾讯课堂课程详情滚动的效果,考虑到后面有可能有新的呈现方式,RN提供的组件没有这种滚动控件,不如自己封装,其实去年已经写了一篇但是写的...

6357
来自专栏Android机动车

Dagger2系列——初识

经过一段时间的纠结和水深火热,终于渐渐领悟了Dagger2,在此分享一下学习心得,希望同样对Dagger2水深火热的你们有点帮助。

773
来自专栏我就是马云飞

无需自定义View,彻底解放shape,selector吧

作为一个android程序员,对于shape、selector这两个标签一定不陌生。每当UI设计师给我们设计出一个个button背景的时候,我们就需要去draw...

652
来自专栏IMWeb前端团队

用原生js写一个"多动症"的简历

用原生js写一个"多动症"的简历 预览地址 源码地址 最近在知乎上看到@方应杭用vue写了一个会动的简历,觉得挺好玩的,研究一下其实现思路,决定试试用原生js...

2617
来自专栏学海无涯

Android开发之项目经验分享

在Android开发中,除了基本的理论知识,还需要将所学知识运用到真实的项目中,在项目中锻炼自己的分析问题、解决问题的能力,本文将总结一下本人项目中遇到的一些问...

2525
来自专栏编程之路

羊皮书APP(Android版)开发系列(二十四)不常用但是很有用的两个属性:clipToPadding 和 clipChildren

1092
来自专栏AndroidTv

Activity 切换动画---点击哪里从哪放大

emmmm,这次来梳理一下 Activity 切换动画的研究。首先,老规矩,看一下效果图:

4675
来自专栏Java学习网

Java开发技术之Spring依赖注入知识学习

不管是构造器、Setter方法还是其他的方法,Spring都会尝试满足方法参数上所声明的依赖。假如有且只有一个bean匹配依赖需求的话,那么这个bean将会被装...

762
来自专栏Android群英传

onTouchEvent(二) 使用Scroller实现黏性滑动的ScrollView

683

扫码关注云+社区