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

本文来自http://blog.csdn.net/hellogv/,引用必须注明出处!

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

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

这个Panel控件可以轻易实现不同方向的抽屉效果,比SlidingDrawer有更强的扩展性!

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

  1. OnTouchListenertouchListener=newOnTouchListener(){
  2. intinitX;
  3. intinitY;
  4. booleansetInitialPosition;
  5. publicbooleanonTouch(Viewv,MotionEventevent){
  6. if(mState==State.ANIMATING){
  7. //weareanimating
  8. returnfalse;
  9. }
  10. /Log.d(TAG,"state:"+mState+"x:"+event.getX()+"y:"+event.getY());
  11. intaction=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. //sincewemaynotknowcontentdimensionsweusefactorshere
  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. //nowweknowcontentdimensions,sowemultiplyfactors...
  30. initX*=mContentWidth;
  31. initY*=mContentHeight;
  32. //...andsetinitialpanel'sposition
  33. mGestureListener.setScroll(initX,initY);
  34. setInitialPosition=false;
  35. //foroffsetLocationwehavetoinvertvalues
  36. initX=-initX;
  37. initY=-initY;
  38. }
  39. //offseteveryACTION_MOVE&ACTION_UPevent
  40. event.offsetLocation(initX,initY);
  41. }
  42. if(!mGestureDetector.onTouchEvent(event)){
  43. if(action==MotionEvent.ACTION_UP){
  44. //tupupafterscrolling
  45. post(startAnimation);
  46. }
  47. }
  48. returnfalse;
  49. }
  50. };

替换为:

  1. OnTouchListenertouchListener=newOnTouchListener(){
  2. floattouchX,touchY;
  3. publicbooleanonTouch(Viewv,MotionEventevent){
  4. if(mState==State.ANIMATING){
  5. //weareanimating
  6. returnfalse;
  7. }
  8. intaction=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. //tupupafterscrolling
  19. intsize=(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. returnfalse;
  30. }
  31. };

即可修复这个bug,并且也同样实现了OnClickListener的功能,可以把原Panel的OnClickListener给删掉了!

你可能感兴趣的:(android)