天天看點

SlidingMenu最新版本使用詳解

多謝原作者的提醒!

    我們在使用開源的項目之前,都需要先将項目作為資源引入到我們目前的項目之中。在整合之前,先将github上項目的示例代碼下載下傳下來,導入到eclipse當中。關于将外部項目導入目前項目,有兩種做法。

    (1)将資源項目作為library設定到我們的項目中,就像是示例代碼中的examplelistctivity一樣,如下圖所示。有一點需要注意一下,因為在slidingmenu示例代碼裡面用到了actionbarsharlock這個依賴工程,是以,我們不光需要slidingmenu的代碼,還需要actionbarsharlock工程的資源項目。actionbarsharlock的github項目位址是https://github.com/jakewharton/actionbarsherlock 大家可以自行下載下傳。在設定好依賴工程之後,我們就可以使用slidingmenu了。

SlidingMenu最新版本使用詳解

    (2)除了采用上面這種依賴工程的方法,我們還可以直接将依賴工程,也就是library項目裡面的代碼,直接拷貝到我們的目标項目裡面。我個人更喜歡這種方法,雖然這樣會增加工程的安裝包的體積,但是,對于項目的管理來說,更加的友善。在這個項目中,我們将下面的這個檔案複制到我們的項目裡面就可以了。

SlidingMenu最新版本使用詳解

    (1)繼承自slidingfragmentactivity。如果是采用這種方式的話,我們的activity需要繼承自slidingfragmentactivity。slidingfragmentactivity是slidingmenu裡面的一個類,繼承自它,我們可以擁有一個slidingmenu控件。如果我們想用這個方式,可以參考下面的代碼。

[java] view

plaincopy

SlidingMenu最新版本使用詳解
SlidingMenu最新版本使用詳解

package com.example.slidingmenudemo;  

import android.os.bundle;  

import android.support.v4.app.fragmenttransaction;  

import com.jeremyfeinstein.slidingmenu.lib.slidingmenu;  

import com.jeremyfeinstein.slidingmenu.lib.app.slidingfragmentactivity;  

/** 

 * 繼承自slidingfragmentactivity的側滑欄實作,可以實作側滑欄是fragment的側滑欄的效果 

 *  

 * @author zhaokaiqiang 

 * @see http://blog.csdn.net/zhaokaiqiang1992 

 */  

public class methodoneactivity extends slidingfragmentactivity {  

    @override  

    public void oncreate(bundle savedinstancestate) {  

        super.oncreate(savedinstancestate);  

        // 設定主界面的布局檔案  

        setcontentview(r.layout.activity_method_one);  

        // 設定存放側滑欄的容器的布局檔案  

        setbehindcontentview(r.layout.frame_menu);  

        // 将側滑欄的fragment類填充到側滑欄的容器的布局檔案中  

        fragmenttransaction transaction = getsupportfragmentmanager()  

                .begintransaction();  

        samplelistfragment fragment = new samplelistfragment();  

        transaction.replace(r.id.menu_frame, fragment);  

        transaction.commit();  

        // 擷取到slidingmenu對象,然後設定一些常見的屬性  

        slidingmenu sm = getslidingmenu();  

        // 設定陰影的寬度  

        sm.setshadowwidth(0);  

        // 設定陰影的顔色  

        sm.setshadowdrawable(r.drawable.shadow);  

        // 設定側滑欄完全展開之後,距離另外一邊的距離,機關px,設定的越大,側滑欄的寬度越小  

        sm.setbehindoffset(100);  

        // 設定漸變的程度,範圍是0-1.0f,設定的越大,則在側滑欄剛劃出的時候,顔色就越暗。1.0f的時候,顔色為全黑  

        sm.setfadedegree(0.3f);  

        // 設定觸摸模式,可以選擇全屏劃出,或者是邊緣劃出,或者是不可劃出  

        sm.settouchmodeabove(slidingmenu.touchmode_fullscreen);  

        //設定actionbar能否跟随側滑欄移動,如果沒有,則可以去掉  

        setslidingactionbarenabled(false);  

    }  

}  

    使用這種實作方式,我們的側滑欄是使用一個fragment實作的,通過setbehindcontentview()方法,我們可以設定放置側滑欄布局的容器,這個容器是一個非常簡單的布局檔案,一般來說比較固定,比如像下面這樣就可以

[html] view

SlidingMenu最新版本使用詳解
SlidingMenu最新版本使用詳解

<?xml version="1.0" encoding="utf-8"?>  

