?
This document uses PHP Chinese website manual Release
SlidingDrawer
版本:Android 3.0 r1
?
結(jié)構(gòu)
繼承關(guān)系
public class SlidingDrawer extends ViewGroup
????????
java.lang.Object
android.view.View
???????? android.view.ViewGroup
?????????????????? android.widget.SlidingDrawer
?
類概述
SlidingDrawer(滑動式抽屜)隱藏屏外的內(nèi)容,并允許用戶拖拽一個handle以顯示隱藏的內(nèi)容。SlidingDrawer可以在垂直或者水平使用。它由兩個子視圖組成:一個是用戶拖拽的handle(柄),另一個是隨著拖動變化的content(內(nèi)容)。SlidingDrawer應(yīng)當作為內(nèi)部布局的覆蓋來使用,也就是說SlidingDrawer內(nèi)部應(yīng)該使用FrameLayout或RelativeLayout布局。SlidingDrawer的大小決定了其內(nèi)容顯示時所占空間的大小,所以它的尺寸一般定義為match_parent。在XML布局中SlidingDrawer必須指定handle和content的id:
?
內(nèi)部類
interface ???????? SlidingDrawer.OnDrawerCloseListener ??????
當drawer(抽屜)關(guān)閉時調(diào)用
?
interface ???????? SlidingDrawer.OnDrawerOpenListener ?????
當drawer(抽屜)打開時調(diào)用
?
interface ???????? SlidingDrawer.OnDrawerScrollListener ??????
當drawer(抽屜)滑動(滾動)時調(diào)用
?
XML屬性
屬性名稱 |
描述 |
|||||||||
android:allowSingleTap |
指示是否可通過單擊handle打開或關(guān)閉(如果是false,剛用戶必須通過拖動,滑動或者使用軌跡球,來打開/關(guān)閉抽屜。)默認的是true。 |
|||||||||
android:animateOnClick |
指示當用戶點擊handle的時候,抽屜是否以動畫的形式打開或關(guān)閉。默認的是true。 |
|||||||||
android:bottomOffset |
Handle距離SlidingDrawer底部的額外距離 |
|||||||||
android:content |
標識SlidingDrawer的內(nèi)容 |
|||||||||
android:handle |
標識SlidingDrawer的handle(譯者注:如按鈕) |
|||||||||
android:orientation |
SlidingDrawer的方向。必須是下面的一個值:
|
|||||||||
android:topOffset |
Handle距離SlidingDrawer頂部的額外距離 |
?
常量
public static final int ORIENTATION_HORIZONTAL
??? (譯者注:水平方向?qū)R)
常量值:0 (0x00000000)
?
public static final int ORIENTATION_VERTICAL
???????? (譯者注:垂直方向?qū)R)
常量值:1 (0x00000001)
?
構(gòu)造函數(shù)
public SlidingDrawer (Context context, AttributeSet attrs)
???????? 用xml中設(shè)置的屬性來創(chuàng)建一個新的SlidingDrawe
參數(shù)
context??? 上下文
attrs???????? ???????? XML中定義的屬性
????????
public SlidingDrawer (Context context, AttributeSet attrs, int defStyle)
???????? 用xml中設(shè)置的屬性來創(chuàng)建一個新的SlidingDrawe
參數(shù)
context??? 上下文
attrs???????? ???????? XML中定義的屬性
defStyle??? 要應(yīng)用到這個組件上的樣式
?
公共方法
public void animateClose ()
動畫效果關(guān)閉抽屜。
?????????????????? 參見
close()
open()
animateOpen()
animateToggle()
toggle()
?
public void animateOpen ()
動畫效果打開抽屜。
?????????????????? 參見
close()
open()
animateOpen()
animateToggle()
toggle()
?
public void animateToggle ()
在打開和關(guān)閉抽屜之間動畫切換
???????? 參見
close()
open()
animateOpen()
animateToggle()
toggle()
?
public void close ()
立即關(guān)閉抽屜
參見
toggle()
open()
animateClose()
?
public View getContent ()
返回抽屜的內(nèi)容(content)
???????? 返回值
返回在抽屜內(nèi)容的視圖,它在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)
實現(xiàn)這個方法可以攔截所有的觸屏事件,它在事件被傳到子類之前攔截,并獲得當前手勢的所有權(quán)。
使用這個方法時要注意,因為它與View.onTouchEvent(MotionEvent)
有一個相當復(fù)雜的交互,使用它需要用正確的方法來實現(xiàn)。事件會按照下列順序接受:
1.???????? down事件會被首先傳到本方法中。
2.???????? 這個down事件會被當前viewgroup的onTouchEvent()方法或者其各個子視圖處理,也就是說你應(yīng)該實現(xiàn)onTouchEvent()方法并返回true,你會繼續(xù)看到剩下事件的傳遞(而不是找一個parent view處理它)。同樣的,從onTouchEvent()中返回true,你不會在onInterceptTouchEvent()中接受到任何接下來的事件,并且所有的事件都會被onTouchEvent()處理。
3.???????? 如果當前方法返回false,所有接下來的事件(截止到最后包含注冊的事件)首先都會被繼續(xù)傳到這里,然后一起傳遞給目標的onTouchEvent()方法。截至及包括最后注冊。
4.????????
如果在這里返回true,將不會收到以下任何事件:目標view將收到同樣的事件但是是伴隨ACTION_CANCEL
事件
,并且所有的更進一步的事件將會傳遞到你自己的onTouchEvent()方法中而不會再在這里出現(xiàn)。
(譯者著:這里實在是太麻煩了,很不好懂,我自己看著都頭暈,在網(wǎng)上找到一篇很不錯的總結(jié),才知道是怎么回事,這里總結(jié)一下,記住這個原則你就會很清楚了:
1、onInterceptTouchEvent()是用于處理事件(類似于預(yù)處理,當然也可以不處理)并改變事件的傳遞方向,也就是決定是否允許Touch事件繼續(xù)向下(子控件)傳遞,一但返回True(代表事件在當前的viewGroup中會被處理),則向下傳遞之路被截斷(所有子控件將沒有機會參與Touch事件),同時把事件傳遞給當前的控件的onTouchEvent()處理;如果返回false,則把事件交給子控件的onInterceptTouchEvent()處理
2、onTouchEvent()用于處理事件,返回值決定當前控件是否消費(consume)了這個事件,也就是說在當前控件在處理完Touch事件后,是否還允許Touch事件繼續(xù)向上(父控件)傳遞,一但返回True,則父控件不用操心自己來處理Touch事件。
相關(guān)文章 這里1、 這里2)
?????????????????? 參數(shù)
??????????????????????????? event??????? 分層次的動作事件
?????????????????? 返回值
如果將運動事件從子視圖中截獲并且通過onTouchEvent()發(fā)送到當前ViewGroup ,返回true。當前目標將會收到ACTION_CANCEL事件,并且不再會有其他消息傳遞到此。
????????
public boolean onTouchEvent (MotionEvent event)
???????? 實現(xiàn)觸摸屏幕事件的方法
?????????????????? 參數(shù)
??????????????????????????? event??????? 當前事件
?????????????????? 返回值
??????????????????????????? 如果事件被處理就返回true,否則返回false
?
public void open ()
立即打開抽屜
?????????????????? 參見
??????????????????????????? toggle()
close()
animateOpen()
?
public void setOnDrawerCloseListener(SlidingDrawer.OnDrawerCloseListener onDrawerCloseListener)
???????? 給抽屜的關(guān)閉事件綁定監(jiān)聽器
?????????????????? 參數(shù)
??????????????????????????? onDrawerCloseListener? 抽屜關(guān)閉時的監(jiān)聽器
????????
public void setOnDrawerOpenListener(SlidingDrawer.OnDrawerOpenListener onDrawerOpenListener)
???????? 給抽屜的打開事件綁定監(jiān)聽器
?????????????????? 參數(shù)
??????????????????????????? onDrawerOpenListener? 抽屜打開時的鑒別器
?
public void setOnDrawerScrollListener (SlidingDrawer.OnDrawerScrollListener onDrawerScrollListener)
給抽屜的滾動(收縮)事件綁定監(jiān)聽器,輕滑(fling)也被當作一個滾動(收縮)事件,同時它可以觸發(fā)抽屜關(guān)閉或者打開事件。
???????? 參數(shù)
?????????????????? onDrawerScrollListener? 當滾動(收縮)開始或者停止時通知的監(jiān)聽器
????????
public void toggle ()
???????? 在抽屜打開或關(guān)閉狀態(tài)之間切換。事件會立即產(chǎn)生。
?????????????????? 參見
close()
open()
animateOpen()
animateToggle()
toggle()
?
public void unlock ()
???????? 解鎖SlidingDrawer使觸摸事件能被處理
?????????????????? 參見
??????????????????????????? lock()
?
補充
文章精選
???????? Android高手進階教程(二)之----Android Launcher抽屜類SlidingDrawer的使用
???????? SlidingDrawer 抽屜類 {Android學(xué)習指南}
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>