在android系统中,SlidingDrawer控件是默认的自下向上的滑动,那么如何实现一个自上向下的滑动呢?

首先先分析一下SlidingDrawer控件中都有那些元素:一个Handle,可以看做是一个按钮,点击按钮可以实现隐藏的View;一个View,可以看做是一个ListView或者GridView等等自己定义的View(我是这样理解的)。

在SlidingDrawer滑动的过程中,就是覆盖底层的主界面,对SlidingDrawer中的View部分进行缩放的一个过程。

效果图:

下面,我们先创建一个XMl文件,对主界面进行布局

 
  
  1. <?xml version="1.0" encoding="utf-8"?> 
  2. <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" 
  3.     android:layout_width="fill_parent" 
  4.     android:layout_height="fill_parent" 
  5.     > 
  6. <LinearLayout   
  7.     android:layout_width="match_parent" 
  8.     android:layout_height="match_parent" 
  9.     android:orientation="vertical" 
  10.     android:gravity="center" 
  11.     >      
  12.     <TextView   
  13.         android:id="@+id/text" 
  14.         android:layout_width="wrap_content" 
  15.         android:layout_height="wrap_content" 
  16.         android:text="测试" 
  17.         android:textSize="20px"         
  18.         /> 
  19. </LinearLayout> 
  20. <LinearLayout   
  21.     android:id="@+id/container" 
  22.     android:layout_width="match_parent" 
  23.     android:layout_height="wrap_content" 
  24.     android:orientation="vertical" > 
  25.     <GridView 
  26.         android:id="@+id/gridview" 
  27.         android:layout_width="wrap_content" 
  28.         android:layout_height="wrap_content" 
  29.         android:columnWidth="50dip" 
  30.         android:gravity="center" 
  31.         android:horizontalSpacing="10dip" 
  32.         android:numColumns="auto_fit" 
  33.         android:verticalSpacing="10dp" 
  34.          /> 
  35. </LinearLayout> 
  36. </FrameLayout> 

我们用帧布局对主界面进行控制,嵌套两个线性布局,第一个线性布局为主界面的显示部分,第二个线性布局控制SlidingDrawer中的View,并用GridView显示

接下来,创建Activity,对界面进行初始化

 
  
  1. import java.util.List;  
  2. import my.panel.slidingdrawer.R;  
  3. import android.app.Activity;  
  4. import android.content.Intent;  
  5. import android.content.pm.ResolveInfo;  
  6. import android.os.Bundle;  
  7. import android.view.View;  
  8. import android.view.ViewGroup;  
  9. import android.widget.BaseAdapter;  
  10. import android.widget.GridView;  
  11. import android.widget.ImageView;  
  12. import android.widget.LinearLayout;  
  13. import android.widget.LinearLayout.LayoutParams;  
  14. import android.widget.TextView;  
  15.  
  16. public class UpToDownActivity extends Activity {  
  17.     public GroupView groupView;  
  18.     public LinearLayout container;  
  19.     public GridView gridview;  
  20.     public void onCreate(Bundle savedInstanceState) {  
  21.         super.onCreate(savedInstanceState);  
  22.         setContentView(R.layout.main);  
  23.         this.setTitle("向下拉动的抽屉效果");  
  24.         TextView textView = (TextView) findViewById(R.id.text);  
  25.         textView.setText("盼望着,盼望着,东风来了,春天的脚步近了。 一切都像刚睡醒的样子,欣欣然张开了眼。山朗润起来了,水长起来了,太阳的脸红起来了。 小草偷偷地从土里钻出来,嫩嫩的,绿绿的。园子里,田野里,瞧去,一大片一大片满是的。坐着,躺着,打两个滚,踢几脚球,赛几趟跑,捉几回迷藏。风轻悄悄的,草绵软软的。");  
  26.         gridview = (GridView) findViewById(R.id.gridview);  
  27.         container=(LinearLayout)findViewById(R.id.container);  
  28.         groupView=new GroupView(this,gridview,LayoutParams.MATCH_PARENT,800);  
  29.           
  30.         //加入groupView控件  
  31.         container.addView(groupView);  
  32.       
  33.         //往GridView填充测试数据  
  34.         loadApps();  
  35.         gridview.setAdapter(new GridAdapter());  
  36.           
  37.     }  
  38.     //ApplicationInfo与ResolveInfo比较:  
  39.     //前者能够得到Icon、Label、meta-data、description  
  40.     //后者只能得到Icon、Label  
  41.     private List<ResolveInfo> apps;  
  42.     //加载手机中的APP  
  43.     private void loadApps() {  
  44.         Intent intent = new Intent(Intent.ACTION_MAIN, null);  
  45.         intent.addCategory(Intent.CATEGORY_LAUNCHER);  
  46.  
  47.         apps = getPackageManager().queryIntentActivities(intent, 0);  
  48.     }  
  49.     public class GridAdapter extends BaseAdapter {  
  50.         public GridAdapter() {  
  51.  
  52.         }  
  53.  
  54.         public int getCount() {  
  55.             // TODO Auto-generated method stub  
  56.             return apps.size();  
  57.         }  
  58.  
  59.         public Object getItem(int position) {  
  60.             // TODO Auto-generated method stub  
  61.             return apps.get(position);  
  62.         }  
  63.  
  64.         public long getItemId(int position) {  
  65.             // TODO Auto-generated method stub  
  66.             return position;  
  67.         }  
  68.  
  69.         public View getView(int position, View convertView, ViewGroup parent) {  
  70.             // TODO Auto-generated method stub  
  71.             ImageView p_w_picpathView = null;  
  72.             if (convertView == null) {  
  73.                 p_w_picpathView = new ImageView(UpToDownActivity.this);  
  74.                 //设置图片显示方式  
  75.                 p_w_picpathView.setScaleType(ImageView.ScaleType.FIT_CENTER);  
  76.                 p_w_picpathView.setLayoutParams(new GridView.LayoutParams(50, 50));  
  77.             } else {  
  78.                 p_w_picpathView = (ImageView) convertView;  
  79.             }  
  80.  
  81.             ResolveInfo ri = apps.get(position);  
  82.             p_w_picpathView.setImageDrawable(ri.activityInfo  
  83.                     .loadIcon(getPackageManager()));  
  84.  
  85.             return p_w_picpathView;  
  86.         }  
  87.  
  88.     }