android 滑動側邊欄 SlideMenu 源碼分析 以及使用手冊

來源:互聯網
上載者:User

標籤:android   slidemenu   左右滑動側邊欄   滑動側邊欄   

android 滑動側邊欄 SlideMenu 源碼分析 以及使用手冊




我們先看使用方式情節:




首先
public class MainActivity extends SlidingFragmentActivity 
繼承SlidingFragmentActivity ,這裡面在建立時有建立需要的slidemenu等相關資料。


在Oncreate裡面添加
private void init_sm() {
sm = getSlidingMenu();   // 擷取menu
sm.setMode(SlidingMenu.LEFT_RIGHT);// 設定為左右都有
sm.setTouchModeAbove(SlidingMenu.TOUCHMODE_FULLSCREEN);// 設定為右邊全螢幕模式
sm.setTouchModeBehind(SlidingMenu.TOUCHMODE_MARGIN);// 設定為左邊邊框模式
setBehindContentView(R.layout.slidingmenu_left);//左邊布局
sm.setSecondaryMenu(R.layout.slidingmeun_right);//右邊布局
sm.setRightBehindWidth(((MyApplication) getApplication())
.GetScreenWidth());// 使用這個將右側布局到全屏
}
這裡我們要詳細說明的為TOUCHMODE_FULLSCREEN這個參數,設定為這個參數後,右側的布局就沒法響應滑動訊息,因為全屏訊息都被slidemenu處理掉了。
因此我們需要修改如下:
sm.addIgnoredView(mPager);
使用此方法忽略點擊到mPager view的訊息。
設定忽略後這時你就需要使用 setOnTouchListener 來自己接收響應觸屏訊息


mPager.setOnTouchListener(new OnTouchListener() {
private float startx = -1, starty = -1, OffsetWidth;
private boolean hasdown = false;


@Override
public boolean onTouch(View v, MotionEvent event) {
int action = event.getAction();
boolean returns = false;
if (action == MotionEvent.ACTION_DOWN) {
startx = event.getX();
starty = event.getY();
hasdown = true;
} else if (action == MotionEvent.ACTION_UP
|| action == MotionEvent.ACTION_CANCEL
|| action == MotionEvent.ACTION_MASK) {
float x = event.getX();
float y = event.getY();
float xdiff = Math.abs(x - startx);
float ydiff = Math.abs(y - starty);
if (!(-1 == startx && -1 == starty)) {
if (OffsetWidth < 1)
OffsetWidth = (float) (MyApplication
.getApplication().GetScreenWidth() * 0.15);
if (hasdown && xdiff > ydiff * 2.2
&& xdiff > OffsetWidth) {
if (x > startx)// 
{
if (currIndex == 0) {
sm.toggle();
}
returns = false;
}// else if (startx > x)// 
// {
// if (currIndex == length - 1
// && !sm.isSecondaryMenuShowing())
// sm.showSecondaryMenu();
// }
}
}
hasdown = false;
startx = starty = -1;
}
return returns;
}
});



當前做法是
if (currIndex == 0) {
sm.toggle();
}
使用這個退出側邊欄。左邊是一個menu,簡單布局,右邊是個viewpage,所以滑動到最左側時,再滑動退出viewpage,進入主介面。
showMenu 和showSecondaryMenu 來操作顯示左右兩側的功能表列
使用上就這些注意點即可。


mainactivity的xml檔案為:


<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.example.atemp.MainActivity"
    tools:ignore="MergeRootFrame" >


    <FrameLayout
        android:id="@+id/container"
        android:layout_width="match_parent"
        android:layout_height="match_parent" >
    </FrameLayout>


</FrameLayout>


代碼將container加入布局為:


FragmentTransaction t = this.getSupportFragmentManager()
.beginTransaction();
centerFragment = new SampleListFragment();
centerFragment.setcontext(MainActivity.this);
t.add(R.id.container, centerFragment);
t.commit();

-------------------------
下面來進行剖析源碼:
首先,因為我們繼承public class MainActivity extends SlidingFragmentActivity 所以先研究這個SlidingFragmentActivity


查看oncreate 函數
        mHelper = new SlidingActivityHelper(this);
        mHelper.onCreate(savedInstanceState);
這個為關鍵屬性,後續很多介面都是透過它處理的。比如
    public SlidingMenu getSlidingMenu() {
        return mHelper.getSlidingMenu();
    }
所以我們要去看SlidingActivityHelper這個類
看mHelper.onCreate(savedInstanceState);這個函數
public void onCreate(Bundle savedInstanceState) {
mSlidingMenu = (SlidingMenu) LayoutInflater.from(mActivity).inflate(R.layout.slidingmenumain, null);
}
建立了關鍵屬性對象
R.layout.slidingmenumain 內容為:
<?xml version="1.0" encoding="utf-8"?>
<com.jeremyfeinstein.slidingmenu.lib.SlidingMenu xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/slidingmenumain"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent" />
如此slidingMenu則出現了。


關鍵第二個函數:
onPostCreate
裡面的方法:


mSlidingMenu.attachToActivity(mActivity, 
mEnableSlide ? SlidingMenu.SLIDING_WINDOW : SlidingMenu.SLIDING_CONTENT);


將自己掛到activity的根view上去
看這一段:
            case SLIDING_CONTENT:
                mActionbarOverlay = actionbarOverlay;
                // take the above view out of
                ViewGroup contentParent = (ViewGroup) activity.findViewById(android.R.id.content);
                View content = contentParent.getChildAt(0);
                contentParent.removeView(content);
                contentParent.addView(this);
                setContent(content);
                // save people from having transparent backgrounds
                if (content.getBackground() == null)
                    content.setBackgroundResource(background);
                break;
這裡處理邏輯為:
contentParent.addView(this);
將slidemenu加入到這個contentview裡面,將contentview作為當前activity的上下文使用 setContent(content);設定進來。
如此一來,此時slidemenu則會加進主介面。


隨後訊息則會先傳給CustomViewAbove.java 和 CustomViewBehind.java 兩個都是繼承了viewgroup,所以可以多添加幾個view。


因為slideingMenu把mViewAbove添加在後面,所以有優先響應訊息權利。然後再依據setContent(content);把有slidemenu的布局設定進來,如此一來,
頂部訊息則會傳給它
在 CustomViewAbove 的  onInterceptTouchEvent 和 onTouchEvent 會處理各類訊息,如此搭配起來,則最終實現左右側邊欄的功能。




主介面的container 觸屏流程為:都不響應才會傳給Touch up dispatch to com.jeremyfeinstein.slidingmenu.lib.CustomViewAbove


android 滑動側邊欄 SlideMenu 源碼分析 以及使用手冊

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.