Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> 使用slidingMenu實現簡單的側滑欄

使用slidingMenu實現簡單的側滑欄

編輯:關於Android編程

首先要感謝各位國內外大神無私奉獻的精神

最近APP需要做一個側滑欄,查閱了一些資料後發現使用SlidingMenuS實現比較簡單,這裡做下筆記,方便以後有需要方便使用。

(1)准備資源項目:
首先去https://github.com/jfeinstein10/SlidingMenu(SlidingMenu在GitHub的下載地址)下載資源項目。然後去
https://github.com/JakeWharton/ActionBarSherlock下載ActionBarSherlock資源項目,這裡解釋一下,因為 SlidingMenu依附於另一個開源項目ActionBarSherlock,所以需要將ActionBarSherlock也下載下來。下載頁面如下圖:
在這裡下載

下載好後分別將這2個項目導入到eclipse中:

這裡寫圖片描述
這裡寫圖片描述

方法:<喎?/kf/ware/vc/" target="_blank" class="keylink">vc3Ryb25nPiBGaWxlLSZndDtJbXBvcnQtJmd0O0V4aXN0aW5nIEFuZHJvaWQgQ29kZSBJbnRvIFdvcmtzcGFjZS0mZ3Q7U2VsZWN0IHJvb3QgZGlyZWN0b3J5PGJyIC8+DQo8aW1nIGFsdD0="這裡寫圖片描述" src="/uploadfile/Collfiles/20160513/20160513091706377.png" title="\" />
這裡寫圖片描述
在Browse這裡選擇你存放這2個項目的地方後finish


(2)將SlidingMenu整合到自己的項目:
將這2個資源項目整合到自己的新建或已建好的項目中,在這之前要特別注意一點:上面那2個資源文件的存儲路徑要和自己的項目在同一存儲路徑,且路徑不要有中文。這裡我可能說的不太清楚,就比如你自己的項目在D->stor下,這2個資源文件你也要放在這個 目錄下。

方法就是右鍵自己的項目,選擇Properties->Android->Add->然後選擇你要添加的作為library的資源文件
這裡寫圖片描述

在這裡選擇這2個資源文件
這裡寫圖片描述
導入成功後應該是醬紫的:
這裡寫圖片描述

導入後在你新建類繼承SlidingFragmentActivity類可能出現The hierarchy of the type MainActivity is inconsistent錯誤,這裡最大的可能就是因為v4包不一致,你就直接把SlidingMenu和ActionBarSherlock下的libs下的v4包換成你自己項目的v4包就可以了。

如果還有其他問題,可以參考這篇文章:
http://my.oschina.net/totemzl/blog/225266


接下來就是使用了
我這裡使用Fragment作為側滑菜單的布局容器。所以要繼承SlidingFragmentActivity


源碼在下面,這裡就先大概說一下:
首先這是我主界面的xml布局,名字為right,沒什麼好說的,就一個圖片加一個TextView

<linearlayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:gravity="center" android:id="@+id/llright" android:orientation="vertical">

    <imageview android:layout_height="wrap_content" android:layout_width="wrap_content" android:src="@drawable/ic_launcher">

    <textview android:layout_height="wrap_content" android:layout_width="wrap_content" android:textsize="20sp" android:layout_margintop="30dp" android:layout_gravity="center" android:text="這是右邊的Fragment">

</textview></imageview></linearlayout></code>

接下來是側邊欄的布局,名字為left,一張圖片加上一個listview

<linearlayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:background="@drawable/ll" android:orientation="vertical">

    <imageview android:layout_height="wrap_content" android:layout_width="wrap_content" android:src="@drawable/tiantiansifangmao">

    <listview android:id="@+id/listView1" android:layout_width="match_parent" android:layout_height="wrap_content">
    </listview>

</imageview></linearlayout>
</code>

如果使用fragment,可以將側邊欄設置為一個fragment,名字為LeftList,代碼如下:

package com.cmmr.guligu;

import java.util.Arrays;
import java.util.List;

import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.ListAdapter;
import android.widget.ListView;

public class LeftList extends Fragment {
    private View mView;
    private ListView listView;
    private List mList = Arrays
            .asList("個人中心", "設置", "秦夕顏", "千甄拳", "不知道","洪玄公","千夫長");
    private ListAdapter mAdapter;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
        if(mView == null){
            initView(inflater, container);
        }
        return mView;
    }

    private void initView(LayoutInflater inflater, ViewGroup container) {
        mView = inflater.inflate(R.layout.left, container, false);
        listView = (ListView) mView
                .findViewById(R.id.listView1);
        mAdapter = new ArrayAdapter(getActivity(),
                android.R.layout.simple_list_item_1, mList);
        listView.setAdapter(mAdapter);
    }
}

MAinActivity:

package com.cmmr.guligu;

import android.graphics.Canvas;
import android.os.Bundle;
import android.support.v4.app.FragmentTransaction;
import android.view.Window;

import com.jeremyfeinstein.slidingmenu.lib.SlidingMenu;
import com.jeremyfeinstein.slidingmenu.lib.SlidingMenu.CanvasTransformer;
import com.jeremyfeinstein.slidingmenu.lib.app.SlidingFragmentActivity;

public class MainActivity extends SlidingFragmentActivity {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        super.onCreate(savedInstanceState);
        this.requestWindowFeature(Window.FEATURE_NO_TITLE);
        setContentView(R.layout.right);

        // 設置存放側滑欄的容器的布局文件
        setBehindContentView(R.layout.left_menu_frame);

        // 將側滑欄的fragment類填充到側滑欄的容器的布局文件中
        FragmentTransaction transaction = getSupportFragmentManager()
                .beginTransaction();
        LeftList fragment = new LeftList();
        transaction.replace(R.id.id_left_menu_frame, fragment);
        transaction.commit();

