本文来自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的演示效果如下:

这个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给删掉了!

 

Android提高第十九篇之"多方向"抽屉--转的更多相关文章

  1. Android提高第十二篇之蓝牙传感应用

        请问淘宝上买的单片机蓝牙模块与安卓/android手机通讯的时候需要设置UUID吗? 2013-02-15 09:39 在世张辽 | 浏览 2769 次 想用安卓手机和单片机通过蓝牙模块通讯, ...

  2. Python之路【第十九篇】:爬虫

    Python之路[第十九篇]:爬虫   网络爬虫(又被称为网页蜘蛛,网络机器人,在FOAF社区中间,更经常的称为网页追逐者),是一种按照一定的规则,自动地抓取万维网信息的程序或者脚本.另外一些不常使用 ...

  3. Egret入门学习日记 --- 第十九篇(书中 8.8~8.10 节 内容)

    第十九篇(书中 8.8~8.10 节 内容) 开始 8.8节. 重点: 1.类型推断. 2.类型强制转换,使其拥有代码提示功能. 3.除了TS自带的类型判断,Egret官方也提供了类型判断的方法. 操 ...

  4. Android UI开发第三十九篇——Tab界面实现汇总及比较

    Tab布局是iOS的经典布局,Android应用中也有大量应用,前面也写过Android中TAb的实现,<Android UI开发第十八篇——ActivityGroup实现tab功能>.这 ...

  5. Android提高第十一篇之模拟信号示波器

    上次简单地介绍了AudioRecord和AudioTrack的使用,这次就结合SurfaceView实现一个Android版的手机模拟信号示波器(PS:以前也讲过J2ME版的手机示波器).最近物联网炒 ...

  6. Android UI开发第二十九篇——Android中五种常用的menu(菜单)

    Android Menu在手机的应用中起着导航的作用,作者总结了5种常用的Menu. 1.左右推出的Menu 前段时间比较流行,我最早是在海豚浏览器中看到的,当时耳目一新.最早使用左右推出菜单的,听说 ...

  7. <Android 基础(十九)> CoordinatorLayout

    介绍 CoordinatorLayout,中文翻译,协调布局,顾名思义,此布局中的子View之间,子View与父布局之间应该是可以协调工作的,如何协调,Behavior. 今天看下Android St ...

  8. 第十九篇 -- QTableWidget的使用

    QTableWidget的一些常用方法 下面两个类可以根据自己的情况自定义. 单元格类型的类: class CellType(Enum): ctKey = 1000 ctPath = 1001 ctI ...

  9. 第二十九篇:使用SOUI的SMCListView控件

    列表控件是客户端应用最常用的控件之一.列表控件通常只负责显示数据,最多通知一下APP列表行的选中状态变化. 现在的UI经常要求程序猿在列表控件里不光显示内容,还要能和用户交互,显示动画等等,传统的列表 ...

随机推荐

  1. jQuery实例2

    下拉框实例: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UT ...

  2. CentOS 6.0找不到ifcfg-eth0解决方案

    症状:     /etc/sysconfig/network-scripts/中只有ifcfg-lo文件,而没有ifcfg-eth0. 终端中执行命令ifconfig显示的信息为ifcfg-lo的信息 ...

  3. 为什么 dll 改名字之后无法使用

    有人直接把dll名字改了,我的程序运行出错,说这是我程序的问题,难道真是这样吗? 总感觉直接改dll名字不对,但哪儿不对呢,带着这样的疑惑研究了一下,重新做了一下试验,结果程序抛出了错误: Could ...

  4. velocity 高亮显示

    velocity模板在eclipse中高亮显示的链接 http://download.eclipse.org/eclipse/updates/4.4http://veloeclipse.googlec ...

  5. Openjudge-计算概论(A)-简单算术表达式求值

    描述: 两位正整数的简单算术运算(只考虑整数运算),算术运算为: +,加法运算:-,减法运算:*,乘法运算:/,整除运算:%,取余运算. 算术表达式的格式为(运算符前后可能有空格):运算数 运算符 运 ...

  6. Openjudge-计算概论(A)-判断闰年

    描述: 判断某年是否是闰年.输入输入只有一行,包含一个整数a(0 < a < 3000)输出一行,如果公元a年是闰年输出Y,否则输出N样例输入 2006 样例输出 N 提示:公历纪年法中, ...

  7. Core Animation之多种动画效果

    前面介绍了Core Animation基础知识,还有CALayer的简单使用,最终还是有要动画的滴,这里列出几个动画效果,参考下能加深对Core Animation的认识和理解 1.把图片移到右下角变 ...

  8. IMAGE服务器软件配置

    NFS: vim /etc/exports /bak/www/www.xxxl.com/public/ 10.20.10.0/24(rw,sync,no_root_squash)/bak/www/ww ...

  9. 【Machine Learning in Action --5】逻辑回归(LogisticRegression)

    1.概述 Logistic regression(逻辑回归)是当前业界比较常用的机器学习方法,用于估计某种事物的可能性. 在经典之作<数学之美>中也看到了它用于广告预测,也就是根据某广告被 ...

  10. [转]html 移动互联网终端的javascript touch事件,touchstart, touchend, touchmove

    前言 如果我们允许用户在页面上用类似桌面浏览器鼠标手势的方式来控制WEB APP,这个页面上肯定是有很多可点击区域的,如果用户触摸到了那些可点击区域怎么办呢??诸如智能手机和平板电脑一类的移动设备通常 ...