天天看點

使用ViewPager+Fragment來實作帶滾動條的多屏滑動-IndicatorFragmentActivity

轉載請注明出處:http://blog.csdn.net/singwhatiwanna/article/details/17201587

在android應用中,多屏滑動是一種很常見的風格,部落客之前也寫過一些多屏滑動的demo,比如滾動banner(http://blog.csdn.net/singwhatiwanna/article/details/8875241)和仿tabhost的控件。這次給大家介紹一種效果更好的風格:帶滾動條的多屏滑動,類似于google play裡面的風格。如果你看過我之前寫的banner,你就會發現那個banner是原生的,沒有采用viewpager啥的,是以代碼很長,如果采用viewpager,代碼就會短很多,但是使用viewpager也有弊端:需要導入android-support-v4.jar、細節無法控制。不過現在情況已經不一樣了,android-support-v4中提供了很多實用的功能,以至于現在建立一個android工程預設都會導入這個jar包。那我們就也采用viewpager來做滑動吧。另外一個概念就是fragment和fragmentactivity,fragment是一個特殊的類,有着和activity一緻的生命周期和view一緻的界面,也就是fragment就等于具有生命周期的view,但是,要注意的是:fragment并不是view,它和view沒有繼承關系。使用fragment的好處是:fragment可以重用,而且每個fragment可以在内部處理自己的業務就像activity一樣,這樣子產品間耦合較低,比把所有的業務都寫在一個activity内部邏輯要清晰很多。還有就是,由于每個子產品的業務都在fragment内部來實作,這樣activity隻要管理好幾個fragment就行了,不需要做和業務相關的事情,最後,fragment可以用來做不同分辨率機型的适配。fragment在sdk(android

3.0及更高)和android-support-v4裡面都有,但是由于相容性的問題,我們隻能使用android-support-v4裡面的fragment,除非你想你的apk隻跑在3.0以後的android手機上,fragmentactivity的情況和fragment類似。關于fragment和fragmentactivity,其實有一些基本的用法需要了解一下,但是考慮到fragment不是本文的重點,是以這裡就不介紹了,另外,本文隻用fragment做了一個簡單的界面,大家應該一看就懂,好了,言歸正傳。

使用ViewPager+Fragment來實作帶滾動條的多屏滑動-IndicatorFragmentActivity

viewpagercompat.java:這是一個viewpager的加強類,主要是為了解決滑動沖突的問題。不然的話,在viewpager内部加入listview等可滑動控件,兩者之間會産生幹擾。

在這裡想多說一下,關于此類問題,解決辦法是:重寫父控件的onintercepttouchevent函數,在move的時候根據需要傳回true,比如左右滑動傳回true,其他情況均傳回false。這樣,當左右滑動的時候,由于onintercepttouchevent傳回了true,父控件就能處理,其他情況,事件将傳遞到listview中,listview自身可以處理上下滑動。

[java] view

plaincopy

使用ViewPager+Fragment來實作帶滾動條的多屏滑動-IndicatorFragmentActivity
使用ViewPager+Fragment來實作帶滾動條的多屏滑動-IndicatorFragmentActivity

public class viewpagercompat extends viewpager {  

    //mviewtouchmode表示viewpager是否全權控制滑動事件,預設為false,即不控制  

    private boolean mviewtouchmode = false;  

    public viewpagercompat(context context, attributeset attrs) {  

        super(context, attrs);  

    }  

