Android提高第十九篇之"多方向"抽屉

Android提高第十九篇之"多方向"抽屉

 在android上要实现类似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控件可以轻易实现不同方向的抽屉效果,比SlidingDrawer有更强的扩展性!

       在多次使用Panel的过程中,发现Panel有个bug,会间断性出现“闪烁”,也就是在onTouchListener里面的触发ACTION_DOWN后,抽屉瞬间弹出然后瞬间回收(版本日期为Feb 3, 2009)。把原Panel的OnTouchListener,即以下代码:

  1. OnTouchListener touchListener = new OnTouchListener() {
  2.                 int initX;
  3.                 int initY;
  4.                 boolean setInitialPosition;
  5.                 public boolean onTouch(View v, MotionEvent event) {
  6.                         if (mState == State.ANIMATING) {
  7.                                 // we are animating
  8.                                 return false;
  9.                         }
  10. //                        Log.d(TAG, "state: " + mState + " x: " + event.getX() + " y: " + event.getY());
  11.                         int action = event.getAction();
  12.                         if (action == MotionEvent.ACTION_DOWN) {
  13.                                 if (mBringToFront) {
  14.                                         bringToFront();
  15.                                 }
  16.                                 initX = 0;
  17.                                 initY = 0;
  18.                                 if (mContent.getVisibility() == GONE) {
  19.                                         // since we may not know content dimensions we use factors here
  20.                                         if (mOrientation == VERTICAL) {
  21.                                                 initY = mPosition == TOP? -1 : 1;
  22.                                         } else {
  23.                                                 initX = mPosition == LEFT? -1 : 1;
  24.                                         }
  25.                                 }
  26.                                 setInitialPosition = true;
  27.                         } else {
  28.                                 if (setInitialPosition) {
  29.                                         // now we know content dimensions, so we multiply factors...
  30.                                         initX *= mContentWidth;
  31.                                         initY *= mContentHeight;
  32.                                         // ... and set initial panel's position
  33.                                         mGestureListener.setScroll(initX, initY);
  34.                                         setInitialPosition = false;
  35.                                         // for offsetLocation we have to invert values
  36.                                         initX = -initX;
  37.                                         initY = -initY;
  38.                                 }
  39.                                 // offset every ACTION_MOVE & ACTION_UP event 
  40.                                 event.offsetLocation(initX, initY);
  41.                         }
  42.                         if (!mGestureDetector.onTouchEvent(event)) {
  43.                                 if (action == MotionEvent.ACTION_UP) {
  44.                                         // tup up after scrolling
  45.                                         post(startAnimation);
  46.                                 }
  47.                         }
  48.                         return false;
  49.                 }
  50.         };
复制代码
替换为:

  1. OnTouchListener touchListener = new OnTouchListener() {
  2.                 float touchX, touchY;

  3.                 public boolean onTouch(View v, MotionEvent event) {
  4.                         if (mState == State.ANIMATING) {
  5.                                 // we are animating
  6.                                 return false;
  7.                         }

  8.                         int action = event.getAction();
  9.                         if (action == MotionEvent.ACTION_DOWN) {
  10.                                 if (mBringToFront) {
  11.                                         bringToFront();
  12.                                 }
  13.                                 touchX = event.getX();
  14.                                 touchY = event.getY();
  15.                         }

  16.                         if (!mGestureDetector.onTouchEvent(event)) {
  17.                                 if (action == MotionEvent.ACTION_UP) {
  18.                                         // tup up after scrolling
  19.                                         int size = (int) (Math.abs(touchX - event.getX()) + Math
  20.                                                         .abs(touchY - event.getY()));

  21.                                         if (size == mContentWidth || size == mContentHeight) {
  22.                                                 mState = State.ABOUT_TO_ANIMATE;
  23.                                                 //Log.e("size", String.valueOf(size));
  24.                                                 //Log.e(String.valueOf(mContentWidth),String.valueOf(mContentHeight));
  25.                                         }

  26.                                         post(startAnimation);
  27.                                 }
  28.                         }
  29.                         return false;
  30.                 }
  31.         };
复制代码
即可修复这个bug,并且也同样实现了OnClickListener的功能,可以把原Panel的OnClickListener给删掉了!
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值