自定义 View 系列:高仿 “淘宝头条” 控件

3,532 阅读4分钟

已经两天没有写文章了。上篇文章《高仿ios底部弹出的对话框》,源代码已经上传至github仓库,想要学习的同学可以去拷贝下源代码。今天来研究一下“淘宝头条”这个控件是如何实现的。

先来看一下今天我们要完成的效果图吧:


淘宝头条

不要在意细节,别管它是淘宝头条还是京东头条,我们只需要知道,这个效果很炫就行了。另外,这个控件是可以点击的,点击效果就是进入指定界面,制作Gif的时候手抖,忘记去点击了,你们将就着看吧。

首先看一下,这个控件是一个左右结构,最左边是一张图片,中间是一个滚动的控件,这个滚动的控件是什么,我先卖个关子,结尾处很明显,是一个TextView,大致的结构我就分析完了,我们着重分析一下中间的那个滚动的东西,左右两边我就不分析了,很简单的,一个是ImageView,一个是TextView

刚开始我做这个控件的时候,我在考虑如何实现控件的垂直滚动,我想到了Linear Layout,ListView,ScrollView,RecyclerView,经过一番尝试,发现这几个控件实现起来效果都不是很好,尤其是RecyclerView和ListView,还要编写Adapter,实在是烦得要死,于是就有了下面的思考。
ViewPager:ViewPager是水平滚动的,可以通过setCurrentPosition来设置位置,非常蛋疼,如果ViewPager是垂直滚动的,那正好符合这个控件的要求,不就是万事大吉了吗!!!蛋疼!!!当我捂蛋的时候,我在github上找到一个kaelaela大神写的VerticalViewPager,卧槽,神了~最后想来想去,还是不太想用这个控件,我就想再找找看有没有更好的解决办法。。。。。。
ViewFlipper:在万般无奈中,我在google上找到了ViewFlipper这个类。说实话,以前真没用过这个类,经过一番学习,发现这类能够控制View的动画特效,具体的实现类有两个TextSwitcher和ImageSwitcher,你们可以去往上找一下相关的代码。在某些时候,这个类还是很实用的。
考虑了很久,最终还是决定用ViewFlipper来实现淘宝头条这个效果。说一下我的原因吧:
1.VerticalViewPager设置自动滚动需要加一个Timer,ViewFlipper直接设置时间间隔然后startFlipping就行了
2.VerticalViewPager配置数据需要设置Adaper,这样的话代码量比较多,说实话,我最讨要配置adapter数据了
3.VerticalViewPager是可以接受用户的手指滑动的,我们需要考虑屏蔽掉用户的滑动。我想了好久,没有想到比较好的方案来屏蔽用户的手指滑动。

废话不多说,我们来看看ViewFlipper类如何来使用吧。
首先在布局文件中定义一个ViewFlipper,就当作普通的控件去定义就好了,看一下我是怎么定义的

        

然后代码中是这样使用的

        viewFlipper = (ViewFlipper) rootView.findViewById(R.id.taobao_headline_viewflipper);
        for (View view : data) {
            viewFlipper.addView(view);
        }
        //进入动画
        viewFlipper.setInAnimation(getContext(), R.anim.headline_in);
        //退出动画
        viewFlipper.setOutAnimation(getContext(), R.anim.headline_out);
        //动画间隔
        viewFlipper.setFlipInterval(2000);
        viewFlipper.startFlipping();

那个for循环其实就是往ViewFlipper中添加滚动的View
然后设置一下动画和时间间隔,最后startFlipping就可以了
看一下我的动画是怎么写的
headline_out.xml


    

headline_in.xml


    

好了,整个项目差不多就完成了。其实这里面只是描述了如何去使用ViewFlipper,因为ViewFlipper是关键的一个类,其他的东西都不是很重要,如果要看源代码,去我的github仓库拷贝就行了。有什么不懂的,可以在下方留言。因为我可能是跳着讲解的,所以有些基础薄弱的人可能会看不懂。
github:https://github.com/Elder-Wu/Notes
如果觉得我写得好,可以点个赞,然后关注一下的哦~另外,我的微信公众号也开播了,每天都会分享一篇优质的技术文章,欢迎大家来踩点。(公众号:代码也是人)


公众号:代码也是人

技术交流群:471395156(欢迎大家入坑)