转自http://www.apkbus.com/forum.php?mod=viewthread&tid=23965&reltid=60171&pre_thread_id=0&pre_pos=3&ext=

在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的演示效果如下:

多方向抽屉效果_第1张图片

这个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. };

更多相关文章

  1. Android控件开发
  2. Android 微光闪烁效果之更强Shimmer-android
  3. 2011.07.05(4)——— android 抖动效果
  4. Android 调用相册 拍照 实现系统控件缩放 切割图片
  5. android 自定义时间控件
  6. androidの高仿支付宝扫描动画效果
  7. Android之设置ListView数据显示的动画效果

随机推荐

  1. Android中pm命令用法详解
  2. Android一键锁屏源码
  3. android shape的使用
  4. Android自带Music播放器更新播放时间和进
  5. Android架构分析之使用自定义硬件抽象层(
  6. Android(安卓)adb安装apk时提示Invalid A
  7. Java編程和Android編程的區別
  8. Android(安卓)Studio GsonFormat插件的使
  9. Android(安卓)requires compiler complia
  10. 如何解决Eclipse开发android程序的编译错