Android提高之多方向抽屉实现方法
2023-06-13 09:15:41 时间
说起在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后,抽屉瞬间弹出然后瞬间回收(版本日期为Feb3,2009)。把原Panel的OnTouchListener加以替换,即以下代码:
OnTouchListenertouchListener=newOnTouchListener(){ intinitX; intinitY; booleansetInitialPosition; publicbooleanonTouch(Viewv,MotionEventevent){ if(mState==State.ANIMATING){ //weareanimating returnfalse; } //Log.d(TAG,"state:"+mState+"x:"+event.getX()+"y:"+event.getY()); intaction=event.getAction(); if(action==MotionEvent.ACTION_DOWN){ if(mBringToFront){ bringToFront(); } initX=0; initY=0; if(mContent.getVisibility()==GONE){ //sincewemaynotknowcontentdimensionsweusefactorshere if(mOrientation==VERTICAL){ initY=mPosition==TOP?-1:1; }else{ initX=mPosition==LEFT?-1:1; } } setInitialPosition=true; }else{ if(setInitialPosition){ //nowweknowcontentdimensions,sowemultiplyfactors... initX*=mContentWidth; initY*=mContentHeight; //...andsetinitialpanel"sposition mGestureListener.setScroll(initX,initY); setInitialPosition=false; //foroffsetLocationwehavetoinvertvalues initX=-initX; initY=-initY; } //offseteveryACTION_MOVE&ACTION_UPevent event.offsetLocation(initX,initY); } if(!mGestureDetector.onTouchEvent(event)){ if(action==MotionEvent.ACTION_UP){ //tupupafterscrolling post(startAnimation); } } returnfalse; } };
替换为:
OnTouchListenertouchListener=newOnTouchListener(){ floattouchX,touchY; publicbooleanonTouch(Viewv,MotionEventevent){ if(mState==State.ANIMATING){ //weareanimating returnfalse; } intaction=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){ //tupupafterscrolling intsize=(int)(Math.abs(touchX-event.getX())+Math .abs(touchY-event.getY())); if(size==mContentWidth||size==mContentHeight){ mState=State.ABOUT_TO_ANIMATE; //Log.e("size",String.valueOf(size)); //Log.e(String.valueOf(mContentWidth),String.valueOf(mContentHeight)); } post(startAnimation); } } returnfalse; } };
即可修复这个bug,并且也同样实现了OnClickListener的功能,可以把原Panel的OnClickListener给删掉了!
希望本文所述实例对于大家进行Android项目开发能有所帮助。
相关文章
- android 常用加密,分享一下Android各种类型的加密
- strictmode android,Android中的StrictMode
- android scaleanimation动画,Android 的ScaleAnimation 缩放动画基本运用
- Android 编译_android线程
- 【Android 异步操作】线程池 ( 线程池 execute 方法源码解析 )
- 【Android 逆向】Android 逆向方法 ( 静态逆向解析 | 函数调用分析 | 动态运行跟踪 | 运行日志分析 | 文件格式解析 | 敏感信息分析 | 网络信息监控 | 环境伪装模拟 )
- Github iOS 和 Android 客户端正式发布
- 实现Android客户端连接MySQL数据库的方法(安卓连接mysql数据库)
- android+json+php+mysql实现用户反馈功能方法解析
- android加载本地联系人实现方法
- Android网络图片查看显示的实现方法
- Android按后退键退出Android程序的实现方法
- 解析Android中如何做到Service被关闭后又自动启动的实现方法
- Android使用Pull方法解析XML文件的方法
- Android开机自启动服务的实现方法
- Android设置桌面背景图片的实现方法
- Android中应用界面主题Theme使用方法和页面定时跳转应用
- Android实现左右滑动效果的方法详解
- android自定义RadioGroup可以添加多种布局的实现方法
- android设置控件的颜色字体的方法
- android解析json数据格式的方法
- android获取屏幕高度和宽度的实现方法
- Android提高之SQLite分页表格实现方法
- Android实现获取未接来电和未读短信数量的方法
- Android双击返回键退出程序的实现方法
- Android中通过view方式获取当前Activity的屏幕截图实现方法