android自定义实现抽屉SlidingDrawer的功能

 

android自定义实现抽屉SlidingDrawer的功能

分类: android   97人阅读  评论(0)  收藏  举报
自定义拖动

最近项目中需要实现上拉功能,首先想到的就是Android本身自带的抽屉SlidingDrawer,最后也实现了不过,出现的问题就是设置背景色问题,handler和content是两个不同的部分,这就造成图片要做成两部分,从而产生两个部分图片看起来不是一个整体,而且我这个上拉功能,里面要实现一个水平滚动功能,而SlidingDrawer还有其他的限制,同时官方给出api 17以后,这个功能已经废弃,所以自己自定这样一个上拉功能是必须的。

这里我是继承LinearLayout同时实现GestureDetector.OnGestureListener来实现上拉功能。下面是代码:

[java]  view plain copy
  1. package com.example.test;  
  2.   
  3. import android.content.Context;  
  4. import android.os.AsyncTask;  
  5. import android.util.AttributeSet;  
  6. import android.view.GestureDetector;  
  7. import android.view.MotionEvent;  
  8. import android.widget.LinearLayout;  
  9. import android.widget.RelativeLayout;  
  10.   
  11. public class PanelBom extends LinearLayout implements GestureDetector.OnGestureListener{  
  12.   
  13.     GestureDetector mGesture = null;  
  14.     private boolean isScrolling = false;  
  15.     private int MAX_HEIGHT = 80;//拖动的最大高度,当前布局位于父布局下面-80位置,这个仅仅是调试参数,这个变量是动态设置的。  
  16.     private float mScrollX; // 滑块滑动距离  
  17.     public PanelBom(Context context) {  
  18.         super(context);  
  19.         init();  
  20.     }  
  21.     public PanelBom(Context context, AttributeSet attrs) {  
  22.         super(context, attrs);  
  23.         init();  
  24.     }  
  25.     //初始化一些参数  
  26.     public void init(){  
  27.         mGesture = new GestureDetector(this);  
  28.         mGesture.setIsLongpressEnabled(false);  
  29.         setBackgroundResource(R.drawable.button_bar);  
  30.     }  
  31.       
  32.     @Override  
  33.     public boolean onTouchEvent(MotionEvent event) {  
  34.         if (MotionEvent.ACTION_UP == event.getAction() && isScrolling == true) {  
  35.             RelativeLayout.LayoutParams layoutParams = (RelativeLayout.LayoutParams)getLayoutParams();  
  36.             // 缩回去  
  37.             if (layoutParams.bottomMargin < -MAX_HEIGHT / 2) {  
  38.                 new AsynMove().execute(-20);//负--往下  
  39.             } else {  
  40.                 new AsynMove().execute(20);//正--往上  
  41.             }  
  42.         }  
  43.         return mGesture.onTouchEvent(event);  
  44.     }  
  45.     //Touch down时触发   
  46.     @Override  
  47.     public boolean onDown(MotionEvent e) {  
  48.         mScrollX = 0;  
  49.         isScrolling = false;  
  50.         // 将之改为true,不然事件不会向下传递.  
  51.         return true;  
  52.     }  
  53.     //Touch了还没有滑动时触发   
  54.     @Override  
  55.     public void onShowPress(MotionEvent e) {  
  56.           
  57.     }  
  58.     @Override  
  59.     public boolean onSingleTapUp(MotionEvent e) {  
  60.         RelativeLayout.LayoutParams layoutParams = (RelativeLayout.LayoutParams) getLayoutParams();  
  61.         // 说明在上面,要往下  
  62.         if (layoutParams.bottomMargin >= 0) {  
  63.             new AsynMove().execute(-20);//负--往下  
  64.         } else {  
  65.             new AsynMove().execute(20);//正--往上  
  66.         }  
  67.         return true;  
  68.     }  
  69.     //Touch了滑动时触发  
  70.     @Override  
  71.     public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX,  
  72.             float distanceY) {  
  73.         isScrolling = true;  
  74.         mScrollX += distanceY;  
  75.         RelativeLayout.LayoutParams layoutParams = (RelativeLayout.LayoutParams)getLayoutParams();  
  76.         layoutParams.bottomMargin += mScrollX;  
  77.         if (layoutParams.bottomMargin >= 0) {  
  78.             isScrolling = false;// 拖过头了不需要再执行AsynMove了  
  79.             layoutParams.bottomMargin = 0;  
  80.         } else if (layoutParams.bottomMargin <= -MAX_HEIGHT) {  
  81.             // 拖过头了不需要再执行AsynMove了  
  82.             isScrolling = false;  
  83.             layoutParams.bottomMargin = -MAX_HEIGHT;  
  84.         }  
  85.         setLayoutParams(layoutParams);  
  86.         return false;  
  87.     }  
  88.     //Touch了不移动一直Touch down时触发   
  89.     @Override  
  90.     public void onLongPress(MotionEvent e) {  
  91.           
  92.     }  
  93.     //Touch了滑动一点距离后,up时触发。  
  94.     @Override  
  95.     public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,  
  96.             float velocityY) {  
  97.         return false;  
  98.     }  
  99.     //异步更新布局的位置  
  100.     class AsynMove extends AsyncTask<Integer, Integer, Void> {  
  101.         @Override  
  102.         protected Void doInBackground(Integer... params) {  
  103.             int times = 0;  
  104.             int divi = Math.abs(params[0]);  
  105.             if (MAX_HEIGHT % divi == 0)// 整除  
  106.                 times = MAX_HEIGHT / Math.abs(params[0]);  
  107.             else  
  108.                 times = MAX_HEIGHT / divi + 1;// 有余数  
  109.   
  110.             for (int i = 0; i < times; i++) {  
  111.                 publishProgress(params[0]);  
  112.                 try {  
  113.                     Thread.sleep(divi);  
  114.                 } catch (InterruptedException e) {  
  115.                     e.printStackTrace();  
  116.                 }  
  117.             }  
  118.             return null;  
  119.         }  
  120.         @Override  
  121.         protected void onProgressUpdate(Integer... values) {  
  122.             RelativeLayout.LayoutParams layoutParams = (RelativeLayout.LayoutParams) getLayoutParams();  
  123.             if (values[0] < 0) {  
  124.                 layoutParams.bottomMargin = Math.max(layoutParams.bottomMargin + values[0], -MAX_HEIGHT);  
  125.             } else {  
  126.                 layoutParams.bottomMargin = Math.min(layoutParams.bottomMargin + values[0], 0);  
  127.             }  
  128.             setLayoutParams(layoutParams);  
  129.               
  130.             super.onProgressUpdate(values);  
  131.         }  
  132.     }  
  133. }  