    public void setviewtouchmode(boolean b) {  

        if (b && !isfakedragging()) {  

            //全權控制滑動事件  

            beginfakedrag();  

        } else if (!b && isfakedragging()) {  

            //終止控制滑動事件  

            endfakedrag();  

        }  

        mviewtouchmode = b;  

    /** 

     * 在mviewtouchmode為true的時候,viewpager不攔截點選事件,點選事件将由子view處理 

     */  

    @override  

    public boolean onintercepttouchevent(motionevent event) {  

        if (mviewtouchmode) {  

            return false;  

        return super.onintercepttouchevent(event);  

    public boolean ontouchevent(motionevent ev) {  

        try {  

            return super.ontouchevent(ev);  

        } catch (exception e) {  

     * 在mviewtouchmode為true或者滑動方向不是左右的時候,viewpager将放棄控制點選事件, 

     * 這樣做有利于在viewpager中加入listview等可以滑動的控件,否則兩者之間的滑動将會有沖突 

    public boolean arrowscroll(int direction) {  

        if (mviewtouchmode) return false;  

        if (direction != focus_left && direction != focus_right) return false;  

        return super.arrowscroll(direction);  

}  

下面兩個檔案代碼有點多,沒有粘出來,後面附有下載下傳位址,大家可以下載下傳下來看看,代碼都做了注釋的。有什麼疑問歡迎交流。

titleindicator.java:這個一個帶滾動條的頁籤,會随着viewpager的滑動而滑動,其實作思想是這樣的:每個頁籤是一個view,根據需要可以add多個view也就是多個頁籤進來,頁籤下部還有一個滾動條,滾動條是用canvas畫出來的。所有的invalidate方法均會觸發ondraw,當頁面滾動的時候,會有一個滾動距離,然後ondraw被觸發後,就會在新位置重新畫上滾動條(其實就是畫線)。

indicatorfragmentactivity.java:這是indicatorfragmentactivity的主界面,用于管理上述兩個view,對子類提供protected abstract int supplytabs(list<tabinfo> tabs)接口來生成頁面。

下面主要介紹下如何使用這個indicatorfragmentactivity。

請按如下步驟:

使用ViewPager+Fragment來實作帶滾動條的多屏滑動-IndicatorFragmentActivity
使用ViewPager+Fragment來實作帶滾動條的多屏滑動-IndicatorFragmentActivity

public class mainactivity extends indicatorfragmentactivity {  

    public static final int fragment_one = 0;  

    public static final int fragment_two = 1;  

    public static final int fragment_three = 2;  

    protected void oncreate(bundle savedinstancestate) {  

        super.oncreate(savedinstancestate);  

    //在這裡提供資料來進行初始化  

    protected int supplytabs(list<tabinfo> tabs) {  

        tabs.add(new tabinfo(fragment_one, getstring(r.string.fragment_one),  

                fragmentone.class));  

        tabs.add(new tabinfo(fragment_two, getstring(r.string.fragment_two),  

                fragmenttwo.class));  

        tabs.add(new tabinfo(fragment_three, getstring(r.string.fragment_three),  

                fragmentthree.class));  

        //傳回的下标表示界面初始化的時候所指向的fragment的序号  

        return fragment_two;  

最簡單的fragment,啥都不做,就加載一個layout然後初始化一個listview。其實我的demo裡有3個界面一樣的fragment,但是部落客為了偷懶,直接寫了一個basefragment,讓它們3個都繼承這個basefragment,反正界面都一樣嘛。

使用ViewPager+Fragment來實作帶滾動條的多屏滑動-IndicatorFragmentActivity
使用ViewPager+Fragment來實作帶滾動條的多屏滑動-IndicatorFragmentActivity

public class basefragment extends fragment {  

    protected view mmainview;  

    protected static arraylist<map<string, object>> mlistitems;  

    protected context mcontext;  

    static {  

        mlistitems = new arraylist<map<string, object>>();  

        for (int i = 0; i < 20; i++) {  

            map<string, object> map = new hashmap<string, object>();  

            map.put("name", "name#" + i);  

            map.put("sex", i % 2 == 0 ? "male" : "female");  

            mlistitems.add(map);  

    public basefragment() {  

        super();  

    public void onattach(activity activity) {  

        super.onattach(activity);  

        mcontext = activity.getapplicationcontext();  

    public view oncreateview(layoutinflater inflater, viewgroup container, bundle savedinstancestate) {  

        mmainview = inflater.inflate(r.layout.fragment_one, container, false);  

        listview listview = (listview) mmainview.findviewbyid(r.id.list);  

        simpleadapter adapter = new simpleadapter(mcontext, mlistitems,  

                r.layout.listview_item, new string[] {  

                        "name", "sex"  

                }, new int[] {  

                        r.id.name, r.id.download  

                });  

        listview.setadapter(adapter);  

        return mmainview;  

這樣就ok了,是不是挺簡單的,也就是說,如果你想要這種效果的話,隻要導入ui包裡面的3個類,然後再按上述2個步驟去做就行了,效果也是很好的。另外就是頁籤的顔色以及滾動條的顔色都是可以調的,而且每個頁籤上面是支援顯示其他辨別的,比如一個小紅點啥的,就類似于那種有新消息的狀态。有什麼問題,歡迎大家在下面留言和我交流。

使用ViewPager+Fragment來實作帶滾動條的多屏滑動-IndicatorFragmentActivity

代碼下載下傳:http://download.csdn.net/detail/singwhatiwanna/6680173

繼續閱讀