Android選單側滑特效實現

2021-08-27 14:39:49 字數 4058 閱讀 3546

人人客戶端有乙個特效還是挺吸引人的,在主介面手指向右滑動,就可以將選單展示出來,而主介面會被隱藏大部分,但是仍有左側的一小部分同選單一起展示。在乙個activity的布局中需要有兩部分,乙個是選單(menu)的布局,乙個是內容(content)的布局。兩個布局橫向排列,選單布局在左,內容布局在右。初始化的時候將選單布局向左偏移,以至於能夠完全隱藏,這樣內容布局就會完全顯示在activity中。然後通過監聽手指滑動事件,來改變選單布局的左偏移距離,從而控制選單布局的顯示和隱藏。首先在eclipse中新建乙個android專案,專案名就叫做renrenslidemenudemo。然後寫一下布局檔案,建立或開啟layout目錄下的activity_main.xml檔案,加入如下**:

這個布局檔案的最外層布局是乙個linearlayout,排列方向是水平方向排列。這個linearlayout下面巢狀了兩個子linearlayout,分別就是選單的布局和內容的布局。這裡為了要讓布局盡量簡單,選單布局和內容布局裡面沒有加入任何控制項,只是給這兩個布局各新增了一張背景,這兩張背景是我從人人客戶端上截下來的圖。這樣我們可以把注意力都集中在如何實現滑動選單的效果上面,不用關心裡面各種複雜的布局了。

建立或開啟mainactivity,這個類仍然是程式的主activity,也是這次demo唯一的activity,在裡面加入如下**:

public class mainactivity extends activity implements ontouchlistener 

/*** 初始化一些關鍵性資料。包括獲取螢幕的寬度,給content布局重新設定寬度,給menu布局重新設定寬度和偏移距離等。

*/private void initvalues()

@override

public boolean ontouch(view v, motionevent event) else

if (menuparams.leftmargin < leftedge) else if (menuparams.leftmargin > rightedge)

menu.setlayoutparams(menuparams);

break;

case motionevent.action_up:

// 手指抬起時,進行判斷當前手勢的意圖,從而決定是滾動到menu介面,還是滾動到content介面

xup = event.getrawx();

if (wanttoshowmenu()) else

} else if (wanttoshowcontent()) else

}recyclevelocitytracker();

break;

} return true;

} /**

* 判斷當前手勢的意圖是不是想顯示content。如果手指移動的距離是負數,且當前menu是可見的,則認為當前手勢是想要顯示content。

* * @return 當前手勢想顯示content返回true,否則返回false。

*/private boolean wanttoshowcontent()

/*** 判斷當前手勢的意圖是不是想顯示menu。如果手指移動的距離是正數,且當前menu是不可見的,則認為當前手勢是想要顯示menu。

* * @return 當前手勢想顯示menu返回true,否則返回false。

*/private boolean wanttoshowmenu()

/*** 判斷是否應該滾動將menu展示出來。如果手指移動距離大於螢幕的1/2,或者手指移動速度大於snap_velocity,

* 就認為應該滾動將menu展示出來。

* * @return 如果應該滾動將menu展示出來返回true,否則返回false。

*/private boolean shouldscrolltomenu()

/*** 判斷是否應該滾動將content展示出來。如果手指移動距離加上menupadding大於螢幕的1/2,

* 或者手指移動速度大於snap_velocity, 就認為應該滾動將content展示出來。

* * @return 如果應該滾動將content展示出來返回true,否則返回false。

*/private boolean shouldscrolltocontent()

/*** 將螢幕滾動到menu介面,滾動速度設定為30.

*/private void scrolltomenu()

/*** 將螢幕滾動到content介面,滾動速度設定為-30.

*/private void scrolltocontent()

/*** 建立velocitytracker物件,並將觸控content介面的滑動事件加入到velocitytracker當中。

* * @param event

* content介面的滑動事件

*/private void createvelocitytracker(motionevent event)

mvelocitytracker.addmovement(event);

} /**

* 獲取手指在content介面滑動的速度。

* * @return 滑動速度,以每秒鐘移動了多少畫素值為單位。

*/private int getscrollvelocity()

/*** **velocitytracker物件。

*/private void recyclevelocitytracker()

class scrolltask extends asynctask

if (leftmargin < leftedge)

publishprogress(leftmargin);

// 為了要有滾動效果產生,每次迴圈使執行緒睡眠20毫秒,這樣肉眼才能夠看到滾動動畫。

sleep(20);

}if (speed[0] > 0) else

return leftmargin;

} @override

protected void onprogressupdate(integer... leftmargin)

@override

protected void onpostexecute(integer leftmargin)

} /**

* 使當前執行緒睡眠指定的毫秒數。

* * @param millis

* 指定當前執行緒睡眠多久,以毫秒為單位

*/private void sleep(long millis) catch (interruptedexception e)

}}

全部的**都在這裡了,我們可以看到,加上注釋總共才兩百多行的**就能實現滑動選單的特效。下面我來對以上**解釋一下,首先初始化的時候呼叫initvalues方法,在這裡面將內容布局的寬度設定為螢幕的寬度,選單布局的寬度設定為螢幕的寬度減去menupadding值,這樣可以保證在選單布局展示的時候,仍有一部分內容布局可以看到。如果不在初始化的時候重定義兩個布局寬度,就會按照layout檔案裡面宣告的一樣,兩個布局都是fill_parent,這樣就無法實現滑動選單的效果了。然後將選單布局的左偏移量設定為負的選單布局的寬度,這樣選單布局就會被完全隱藏,只有內容布局會顯示在介面上。

之後給內容布局註冊監聽事件,這樣當手指在內容布局上滑動的時候就會觸發ontouch事件。在ontouch事件裡面,根據手指滑動的距離會改變選單布局的左偏移量,從而控制選單布局的顯示和隱藏。當手指離開螢幕的時候,會判斷應該滑動到選單布局還是內容布局,判斷依據是根據手指滑動的距離或者滑動的速度,細節可以看**中的注釋。

最後還是給出androidmanifest.xml的**,都是自動生成的,非常簡單:

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

好了,現在我們執行一下,看一下效果吧,首先是程式剛開啟的時候,顯示的是內容布局。用手指在介面向右滑動,可以看到選單布局出現。

側滑選單的實現

一般的側滑的實現 viewgroup menu content ontouchevent move viewgroup的 leftmargin up 根據現實選單的寬度,決定將其隱藏或者現實 1 scroller 2 leftmargin thread 今天,繼承 horizontalscrollv...

iOS開發 側滑選單的實現

實現 1.建立側邊欄選單的類,在.m檔案裡 import leftmenuview.h import masonry.h inte ce leftmenuview property nonatomic,strong uiview menuview end implementation leftmen...

Android 抽屜側滑效果

最近公司讓我又新寫乙個專案,然後裡面有個側換抽屜效果,我進行了編寫優化感覺效果比android原生的流暢很多,互動也很好,因此在此記錄一下,效果圖如下 廢話少說上原始碼 主頁面activity public class mainactivity exte nds baseactivity imple...