返回介绍

SlidingDrawer

发布于 2025-03-09 17:00:33 字数 11911 浏览 0 评论 0 收藏 0

SlidingDrawer

版本:Android 3.0 r1

结构

继承关系

public class SlidingDrawer extends ViewGroup

java.lang.Object

android.view.View

android.view.ViewGroup

android.widget.SlidingDrawer

类概述

SlidingDrawer(滑动式抽屉)隐藏屏外的内容,并允许用户拖拽一个 handle 以显示隐藏的内容。SlidingDrawer 可以在垂直或者水平使用。它由两个子视图组成:一个是用户拖拽的 handle(柄),另一个是随着拖动变化的 content(内容)。SlidingDrawer 应当作为内部布局的覆盖来使用,也就是说 SlidingDrawer 内部应该使用 FrameLayout 或 RelativeLayout 布局。SlidingDrawer 的大小决定了其内容显示时所占空间的大小,所以它的尺寸一般定义为 match_parent。在 XML 布局中 SlidingDrawer 必须指定 handle 和 content 的 id:

内部类

interface SlidingDrawer.OnDrawerCloseListener

当 drawer(抽屉)关闭时调用

interface SlidingDrawer.OnDrawerOpenListener

当 drawer(抽屉)打开时调用

interface SlidingDrawer.OnDrawerScrollListener

当 drawer(抽屉)滑动(滚动)时调用

XML属性

属性名称描述
android:allowSingleTap指示是否可通过单击 handle 打开或关闭(如果是 false,刚用户必须通过拖动,滑动或者使用轨迹球,来打开/关闭抽屉。)默认的是 true。
android:animateOnClick指示当用户点击 handle 的时候,抽屉是否以动画的形式打开或关闭。默认的是 true。
android:bottomOffsetHandle 距离 SlidingDrawer 底部的额外距离
android:content

标识 SlidingDrawer 的内容

android:handle标识 SlidingDrawer 的 handle(译者注:如按钮)
android:orientationSlidingDrawer 的方向。必须是下面的一个值:
常量描述

horizontal

0

水平方向对齐

vertical

1

竖直方向对齐
android:topOffsetHandle 距离 SlidingDrawer 顶部的额外距离

常量

public static final int ORIENTATION_HORIZONTAL

(译者注:水平方向对齐)

常量值:0 (0x00000000)

 

public static final int ORIENTATION_VERTICAL

(译者注:垂直方向对齐)

常量值:1 (0x00000001)

 

构造函数

public SlidingDrawer (Context context, AttributeSet attrs)

用 xml 中设置的属性来创建一个新的 SlidingDrawe

参数

context 上下文

attrs XML 中定义的属性

public SlidingDrawer (Context context, AttributeSet attrs, int defStyle)

用 xml 中设置的属性来创建一个新的 SlidingDrawe

参数

context 上下文

attrs XML 中定义的属性

defStyle 要应用到这个组件上的样式

 

公共方法

public void animateClose ()

动画效果关闭抽屉。

参见

close()

open()

animateOpen()

animateToggle()

toggle()

public void animateOpen ()

动画效果打开抽屉。

参见

close()

open()

animateOpen()

animateToggle()

toggle()

public void animateToggle ()

在打开和关闭抽屉之间动画切换

参见

close()

open()

animateOpen()

animateToggle()

toggle()

public void close ()

立即关闭抽屉

参见

toggle()

open()

animateClose()

public View getContent ()

返回抽屉的内容(content)

返回值

返回在抽屉内容的视图,它在 XML 中是用“content”id 标识的

public View getHandle ()

返回抽屉的 handle

返回值

返回在抽屉 handle 的视图,它在 XML 中是用“handle”id 标识的

public boolean isMoving ()

抽屉是否在滚动或滑动。

返回值

如果在滚动或滑动,返回 true,否则返回 false

public boolean isOpened ()

当前抽屉是否被完全打开

返回值

如果是打开的,返回 true,否则返回 false。

public void lock ()

锁定 SlidingDrawer,忽略触摸事件

参见

unlock()

public boolean onInterceptTouchEvent (MotionEvent event)

实现这个方法可以拦截所有的触屏事件,它在事件被传到子类之前拦截,并获得当前手势的所有权。

使用这个方法时要注意,因为它与 View.onTouchEvent(MotionEvent) 有一个相当复杂的交互,使用它需要用正确的方法来实现。事件会按照下列顺序接受:

1. down 事件会被首先传到本方法中。

