天天看點

android 優化側滑按鈕,Android滑動優化高仿QQ6.0側滑菜單(滑動優化)

但是之前的實作,隻是簡單的可以顯示和隐藏左側的菜單,但是特别生硬,而且沒有任何平滑的趨勢,那麼今天就來優化一下吧,加上平滑效果,而且可以根據手勢滑動的方向來判斷是否是顯示和隐藏。

首先先來實作手勢判斷是否隐藏和顯示

這裡就要用到了一個方法了,如下:

這個是viewdradhelper裡面的方法:

@override

public void onviewreleased(view releasedchild, float xvel, float yvel) {

log.d("draglayout", "xvel : " + xvel + " yvel :" + yvel);

super.onviewreleased(releasedchild, xvel, yvel);

//判斷關閉和打開

//在這裡我們首先判斷什麼時候打開,然後剩下的都是關閉狀态

//首先是我的主面闆的左側具體螢幕左側已經大于mrange/2的距離并且右滑的速度大于0,此時打開

if (xvel >= 0 && mmaincontent.getleft() > mrange / 2.0f) {

open();

} else if (xvel > 0) {

//第二種就是我右滑的速度大于0(這裡的速度自己定義哈,根據自己想要實作的敏感度)

open();

} else {

//剩餘的所有情況都是關閉

close();

}

}

close()方法(draglayout裡面的方法):

public void close() {

int finalleft = 0;

//調用layout方法,擺放主布局

mmaincontent.layout(finalleft, 0, finalleft + mwidth, finalleft + mheight);

}

open()方法(draglayout裡面的方法):

public void open() {

int finalleft = mrange;

mmaincontent.layout(finalleft, 0, finalleft + mwidth, finalleft + mheight);

}

這個是否就可以實作根據手勢來判斷是否打開和關閉了。

接下來我們就來實作如何平滑的關閉和打開,話不多說,代碼說話(這裡對上面的open和close做了一些處理):

public void close() {

close(true);

}

public void close(boolean issmooth) {

int finalleft = 0;

if (issmooth) {

//1、觸發動畫

if (mdraghelper.smoothslideviewto(mmaincontent, finalleft, 0)) {

//參數傳this,也就是child所在的viewgroup

viewcompat.postinvalidateonanimation(this);

}

} else {

//調用layout方法,擺放主布局

mmaincontent.layout(finalleft, 0, finalleft + mwidth, finalleft + mheight);

}

}

public void open(boolean issmooth) {

int finalleft = mrange;

if (issmooth && mdraghelper.smoothslideviewto(mmaincontent, finalleft, 0)) {

//參數傳this,也就是child所在的viewgroup

viewcompat.postinvalidateonanimation(this);

} else {

mmaincontent.layout(finalleft, 0, finalleft + mwidth, finalleft + mheight);

}

}

public void open() {

open(true);

}

來看下效果圖吧(裡面的白道問題是錄屏導緻,運作的沒有這個哈):

android 優化側滑按鈕,Android滑動優化高仿QQ6.0側滑菜單(滑動優化)

這個時候,基本上差不多了,剩下的,我們就來添加一些狀态和設定listener的方法,留給外面的調用吧。,代碼很簡單:

private status mstatus = status.close;

public enum status {

close, open, draging;

}

private ondragstatuslistener mlistener;

public void setdragstatelistener(ondragstatuslistener listener) {

mlistener = listener;

}

public interface ondragstatuslistener {

void onclose();

void onopen();

void ondraging(float percent);

}

狀态更新,方法調用,這個dispatchdragevent()在onviewpositionchanged()這個方法中調用一下就行,因為拖拽的時候狀态時刻在變化,是以我們在這個方法中調用:

private void dispatchdragevent(int newleft) {

//得到的一個百分比

float percent = newleft * 1.0f / mrange;

//0.0f--->1.0f

log.d("draglayout", "percent : " + percent);

if (mlistener != null) {

mlistener.ondraging(percent);

}

//跟新狀态執行回調

status laststatus = mstatus;

mstatus = updatestatus(percent);

if (mstatus != laststatus) {

//狀态發生變化

if (mstatus == status.close) {

//目前狀态是關閉

if (mlistener != null) {

mlistener.onclose();

}

} else if (mstatus == status.open) {

if (mlistener != null) {

mlistener.onopen();

}

}

}

}

private status updatestatus(float percent) {

if (percent == 0) {

return status.close;

} else if (percent == 1) {

return status.open;

}

return status.draging;

}

好了,到此為止,高仿qq6.0側滑基本完成,下面我們來看下效果吧。

android 優化側滑按鈕,Android滑動優化高仿QQ6.0側滑菜單(滑動優化)

好了,這個側滑就這樣完成了,後期會加在首頁中加入listview(嘗試用recycleview)實作左滑删除效果,現在附上該demo的位址,後期添加的也會更新至此。