<framelayout xmlns:android="http://schemas.android.com/apk/res/android"  

    android:id="@+id/menu_frame"  

    android:layout_width="match_parent"  

    android:layout_height="match_parent" />  

    在這裡面,一個設定了id的fragmentlayout布局即可,這樣我們就可以通過transaction.replace(r.id.menu_frame,

fragment);方法将我們側滑欄的fragment填充到slidingmenu之中。

    因為slidingfragmentactivity裡面已經內建了一個slidingmenu,是以,我們通過getslidingmenu()就可以擷取到一個silidingmenu對象,然後象上面的代碼一樣設定常用的屬性就可以了。

    通過這種方式添加slidingmenu非常的友善,但是我們必須繼承自slidingfeagmentactivity,不免有一些限制。

    (2)繼承自fragmentactivity

    除了繼承slidingmenu自帶的activity之外,我們還可以直接繼承自fragmentactivity,如果要通過這種方式,我們可以參考下面的代碼實作。

SlidingMenu最新版本使用詳解
SlidingMenu最新版本使用詳解

import android.support.v4.app.fragmentactivity;  

 * 繼承自fragmentactivity的側滑欄實作,可以實作側滑欄是fragment的側滑欄的效果 

public class methodtwoactivity extends fragmentactivity {  

    private slidingmenu menu;  

        setcontentview(r.layout.activity_method_two);  

        menu = new slidingmenu(this);  

        menu.setshadowwidth(0);  

        menu.setshadowdrawable(r.drawable.shadow);  

        menu.setbehindoffset(100);  

        menu.setfadedegree(0.35f);  

        menu.settouchmodeabove(slidingmenu.touchmode_fullscreen);  

        menu.attachtoactivity(this, slidingmenu.sliding_content);  

        menu.setmenu(r.layout.frame_menu);  

        getsupportfragmentmanager().begintransaction()  

                .replace(r.id.menu_frame, new samplelistfragment()).commit();  

    通過這種方式內建的話,我們需要自己定義slidingmenu,然後通過attachtoactivity,将slidingmenu連接配接到我們的fragmentactivity之上,setmenu()方式設定的是我們的側滑欄的容器的布局,和上面的第一種方法是一樣的。

(1)雙側滑欄

    我們可以通過下面的代碼實作雙側滑欄的效果

SlidingMenu最新版本使用詳解
SlidingMenu最新版本使用詳解

@override  

        //設定左邊的側滑欄  

        getslidingmenu().setmode(slidingmenu.left_right);  

        getslidingmenu().settouchmodeabove(slidingmenu.touchmode_fullscreen);  

        setcontentview(r.layout.content_frame);  

                .replace(r.id.content_frame, new samplelistfragment()).commit();  

        //設定右邊的側滑欄  

        getslidingmenu().setsecondarymenu(r.layout.menu_frame_two);  

        getslidingmenu().setsecondaryshadowdrawable(r.drawable.shadowright);  

                .replace(r.id.menu_frame_two, new samplelistfragment())  

                .commit();  

(2)設定觸摸模式

通過getslidingmenu().settouchmodeabove()可以設定側滑欄的觸摸模式,用下面3個常量值

slidingmenu.touchmode_fullscreen  全螢幕模式,全屏滑動都可打開

slidingmenu.touchmode_margin  側邊模式,隻在螢幕側邊滑動才能打開,中心滑動不能打開

slidingmenu.touchmode_none    禁止觸摸模式,不能夠通過觸摸打開,隻能夠通過slidingmenu().toggle()打開或者是關閉

(3)設定側滑欄顯示動畫

通過slidingmenu.setbehindcanvastransformer(canvastransformer);方法可以設定側滑欄的顯示動畫,參數是一個canvastransformer對象。下面是幾個常見的動畫的設定

折疊動畫

SlidingMenu最新版本使用詳解
SlidingMenu最新版本使用詳解

new canvastransformer() {  

            @override  

            public void transformcanvas(canvas canvas, float percentopen) {  

                canvas.scale(percentopen, 1, 0, 0);  

            }             

        }  

放縮動畫

SlidingMenu最新版本使用詳解
SlidingMenu最新版本使用詳解

                float scale = (float) (percentopen*0.25 + 0.75);  

                canvas.scale(scale, scale, canvas.getwidth()/2, canvas.getheight()/2);  

            }  

上升動畫

SlidingMenu最新版本使用詳解
SlidingMenu最新版本使用詳解

private static interpolator interp = new interpolator() {  

        @override  

        public float getinterpolation(float t) {  

            t -= 1.0f;  

            return t * t * t + 1.0f;  

        }         

    };  

                canvas.translate(0, canvas.getheight()*(1-interp.getinterpolation(percentopen)));  

    其他的更多屬性,請自己查閱示例代碼。

繼續閱讀