android之SlidingDrawer 抽屜效果

來源:互聯網
上載者:User

    SlidingDrawer(滑動式抽屜)隱藏屏外的內容,並允許使用者拖拽一個handle以顯示隱藏的內容。它由兩個子視圖組成:一個是使用者拖拽的handle(柄),另一個是隨著拖動變化的content(內容)。SlidingDrawer應當作為內部布局的覆蓋來使用,也就是說SlidingDrawer內部應該使用FrameLayout或RelativeLayout布局。SlidingDrawer的大小決定了其內容顯示時所佔空間的大小,所以它的尺寸一般定義為match_parent。在XML布局中SlidingDrawer必須指定handle和content的id.

其中:

android:allowSingleTap     指示是否可通過單擊handle開啟或關閉(如果是false,剛使用者必須通過拖動,滑動或者使用軌跡球,來開啟/關閉抽屜。)預設的是true。

android:animateOnClick    指示當使用者點擊handle的時候,抽屜是否以動畫的形式開啟或關閉。預設的是true。

android:bottomOffset      Handle距離SlidingDrawer底部的額外距離

android:content              標識SlidingDrawer的內容

android:handle               標識SlidingDrawer的han

  實現這個方法可以攔截所有的觸屏事件,它在事件被傳到子類之前攔截,並獲得當前手勢的所有權。

  使用這個方法時要注意,因為它與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事件。

 

先看這張吧 

先貼出main.xml的代碼,代碼中需要的圖片自己解決

  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  3.     android:orientation="vertical"  
  4.     android:layout_width="fill_parent"  
  5.     android:layout_height="fill_parent"  
  6.     >  
  7.     <SlidingDrawer   
  8.         android:id="@+id/slidingDrawer"  
  9.         android:layout_width="fill_parent"  
  10.         android:layout_height="fill_parent"  
  11.         android:orientation="vertical"  
  12.         android:handle="@+id/handle"  
  13.         android:content="@+id/content">  
  14.         <ImageButton   
  15.             android:id="@+id/handle"  
  16.             android:layout_width="wrap_content"  
  17.             android:layout_height="wrap_content"  
  18.             android:src="@drawable/button_up"/>  
  19.             <LinearLayout   
  20.                 android:id="@+id/content"  
  21.                 android:layout_width="wrap_content"  
  22.                 android:layout_height="wrap_content"  
  23.                 android:background="#ffffff">  
  24.                   
  25.                 <TextView android:text="ceshi"  
  26.                     android:id="@+id/textView"  
  27.                     android:layout_width="wrap_content"  
  28.                     android:layout_height="wrap_content"/>  
  29.             </LinearLayout>  
  30.     </SlidingDrawer>  
  31. </LinearLayout>  

 

 

  1. package com.dapp;  
  2.   
  3. import java.util.ArrayList;  
  4. import java.util.HashMap;  
  5. import java.util.List;  
  6.   
  7. import android.app.Activity;  
  8. import android.content.Context;  
  9. import android.os.Bundle;  
  10. import android.view.View;  
  11. import android.view.ViewGroup;  
  12. import android.widget.BaseAdapter;  
  13. import android.widget.ImageButton;  
  14. import android.widget.SlidingDrawer;  
  15. import android.widget.TextView;  
  16.   
  17. public class ChoutiActivity extends Activity {  
  18.     private SlidingDrawer mdrawer;  
  19.     private ImageButton mButton;  
  20.     private TextView mText;  
  21.     private boolean flag;  
  22.     private HashMap<String, Object> map;  
  23.       
  24.     public void onCreate(Bundle savedInstanceState) {  
  25.         super.onCreate(savedInstanceState);  
  26.         setContentView(R.layout.main);  
  27.           
  28.         mdrawer = (SlidingDrawer)findViewById(R.id.slidingDrawer);  
  29.         mButton = (ImageButton)findViewById(R.id.handle);  
  30.         mText = (TextView)findViewById(R.id.textView);  
  31.         drawerlistener();  
  32.         getdata();  
  33.     }  
  34.       
  35.     private void getdata(){  
  36.         List<HashMap<String, Object>> listdata = new ArrayList<HashMap<String, Object>>();  
  37.           
  38.             for(int i=0; i<10; i++){  
  39.                 map = new HashMap<String, Object>();  
  40.                 map.put("text", "ceshi");  
  41.                 listdata.add(map);  
  42.             }  
  43.     }  
  44.       
  45.     private void drawerlistener(){  
  46.         mdrawer.setOnDrawerOpenListener(new SlidingDrawer.OnDrawerOpenListener() {  
  47.               
  48.             @Override  
  49.             public void onDrawerOpened() {  
  50.                 flag = true;  
  51.                 mButton.setImageResource(R.drawable.button_down);  
  52.             }  
  53.         });  
  54.           
  55.         mdrawer.setOnDrawerCloseListener(new SlidingDrawer.OnDrawerCloseListener() {  
  56.               
  57.             @Override  
  58.             public void onDrawerClosed() {  
  59.                 flag = false;  
  60.                 mButton.setImageResource(R.drawable.button_up);  
  61.             }  
  62.         });  
  63.           
  64.         mdrawer.setOnDrawerScrollListener(new SlidingDrawer.OnDrawerScrollListener() {  
  65.               
  66.             @Override  
  67.             public void onScrollStarted() {  
  68.                 mText.setText("結束拖動");  
  69.             }  
  70.               
  71.             @Override  
  72.             public void onScrollEnded() {  
  73.                 mText.setText("開始拖動");  
  74.             }  
  75.         });  
  76.     }  
  77.       
  78. }  

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.