打造狂拽炫酷的主流自定義側滑控件--仿酷狗和QQ5.0集成控件

在上文中,我們實現了普通的側滑項目,在本篇中,咱們繼續完善上篇。這個效果是仿QQ5.0和酷狗側滑特效的。使用的話大家下載源碼看demo,頁很簡單。同樣,不上傳github了。使用請下載源碼直接複製進你的項目。

請把主界面的背景圖片改成你自己的佈局xml文件,使用include包含進去。include導入的主界面請使用LinearLayout父佈局。

具備非常強的視覺差特效。

我們來回顧下上篇文章的內容。點擊回顧自定義高級控件打造主流的側滑菜單控件

  • 計算屏幕寬度
  • 計算menu菜單界面和主界面寬度
  • 設置觸摸事件監聽(onTouchEvent)
  • 設置初始佈局位置(onLayout)在瞭解上篇內容之後,咱們現在加以拓展。咱們的目標效果是下面這樣。


 
  



在上面這個效果圖,我們可以看見有縮放動畫,有透明度變化,有平移動畫。
咱們的思路是怎麼樣的呢?咱們只需要在上篇基礎上加上滾動事件監聽。不過需要注意的是,計算縮放的進度技巧。
目前的動畫效果的有scale,translate,rotate旋轉等,還有透明度Alpha動畫以及漸變動畫等。咱們今天只用到了scale縮放和translate平移和透明度alpha變化。
我們需要導入一個快捷的View動畫的幫助工具類,這個百度可以隨便搜到,叫做nineoldandroidsjar。到最後我會提供給大家下載。裏面的ViewHelper封裝了動畫幫助的方法。
ok,我們需要充寫的方法是onScrollChanged方法。縮放進度怎麼計算呢? 其實很簡單,我們首先看到onScrollChanged(int l, int  t, int  oldl, int  oldt);這個方法,這個方法裏面的參數

  1. l當前的水平滾動位置
  2. t當前的垂直滾動位置
  3. oldl之前的水平滾動位置
  4. oldt之前的垂直滾動位置

縮放的scale參數最大值是1,那麼咱們隨着手指的滑動縮放應該是多少好呢?

通過當前水平滾動的位置,我們可以得到縮放進度,即水平滾動的距離 / 總距離。而菜單頁的總距離就是mMenuWidth。兩者的比值就可以當做一個進度值。那麼縮放的比例scale就等於1X進度。我們知道這些,於是我們可以將縮放的比例設置在0.7到1之間,scale縮放比例 = 0.7+0.3X進度比例 。然後透明度呢?我們可以同樣採用這種方法進行設置,alpha透明度 = 0.8+0.2X進度比例,這個可以通過實際測試而定。

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);
	}

ViewHelper類是nineoldandroidsjar裏面的,從上面看起來使用起來還是非常方便的。
加上上面的onScrollChanded方法,咱們以及實現了縮放等動畫效果。那麼我們要想更加精確地計算及得到更好體驗的滑動效果,還需要在手勢監聽中計算。
當手勢滑動的距離小於屏幕寬度的五分之一時候,我們滑不到預期位置,相反,我們可以滑動到預期位置。那麼如何實現呢? 這個地方我採用的方式是通過判斷menu菜單界面是否隱藏來作爲判斷值。

boolean flag = false;//用來標誌菜單界面不可見

我們重寫一下onTouchEvent方法。首先,我們得到按下的座標位置,然後再得到鬆開的座標位置,假設鬆開的橫座標爲X2,按下時候的橫座標爲X1.如果X2 - X1>0,就說明了向右滑動,反之,向左移動。那麼我們可以對其絕對值進行判斷,如果大於某個定值,就能滑到預期位置。小於就停在原位置。



我們先聲明一個標誌來判斷菜單界面是否可視,默認初始化是不可見的,所以設置爲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);
	}
	 

好了,到這爲止,咱們就完成了整個側滑SlidingMenu。

最後提供給大家源碼下載。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章