        SlidingMenu menu = getSlidingMenu();
        // menu.setMode(SlidingMenu.LEFT);
        // 設置觸摸模式,可以選擇全屏劃出,或者是邊緣劃出,或者是不可劃出,這裡為全屏劃出
        menu.setTouchModeAbove(SlidingMenu.TOUCHMODE_FULLSCREEN);
        // 設置側滑欄完全展開之後,距離另外一邊的距離,單位px,設置的越大,側滑欄的寬度越小
        menu.setShadowWidthRes(R.dimen.shadow_width);
        // 設置陰影的顏色
        menu.setShadowDrawable(R.drawable.shadow);

        // 設置側滑欄顯示動畫為折疊動畫
        menu.setBehindCanvasTransformer(new CanvasTransformer() {
            @Override
            public void transformCanvas(Canvas canvas, float percentOpen) {
                canvas.scale(percentOpen, 1, 0, 0);
            }
        });

        // 設置滑動菜單視圖的寬度
        menu.setBehindOffsetRes(R.dimen.slidingmenu_offset);
        // 設置漸入漸出效果的值。范圍是0-1.0f,設置的越大,則在側滑欄剛劃出的時候, 顏色就越暗。1.0f的時候,顏色為全黑剛劃出的時候,
        menu.setFadeDegree(0.3f);
    }
}

這裡要說明一下,在MainActivity中的left_menu_frame的布局文件為:

<framelayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/id_left_menu_frame" android:layout_width="match_parent" android:layout_height="match_parent"></framelayout></code>

這個是一個比較固定的寫法。

在資源文件values的dimens中添加2條:

280dp
15dp

以便在設置中方便使用。


// 設置陰影的顏色
menu.setShadowDrawable(R.drawable.shadow);
中的shadow布局如下:

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

    <gradient android:endcolor="#ff444444" android:startcolor="#00000000">

</gradient></shape></code>

在Activity中動態添加Fragment的方法如下(這是我學習過程中截得圖o(╯□╰)o):
這裡寫圖片描述

應該沒有別的什麼了吧,最後是效果圖(用的平板做的測試,還有我不會弄動態圖,只能弄2張圖片了,小白一個,見諒見諒)
這裡寫圖片描述
這裡描述


最後在從別人那裡搜集一些常用屬性什麼的給大家供大家參考吧:
(1)雙側滑欄
我們可以通過下面的代碼實現雙側滑欄的效果

@Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //設置左邊的側滑欄
        getSlidingMenu().setMode(SlidingMenu.LEFT_RIGHT);
           getSlidingMenu().setTouchModeAbove(SlidingMenu.TOUCHMODE_FULLSCREEN);
        setContentView(R.layout.content_frame);
        getSupportFragmentManager().beginTransaction()
                .replace(R.id.content_frame, new SampleListFragment()).commit();
        //設置右邊的側滑欄
        getSlidingMenu().setSecondaryMenu(R.layout.menu_frame_two);
        getSlidingMenu().setSecondaryShadowDrawable(R.drawable.shadowright);
        getSupportFragmentManager().beginTransaction()
                .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對象。下面是幾個常見的動畫的設置

折疊動畫

new CanvasTransformer() {
            @Override
            public void transformCanvas(Canvas canvas, float percentOpen) {
                canvas.scale(percentOpen, 1, 0, 0);
            }           
        }

放縮動畫

new CanvasTransformer() {
            @Override
            public void transformCanvas(Canvas canvas, float percentOpen) {
                float scale = (float) (percentOpen*0.25 + 0.75);
                canvas.scale(scale, scale, canvas.getWidth()/2, canvas.getHeight()/2);
            }
        }

上升動畫
private static Interpolator interp = new Interpolator() {
        @Override
        public float getInterpolation(float t) {
            t -= 1.0f;
            return t * t * t + 1.0f;
        }       
    };

new CanvasTransformer() {
            @Override
            public void transformCanvas(Canvas canvas, float percentOpen) {
                canvas.translate(0, canvas.getHeight()*(1-interp.getInterpolation(percentOpen)));
            }           
        }

SlidingMenu 常用屬性介紹:

menu.setMode(SlidingMenu.LEFT);//設置左滑菜單

menu.setTouchModeAbove(SlidingMenu.TOUCHMODE_FULLSCREEN);//設置滑動的屏幕局限,該設置為全屏區域都可以滑動

menu.setShadowDrawable(R.drawable.shadow);//設置暗影

menu.setShadowWidthRes(R.dimen.shadow_width);//設置暗影的寬度

menu.setBehindOffsetRes(R.dimen.slidingmenu_offset);//SlidingMenu劃出時主頁面顯示的剩余寬度

menu.setBehindWidth(400);//設置SlidingMenu菜單的寬度

menu.setFadeDegree(0.35f);//SlidingMenu滑動時的漸變程度

menu.attachToActivity(this, SlidingMenu.SLIDING_CONTENT);//使SlidingMenu附加在Activity上

menu.setMenu(R.layout.menu_layout);//設置menu的布局文件

menu.toggle();//動態斷定主動封閉或開啟SlidingMenu

menu.showMenu();//顯示SlidingMenu

menu.showContent();//顯示內容

menu.setOnOpenListener(onOpenListener);//slidingmenu打開

關於封閉menu有兩個,簡單的來說,對於menu close事務,一個是when,一個是after

menu.OnClosedListener(OnClosedListener);//slidingmenu封閉時事務

menu.OnClosedListener(OnClosedListener);//slidingmenu封閉後事務

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved