android之SlidingDrawer 抽屉效果

    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. }  

 

posted @ 2012-09-16 21:58  任智康  阅读(3946)  评论(0编辑  收藏  举报