主界面:

[java]  view plain copy
  1. package com.example.test;  
  2.   
  3. import android.app.Activity;  
  4. import android.os.Bundle;  
  5. import android.widget.RelativeLayout;  
  6.   
  7. public class Main5 extends Activity{  
  8.   
  9.     RelativeLayout Parent;  
  10.     PanelBom panelBom;  
  11.     RelativeLayout.LayoutParams parentParams;  
  12.     RelativeLayout.LayoutParams paneBomParams;  
  13.     @Override  
  14.     protected void onCreate(Bundle savedInstanceState) {  
  15.         super.onCreate(savedInstanceState);  
  16.         Parent = new RelativeLayout(getApplicationContext());  
  17.         panelBom = new PanelBom(getApplicationContext());  
  18.         parentParams = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.MATCH_PARENT, RelativeLayout.LayoutParams.MATCH_PARENT);  
  19.         paneBomParams = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.MATCH_PARENT, 150);  
  20.         paneBomParams.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM);  
  21.         paneBomParams.bottomMargin = -80;  
  22.         Parent.addView(panelBom, paneBomParams);  
  23.         setContentView(Parent, parentParams);  
  24.     }  
  25.   
  26. }  

实现的效果是:

拖拉,点击实现上拉功能,效果图如下:

android自定义实现抽屉SlidingDrawer的功能_第1张图片

android自定义实现抽屉SlidingDrawer的功能_第2张图片


你可能感兴趣的:(android)