Android5.0的改版涉及到滑屏菜單以及tab菜單.關於滑屏菜單的實現網上有不少的實現方案.大多都是繼承實現ViewGroup,並對Touch事件進行攔截和處理.這裏個人實現方式並非如此.我僅僅是將界面的動畫部分封裝成一個控制類,來對menu的各類事件進行處理.這種方式是輕量級的實現.比起繼承的封裝來得簡便,但缺少總體性.至於tab菜單這裏並非使用系統的TabHost,而是封裝了一個TabGroup的控件,而且一個ActivityGroup來實現一個界面部分. android
SlidingMenuHelper主要是用來處理滑動動畫的幫助類,最核心的也便是對動畫的處理,剩下的界面部分依然是交還給調用方自行處理,這樣作的好處在於1.輕量級的封裝;2.界面依然按照原有的方式佈局,不須要關注滑動效果,有利於界面的升級. 佈局
下面就分析一下動畫部分.這裏實際上是經過View的layout的方法,讓界面滑動到指定的位置,這個動畫由一個TranslateAnimation來實現.經過計算控件的位置和滑動的目標位置達到控制動畫過程. 動畫
因爲這種方式極易被View.requestLayout()方法復原了偏移的位置,因此要在菜單view上treeView註冊一個OnGlobalLayoutListener,經過onGlobalLayout的回調使得在requestLayout 以前就把菜單強制滑到指定位置.參考代碼以下:
TranslateAnimation translateAnimation = null; spa
if (isMenuClicked) { 繼承
panelSliding.layout(0, panelSliding.getTop(), panelSliding.getWidth(), panelSliding.getBottom()); 事件
if(isShowAnimation){ get
translateAnimation = new TranslateAnimation(Animation.ABSOLUTE, mMenuWidth, Animation.ABSOLUTE, 0, Animation.RELATIVE_TO_SELF, 0.0f, Animation.RELATIVE_TO_SELF, 0.0f); it
} io
} else { List
panelSliding.layout(mMenuWidth, panelSliding.getTop(), mMenuWidth + panelSliding.getWidth(), panelSliding.getBottom());
if(isShowAnimation){
translateAnimation = new TranslateAnimation(Animation.ABSOLUTE, -mMenuWidth, Animation.ABSOLUTE, 0, Animation.RELATIVE_TO_SELF, 0.0f, Animation.RELATIVE_TO_SELF, 0.0f);
}
}
android系統提供的TabHost和TabActivity也是能夠實現tab的效果,可是這樣組合被限定了不少,須要自定義修改的對方也不少,因此這2者之間的是強制依賴關係.而且5.0的界面中有不少處會用到tab這樣的控件.基於上訴的狀況,就分別實現了一個TabGroup和基類AbstractActivityGroup.這2個之間是弱耦合的.
TabGroup,最主要的是由RadioGroup來實現的.而且動態的註冊tab.依據註冊的tab來生成界面.參考代碼以下:
AbstractActivityGroup天然是繼承了ActivityGroup,最主要的是是間接的處理了LocalActivityManager和關ContentView部分.而且經過反射的方式修復了Destroy Activity的一個bug.參考代碼以下: