在android上要實現(xiàn)類似Launch的抽屜效果,大家一定首先會想起SlidingDrawer。SlidingDrawer是android官方控件之一,本文的主角不是它,而是民間的控件工具集合~~~android-misc-widgets。android-misc-widgets里面包含幾個widget:Panel、SmoothButton、Switcher、VirtualKeyboard,還有一些動畫特效,本文主要介紹抽屜容器Panel的用法。android-misc-widgets的google工程地址:-widgets/http://code.google.com/p/android-misc,工程代碼中Panel的演示效果如下:

這個Panel控件可以輕易實現(xiàn)不同方向的抽屜效果,比SlidingDrawer有更強的擴展性!
在多次使用Panel的過程中,發(fā)現(xiàn)Panel有個bug,會間斷性出現(xiàn)“閃爍”,也就是在onTouchListener里面的觸發(fā)ACTION_DOWN后,抽屜瞬間彈出然后瞬間回收(版本日期為Feb 3, 2009)。把原Panel的OnTouchListener,即以下代碼:
- OnTouchListener touchListener = new OnTouchListener() {
- int initX;
- int initY;
- boolean setInitialPosition;
- public boolean onTouch(View v, MotionEvent event) {
- if (mState == State.ANIMATING) {
-
- return false;
- }
- / Log.d(TAG, "state: " + mState + " x: " + event.getX() + " y: " + event.getY());
- int action = event.getAction();
- if (action == MotionEvent.ACTION_DOWN) {
- if (mBringToFront) {
- bringToFront();
- }
- initX = 0;
- initY = 0;
- if (mContent.getVisibility() == GONE) {
-
- if (mOrientation == VERTICAL) {
- initY = mPosition == TOP? -1 : 1;
- } else {
- initX = mPosition == LEFT? -1 : 1;
- }
- }
- setInitialPosition = true;
- } else {
- if (setInitialPosition) {
-
- initX *= mContentWidth;
- initY *= mContentHeight;
-
- mGestureListener.setScroll(initX, initY);
- setInitialPosition = false;
-
- initX = -initX;
- initY = -initY;
- }
-
- event.offsetLocation(initX, initY);
- }
- if (!mGestureDetector.onTouchEvent(event)) {
- if (action == MotionEvent.ACTION_UP) {
-
- post(startAnimation);
- }
- }
- return false;
- }
- };
替換為:
- OnTouchListener touchListener = new OnTouchListener() {
- float touchX, touchY;
-
- public boolean onTouch(View v, MotionEvent event) {
- if (mState == State.ANIMATING) {
-
- return false;
- }
-
- int action = event.getAction();
- if (action == MotionEvent.ACTION_DOWN) {
- if (mBringToFront) {
- bringToFront();
- }
- touchX = event.getX();
- touchY = event.getY();
- }
-
- if (!mGestureDetector.onTouchEvent(event)) {
- if (action == MotionEvent.ACTION_UP) {
-
- int size = (int) (Math.abs(touchX - event.getX()) + Math
- .abs(touchY - event.getY()));
-
- if (size == mContentWidth || size == mContentHeight) {
- mState = State.ABOUT_TO_ANIMATE;
-
-
- }
-
- post(startAnimation);
- }
- }
- return false;
- }
- };
即可修復這個bug,并且也同樣實現(xiàn)了OnClickListener的功能,可以把原Panel的OnClickListener給刪掉了!