在上文中,我們實現了普通的側滑項目,在本篇中,咱們繼續完善上篇。這個效果是仿QQ5.0和酷狗側滑特效的。使用的話大家下載源碼看demo,頁很簡單。同樣,不上傳github了。使用請下載源碼直接複製進你的項目。
請把主界面的背景圖片改成你自己的佈局xml文件,使用include包含進去。include導入的主界面請使用LinearLayout父佈局。
具備非常強的視覺差特效。
我們來回顧下上篇文章的內容。點擊回顧自定義高級控件打造主流的側滑菜單控件
- 計算屏幕寬度
- 計算menu菜單界面和主界面寬度
- 設置觸摸事件監聽(onTouchEvent)
- 設置初始佈局位置(onLayout)在瞭解上篇內容之後,咱們現在加以拓展。咱們的目標效果是下面這樣。
- l當前的水平滾動位置
- t當前的垂直滾動位置
- oldl之前的水平滾動位置
- oldt之前的垂直滾動位置
protected void onScrollChanged(int l, int t, int oldl, int oldt) {
super.onScrollChanged(l, t, oldl, oldt);
//縮放比例
float scale = (float)l/mMenuWidth;
Log.e("TAG", scale+"");
//左菜單縮放
float scaleLeft = 1-0.3f*scale;
ViewHelper.setScaleX(mMenuLayout, scaleLeft);
ViewHelper.setScaleY(mMenuLayout, scaleLeft);
//透明度縮放
float alphaLeft = 1- scale;
ViewHelper.setAlpha(mMenuLayout, alphaLeft);
//主界面
float scaleRight = 0.93f + scale * 0.07f;
ViewHelper.setScaleX(mMainLayout, scaleRight);
ViewHelper.setScaleY(mMainLayout, scaleRight);
//視覺差平移
ViewHelper.setTranslationX(mMenuLayout, mMenuWidth * scale);
}
boolean flag = false;//用來標誌菜單界面不可見
if(flag == false){
//當menu菜單界面不可見時
...
//對座標改變的絕對值進行判斷
...
}else{
//當menu菜單界面可見時
...
//對座標改變的絕對值進行判斷
}
public boolean onTouchEvent(MotionEvent ev) {
switch (ev.getAction()) {
case MotionEvent.ACTION_DOWN:
downX = ev.getX();//按下的橫座標
break;
case MotionEvent.ACTION_UP:
upX = ev.getX();//鬆開的橫座標
d = upX - downX;//計算絕對值判斷是否滑動
float ds = Math.abs(d);
if(flag==false){
//左移
if(d<0){
this.smoothScrollTo(mMenuWidth, 0);
flag = false;
}
//右移
if(d>0){
if(ds>mScreenWidth/5){
this.smoothScrollTo(0, 0);
flag = true;//顯示
}else{
this.smoothScrollTo(mMenuWidth, 0);
flag = false;//隱藏
}
}
}else if(flag == true){
//左移
if(d<0){
if(ds<mScreenWidth/5){
this.smoothScrollTo(0, 0);
flag = true;
}else{
this.smoothScrollTo(mMenuWidth, 0);
flag = false;
}
}
//右移
if(d>0){
this.smoothScrollTo(0, 0);
flag = true;
}
}
return true;
default:
break;
}
return super.onTouchEvent(ev);
}