2. 这个 down 事件会被当前 viewgroup 的 onTouchEvent() 方法或者其各个子视图处理,也就是说你应该实现 onTouchEvent() 方法并返回 true,你会继续看到剩下事件的传递(而不是找一个 parent view 处理它)。同样的,从 onTouchEvent() 中返回 true,你不会在 onInterceptTouchEvent() 中接受到任何接下来的事件,并且所有的事件都会被 onTouchEvent() 处理。

3. 如果当前方法返回 false,所有接下来的事件(截止到最后包含注册的事件)首先都会被继续传到这里,然后一起传递给目标的 onTouchEvent() 方法。截至及包括最后注册。

4. 如果在这里返回 true,将不会收到以下任何事件:目标 view 将收到同样的事件但是是伴随 ACTION_CANCEL事件 ,并且所有的更进一步的事件将会传递到你自己的 onTouchEvent() 方法中而不会再在这里出现。

译者著 :这里实在是太麻烦了,很不好懂,我自己看着都头晕,在网上找到一篇很不错的总结,才知道是怎么回事,这里总结一下,记住这个原则你就会很清楚了:

1、onInterceptTouchEvent() 是用于处理事件(类似于预处理,当然也可以不处理)并改变事件的传递方向,也就是决定是否允许 Touch 事件继续向下(子控件)传递,一但返回 True(代表事件在当前的 viewGroup 中会被处理),则向下传递之路被截断(所有子控件将没有机会参与 Touch 事件),同时把事件传递给当前的控件的 onTouchEvent() 处理;如果返回 false,则把事件交给子控件的 onInterceptTouchEvent() 处理

2、onTouchEvent() 用于处理事件,返回值决定当前控件是否消费(consume)了这个事件,也就是说在当前控件在处理完 Touch 事件后,是否还允许 Touch 事件继续向上(父控件)传递,一但返回 True,则父控件不用操心自己来处理 Touch 事件。

相关文章 这里 1这里 2

参数

event 分层次的动作事件

返回值

如果将运动事件从子视图中截获并且通过 onTouchEvent() 发送到当前 ViewGroup ,返回 true。当前目标将会收到 ACTION_CANCEL 事件,并且不再会有其他消息传递到此。

public boolean onTouchEvent (MotionEvent event)

实现触摸屏幕事件的方法

参数

event 当前事件

返回值

如果事件被处理就返回 true,否则返回 false

public void open ()

立即打开抽屉

参见

toggle()

close()

animateOpen()

public void setOnDrawerCloseListener (SlidingDrawer.OnDrawerCloseListener onDrawerCloseListener)

给抽屉的关闭事件绑定监听器

参数

onDrawerCloseListener 抽屉关闭时的监听器

public void setOnDrawerOpenListener (SlidingDrawer.OnDrawerOpenListener onDrawerOpenListener)

给抽屉的打开事件绑定监听器

参数

onDrawerOpenListener 抽屉打开时的鉴别器

public void setOnDrawerScrollListener (SlidingDrawer.OnDrawerScrollListener onDrawerScrollListener)

给抽屉的滚动(收缩) 事件绑定监听器,轻滑(fling) 也被当作一个滚动(收缩) 事件,同时它可以触发抽屉关闭或者打开事件。

参数

onDrawerScrollListener 当滚动(收缩) 开始或者停止时通知的监听器

public void toggle ()

在抽屉打开或关闭状态之间切换。事件会立即产生。

参见

close()

open()

animateOpen()

animateToggle()

toggle()

public void unlock ()

解锁 SlidingDrawer 使触摸事件能被处理

参见

lock()

补充

文章精选

Android 高手进阶教程(二) 之----Android Launcher 抽屉类 SlidingDrawer 的使用

SlidingDrawer 抽屉类 {Android 学习指南}

MotionEvent 事件在 onInterceptTouchEvent()、onTouchEvent() 中的传递顺序

http://hi.baidu.com/j_fo/blog/item/7321c91324203437dc54017d.html

http://www.cnblogs.com/rocky_yi/archive/2011/01/21/1941522.html#

示例代码

SlidingDrawer 的 XML 文件示例

<SlidingDrawer
     android:id="@+id/drawer"
     android:layout_width="match_parent"
     android:layout_height="match_parent"
 
     android:handle="@+id/handle"
     android:content="@+id/content">
 
     <ImageView
         android:id="@id/handle"
         android:layout_width="88dip"
         android:layout_height="44dip" />
 
     <GridView
         android:id="@id/content"
         android:layout_width="match_parent"
         android:layout_height="match_parent" />
 </SlidingDrawer>

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文