1. 程式人生 > >自定義View系列:高仿“淘寶頭條”

自定義View系列:高仿“淘寶頭條”

先來看一下今天我們要完成的效果圖吧:


自定義View效果圖

不要在意細節,別管它是淘寶頭條還是京東頭條,我們只需要知道,這個效果很炫就行了。另外,這個控制元件是可以點選的,點選效果就是進入指定介面,製作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
            android:id="@+id/taobao_headline_viewflipper"
            android:layout_width="0dp"
            android:layout_height="@dimen/headline_height"
            android:layout_marginLeft="1dp"
android:layout_marginRight="1dp" android:layout_weight="1" />

然後程式碼中是這樣使用的

        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

<set xmlns:android="http://schemas.android.com/apk/res/android" android:duration="1000">
    <translate
        android:fromXDelta="0"
        android:fromYDelta="0"
        android:toXDelta="0"
        android:toYDelta="-100%p" />
</set>

headline_in.xml

<set xmlns:android="http://schemas.android.com/apk/res/android"
    android:duration="1000">
    <translate
        android:fromXDelta="0"
        android:fromYDelta="100%p"
        android:toXDelta="0"
        android:toYDelta="0" />
</set>

好了,整個專案差不多就完成了。其實這裡面只是描述瞭如何去使用ViewFlipper,因為ViewFlipper是關鍵的一個類,其他的東西都不是很重要,如果要看原始碼,去我的github倉庫拷貝就行了。有什麼不懂的,可以在下方留言。因為我可能是跳著講解的,所以有些基礎薄弱的人可能會看不懂。
github:https://github.com/Elder-Wu/Notes