对SlidingDrawer进行UI的设置,在代码中创建一个Button按钮,点击以使自定义的SlidingDrawer的View部分进行展开、缩放。在点击过程中,View部分的高度是随着Button的点击事件而改变的,所以,我用该View与手机屏幕BottomMargin属性,对View的高度进行控制。
示例代码:
- import android.content.Context;
- import android.os.AsyncTask;
- import android.util.Log;
- import android.view.Gravity;
- import android.view.MotionEvent;
- import android.view.View;
- import android.widget.Button;
- import android.widget.LinearLayout;
- import android.view.*;
- public class GroupView extends LinearLayout implements GestureDetector.OnGestureListener{
- public interface GroupViewClosedEvent {
- void onGroupViewClosed(View groupView);
- }
- public interface GroupViewOpenedEvent {
- void onGroupViewOpened(View groupView);
- }
- /**Handle的高度 */
- private final static int HANDLE_HEIGHT=60;
- //每次自动展开,收缩的范围
- private final static int MOVE_HEIGHT=50;
- private Button btnHandle;
- private LinearLayout groupViewContainer;
- private int mBottomMargin=0;
- private Context mContext;
- private GroupViewClosedEvent groupViewClosedEvent=null;
- private GroupViewOpenedEvent groupViewOpenedEvent=null;
- /**
- * otherView自动布局以适应GroupView展开或者收缩的空间变化
- */
- public GroupView(Context context,View otherView,int width,int height) {
- super(context);
- this.mContext=context;
- //改变GroupView附近组件的属性
- LayoutParams otherLP=(LayoutParams) otherView.getLayoutParams();
- otherLP.weight=1;//支持挤压
- otherView.setLayoutParams(otherLP);
- //设置GroupView本身的属性
- LayoutParams lp=new LayoutParams(width, height);
- lp.bottomMargin=0;//GroupView的Container在屏幕不可视区域,Handle在可视区域
- mBottomMargin=Math.abs(-lp.height+HANDLE_HEIGHT);
- this.setLayoutParams(lp);
- this.setOrientation(LinearLayout.VERTICAL);
- //设置Handle的属性
- btnHandle=new Button(context);
- btnHandle.setText("由上向下");
- btnHandle.setGravity(Gravity.CENTER);
- LayoutParams layoutParams = new LayoutParams(160,HANDLE_HEIGHT);
- layoutParams.gravity=Gravity.CENTER;
- btnHandle.setLayoutParams(layoutParams);
- //设置点击事件,展开或者收缩
- btnHandle.setOnClickListener(new OnClickListener(){
- @Override
- public void onClick(View arg0) {
- LayoutParams lp = (LayoutParams) GroupView.this.getLayoutParams();
- if (lp.bottomMargin < 0){// 处于CLOSE的状态
- btnHandle.setText("展开");
- Log.d("CloseMargin", ""+lp.bottomMargin);
- new AsynMove().execute(new Integer[] { MOVE_HEIGHT });//为正数。展开
- }else if (lp.bottomMargin >= 0){// 处于OPEN的状态
- btnHandle.setText("收缩");
- Log.d("OpenMargin", ""+lp.bottomMargin);
- new AsynMove().execute(new Integer[] { -MOVE_HEIGHT });//为负数,收缩
- }
- }
- });
- //给GroupView添加一个Button
- this.addView(btnHandle);
- //设置Container的属性
- groupViewContainer=new LinearLayout(mContext);
- groupViewContainer.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT,
- LayoutParams.MATCH_PARENT));
- this.addView(groupViewContainer);
- }
- //定义收缩时候的回调函数
- public void setGroupViewClosedEvent(GroupViewClosedEvent event)
- {
- this.groupViewClosedEvent=event;
- }
- //定义展开时候的回调函数
- public void setgroupViewOpenedEvent(GroupViewOpenedEvent event)
- {
- this.groupViewOpenedEvent=event;
- }
- //异步移动GroupView
- class AsynMove extends AsyncTask<Integer, Integer, Void> {
- @Override
- protected Void doInBackground(Integer... params) {
- int times;
- if (mBottomMargin % Math.abs(params[0]) == 0){//整除
- times = mBottomMargin / Math.abs(params[0]);
- }else{ //有余数
- times = mBottomMargin / Math.abs(params[0]) + 1;
- }
- for (int i = 0; i < times; i++) {
- publishProgress(params);
- try {
- Thread.sleep(Math.abs(params[0]));
- } catch (InterruptedException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- }
- return null;
- }
- @Override
- protected void onProgressUpdate(Integer... params) {
- LayoutParams lp = (LayoutParams) GroupView.this.getLayoutParams();
- //处于OPEN状态,为bottomMargin重新赋值
- if (params[0] < 0){
- lp.bottomMargin = Math.max(lp.bottomMargin + params[0],
- (-mBottomMargin));
- }
- //处于CLOSE状态,为bottomMargin重新赋值
- else{
- lp.bottomMargin = Math.min(lp.bottomMargin + params[0], 0);
- }
- //此时处于CLOSE状态
- if(lp.bottomMargin==0 && groupViewOpenedEvent!=null){//展开之后
- // Log.d("OpenMargin", ""+lp.bottomMargin);
- groupViewOpenedEvent.onGroupViewOpened(GroupView.this);//调用OPEN回调函数
- }
- //此时处于OPEN状态
- else if(lp.bottomMargin==-(mBottomMargin) && groupViewOpenedEvent!=null){//收缩之后
- Log.d("CloseMargin", ""+lp.bottomMargin);
- groupViewClosedEvent.onGroupViewClosed(GroupView.this);//调用CLOSE回调函数
- }
- GroupView.this.setLayoutParams(lp);
- }
- }
- //------------------------手势拖动-----------------------------------
- //当有一个下拉事件正在进行的时候,通知程序它被触发。其他的事件应当在这个事件被出发之前完成
- @Override
- public boolean onDown(MotionEvent e) {
- // TODO Auto-generated method stub
- return false;
- }
- //用户已经执行了一个下拉事件,但是没有执行移动或者向上的动作。这个事件通常被用于为了告知用户他们的动作被识别而提供的一个可视化的信息反馈
- @Override
- public void onShowPress(MotionEvent e) {
- }
- //通知一个向上滑动的事件是否被触发;如果该event被充满,返回true
- @Override
- public boolean onSingleTapUp(MotionEvent e) {
- //根据LayoutParam与底部的距离判断当前状态;调用异步移动GroupView
- return false;
- }
- //提供XY的距离;通知一个滑动的起始状态和滑动时候的状态
- @Override
- public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX,
- float distanceY) {
- //为当前的GroupView设置LayoutParam(上下滑动是设置高度)
- return false;
- }
- //通知在起始状态的下拉事件中的一个长按动作,调用该方法
- @Override
- public void onLongPress(MotionEvent e) {
- }
- @Override
- public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,
- float velocityY) {
- return false;
- }
- }
更改相应代码,可以实现由左向右,或者由右向左的滑动效果。
代码中没有写出拖动的效果代码,只有Button按钮的点击事件,有兴趣的朋友可以自己实现一下拖动。
以上全是自己的对SlidingDrawer的理解,有不足之处,多多指教。
转载于:https://blog.51cto.com/hanxy86/820986