文档章节

Android "多方向"抽屉

z.net
 z.net
发布于 2013/01/17 15:07
字数 552
阅读 905
收藏 7
点赞 0
评论 0

在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,即以下代码:

01 OnTouchListener touchListener = new OnTouchListener() {
02     int initX;
03     int initY;
04     boolean setInitialPosition;
05     public boolean onTouch(View v, MotionEvent event) {
06         if (mState == State.ANIMATING) {
07             // we are animating
08             return false;
09         }
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 };

替换为:

01 OnTouchListener touchListener = new OnTouchListener() {
02     float touchX, touchY;
03  
04     public boolean onTouch(View v, MotionEvent event) {
05         if (mState == State.ANIMATING) {
06             // we are animating
07             return false;
08         }
09  
10         int action = event.getAction();
11         if (action == MotionEvent.ACTION_DOWN) {
12             if (mBringToFront) {
13                 bringToFront();
14             }
15             touchX = event.getX();
16             touchY = event.getY();
17         }
18  
19         if (!mGestureDetector.onTouchEvent(event)) {
20             if (action == MotionEvent.ACTION_UP) {
21                 // tup up after scrolling
22                 int size = (int) (Math.abs(touchX - event.getX()) + Math
23                         .abs(touchY - event.getY()));
24  
25                 if (size == mContentWidth || size == mContentHeight) {
26                     mState = State.ABOUT_TO_ANIMATE;
27                     //Log.e("size", String.valueOf(size));
28                     //Log.e(String.valueOf(mContentWidth),String.valueOf(mContentHeight));
29                 }
30  
31                 post(startAnimation);
32             }
33         }
34         return false;
35     }
36 };

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

原文出处:http://blog.csdn.net/hellogv/article/details/6264706

本文转载自:http://www.oschina.net/question/54100_28627

共有 人打赏支持
z.net
粉丝 1
博文 98
码字总数 2607
作品 0
闵行
android SlidingDrawer滑动抽屉

SlidingDrawer(滑动式抽屉)隐藏屏外的内容,并允许用户拖拽一个handle以显示隐藏的内容。可以使用在请求的确认或拒绝位置 SlidingDrawer可以在垂直或者水平使用。它由两个子视图组成:一个...

amigos_wu
2012/06/26
0
0
android.support.v4.widget.DrawerLayout 抽屉效果导航菜单

抽屉效果导航菜单图示 如图所示,抽屉效果的导航菜单不用切换到另一个页面,也不用去按菜单的硬件按钮,直接在界面左上角的一个按钮点击,菜单就滑出来,而且感觉能放很多东西 概况:实现上图...

刘小米
2014/12/03
0
0
Navigation Drawer详解-Google推出的用来取代Sliding Menu的控件(一

相信Sliding Menu很多人都用过,在Android和iOS的app中,越来越多的开发者都会把自己的菜单界面放在一个列表里,然后让用户通过向右(或者向左)滑动的操作看到应用所有的功能。Google官方的...

科技创造
2014/10/07
0
0
不挤压已有布局的抽屉--左侧/右侧

在工作中需要实现不挤压已有布局的抽屉,拉出来是半屏,又不能挤压已有布局,要直接覆盖。搜了许多时间,最后四个方向采用了三种不同的实现方式,除了"下方"的SlidingDrawer是Android提供之外...

刘遇安
2013/02/18
0
1
当webview遇到了Slidingmenu,webView出现卡白,解决方案

Sliding Menu的是一种比较新的设置界面或配置界面效果,在主界面左滑或者右滑出现设置界面,能方便的进行各种操作。如Evernote、Google+、Foursquare等诸多优秀应用都采用了这种界面方案。效...

来自猩猩的茶
2013/11/04
0
6
Android SlidingDrawer 滑动抽屉效果

效果如上图,想必大家已经在很多应用中看到过了,下面来看看用SlidingDrawer 实现滑动抽屉效果 从Android1.5开始,加入了android.widget.SlidingDrawer类 SlidingDrawer控件的一些属性: an...

墨梅
2014/04/27
0
0
推荐使用的SlidingMenu组件

使用SlidingMenu的时候必须依赖两个组件: ActionBarSherlock: Action Bar是Android 3.0后才开始支持的,ActionBarSherlock是让Action Bar功能支持2.X后的所有平台,而且他会自动的判断是调用...

i_bobby
2013/09/26
0
8
谷歌发布 Android P Beta 3,已非常接近正式版

7月3日消息,今天谷歌推送了 Android P Beta 3,并表示,这是今年 Android P 开发者预览版的里程碑版本。由于开发者 API 已在上一次更新中完成,因此 Beta 3 现在非常接近将在今年夏天晚些时...

局长
07/03
0
14
Android性能优化:那些不可忽略的绘制优化

前言 在 开发中,性能优化策略十分重要 本文主要讲解性能优化中的绘制优化,希望你们会喜欢。 目录 // 方式2:在 BaseActivity 的 onCreate() 方法中使用下面的代码移除 优化方案2:移除 控件...

Carson_Ho
05/21
0
0
Android xml activity属性详解

例子: <activity android:allowTaskReparenting=["true" | "false"] android:alwaysRetainTaskState=["true" | "false"] android:clearTaskOnLaunch=["true" | "false"] android:configChan......

恰同学少年
2015/07/28
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

工作笔记

在list的for-each循环中,直接remove会报java.util.ConcurrentModificationException,但是在remove后面加上break就不会报错了 如果不是每次重新组装,提供出去的配置信息必须以深度克隆的方...

lost_keke
6分钟前
0
0
TensorFlow 退化学习率

随着训练次数的增多,开始时学习率较大,可以较快的收敛到最优解附近,之后学习率应该比较小 exponential_decay 设置每隔一定的学习步数就将学习率下降到指定标准 下面是每隔10步,学习率会下...

阿豪boy
7分钟前
0
0
01、centos7安装docker

1、首先在安装之前检查系统内核版本 [root@docker01 ~]# uname -r3.10.0-327.el7.x86_64[root@docker01 ~]# cat /etc/redhat-release CentOS Linux release 7.5.1804 (Core) [root@......

北岩
11分钟前
0
0
iptables filter表 nat表 应用实例

iptables基础实例 iptables -nvL 查看规则 [root@localhost ~]# iptables -nvLChain INPUT (policy ACCEPT 0 packets, 0 bytes) pkts bytes target prot opt in out source ......

李超小牛子
13分钟前
0
0
什么?你的私钥泄漏了?

代码签名是一种当代标准做法,其中软件开发人员通过可信证书颁发机构的验证,并接收可用于签署脚本和可执行文件的证书和私钥。 几乎每个设备,操作系统和网络浏览器都经过硬编码,以尽可能少...

亚洲诚信
17分钟前
1
0
Iterm2安装Zsh + Oh My Zsh+Solarized

安装Oh My Zsh curl -L https://raw.github.com/robbyrussell/oh-my-zsh/master/tools/install.sh | sh 安装Zsh: 1.安装zsh brew install zsh 2.配置iterm2 sudo vim /etc/shells输入:......

孟飞阳
25分钟前
0
0
缓解ddos攻击的有效解决办法

因为防火墙无法处理所有类型的ddos攻击,下一代防火墙生成内置的DDoS防御,但是无法处理所有类型的攻击。对抗DDoS攻击的最佳做法是有专属的设备或者服务在攻击透过防火墙或者其他的IT基础设施...

上树的熊
25分钟前
0
0
Spark Streaming如何使用checkpoint容错

在互联网场景下,经常会有各种实时的数据处理,这种处理方式也就是流式计算,延迟通常也在毫秒级或者秒级,比较有代表性的几个开源框架,分别是Storm,Spark Streaming和Filnk。 伦理片 http...

刺猬一号
27分钟前
1
0
Xamarin Essentials教程地理定位Geolocation

Xamarin Essentials教程地理定位Geolocation 通过地理定位功能,应用程序可以获取用户的当前地理位置,如经纬度值。利用地理位置,可以在地图上定位,也可以转化物理位置,划分用户的归属地。...

大学霸
40分钟前
0
0
vue 编译警告 Compiled with 4 warnings

There are multiple modules with names that only differ in casing. This can lead to unexpected behavior when compiling on a filesystem with other case-semantic. Use equal casing.......

落雪飞声
44分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部