其实差很多,只是简单的模仿里面的一个效果而已。稍微做个笔记。
效果是这个样子的。
上面那几个 ITEM 可以点击,还有下面模块滑动的时候,对应的 ITEM 要变色,就俩需求。
这里我采用的都是最直接的方式,上面那个用 LinearLayout
包几个按钮,下面那个用 ScrallView
,整体用 FrameLayout
包起来。(这种简单的叠加别用耗性能的 RelativeLayout
)
上布局代码:
1 | <?xml version="1.0" encoding="utf-8"?> |
写 4 个 ITEM 按钮的点击事件,下面模块的跳转用 ScrollView
的 smoothScrollTo()
方法就好了。
这个方法需要传入两个参数,分别是 x 和 y 的坐标。这里 x 我们传 0 就好了。y 的话直接用 getTop();
获取距离顶部的距离。
这里有一点要注意,Activity
生命周期中,onStart
, onResume
, onCreate
都不是真正 visible
的时间点,真正的visible
时间点是 onWindowFocusChanged()
函数被执行时。
所以 getTop()
要放在 onWindowFocusChanged()
里面执行,否则过早调用 getTop()
,比如在 onCreate()
中调用,可能会因为这个 view
还没有被加到 rootview
中获取到的值都是 0。
第二个需求是要根据滑动距离让上面对应的 ITEM 变色。
这个时候需要实现 ScrollView
的 OnScollChangedListener
接口,但是会发现 Call requires API 23 。
所以,最好还是自己创建一个类继承系统的 ScrollView
来兼容低版本。(不是很清楚为什么 Google要将 onScrollChanged()
定义成 protected
)
上代码:
1 | public class ScrollViewDIY extends ScrollView { |
有个小技巧,关于自定义的 View ,每次都要写那三段构造函数是不是很烦?
其实 Google 早就想到了,直接打 ViewConstructors 就可以自动完成了。你也可以在这里修改该 Templates :
然后就没有然后了,直接判断范围了好了。
整体代码:
1 | public class MainActivity extends AppCompatActivity { |
就是这么简单。