android仿人人网右边可推出的效果

添加了拖动功能,按住小图标,拖动超过一半的时候打开,没到一半的时候关闭。只添加了OnGestureListener接口和OnTouchListener。 

具体代码看下面: 

package com.dl.test;

import android.app.Activity;
import android.os.AsyncTask;
import android.os.Bundle;
import android.util.Log;
import android.view.GestureDetector;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnTouchListener;
import android.view.ViewTreeObserver;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.RelativeLayout.LayoutParams;

public class App extends Activity implements OnPanelStatusChangedListener,OnTouchListener,GestureDetector.OnGestureListener{
	private boolean hasMeasured=false;
	private LinearLayout layout_left;
	private LinearLayout layout_right;
	private ImageView iv;
	
	private int layout_left_width,layout_right_width=0;
	/**每次自动展开/收缩的范围*/  
	private int MAX_WIDTH=0;
	/**每次自动展开/收缩的速度*/  
    private final static int SPEED=20;
    
    private GestureDetector mGestureDetector;
	private boolean isScrolling=false;
	private float mScrollX;
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
      		
        layout_left=(LinearLayout)findViewById(R.id.layout_left);
        layout_right=(LinearLayout)findViewById(R.id.layout_right);
        iv=(ImageView)findViewById(R.id.iv);
        
        iv.setOnTouchListener(this);
        //定义手势识别
  		mGestureDetector = new GestureDetector(this,this);
  		mGestureDetector.setIsLongpressEnabled(false);
  		
        calculatorWidth();
        
    }
    
    
    @Override
	protected void onResume() {
		// TODO Auto-generated method stub
		super.onResume();
		
	}

	@Override
	public void onAttachedToWindow() {
		// TODO Auto-generated method stub
		super.onAttachedToWindow();
	}

	private void calculatorWidth(){
		 ViewTreeObserver observer = layout_right.getViewTreeObserver();
		//为了取得控件的宽
//       observer.addOnGlobalLayoutListener(new OnGlobalLayoutListener() {
//           @Override
//           public void onGlobalLayout() {
//		        if (hasMeasured == false){
//		        	layout_right_width = layout_right.getMeasuredWidth();//105
//		            layout_left_width=layout_left.getMeasuredWidth();//480
//		            MAX_WIDTH=layout_left_width-layout_right_width;//375
//		            hasMeasured = true;
//		        }
//           }
//       });
       //为了取得控件的宽
       observer.addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener(){
           public boolean onPreDraw(){
               if (hasMeasured == false){
               	layout_right_width = layout_right.getMeasuredWidth();
                   layout_left_width=layout_left.getMeasuredWidth();
                   MAX_WIDTH=layout_left_width-layout_right_width;
//                   Log.i("tag", "MAX_WIDTH=="+MAX_WIDTH);
                   hasMeasured = true;

//设置可拉动容器的宽为全屏(即不可拉动容器)的宽
                   View layout_max_width=findViewById(R.id.layout_max_width);
                   LinearLayout.LayoutParams lp=(LinearLayout.LayoutParams)layout_max_width.getLayoutParams();
                   lp.width=layout_left_width;
                   layout_max_width.setLayoutParams(lp);
               }
               return true;
           }
       });
	}
	class AsynMove extends AsyncTask<Integer, Integer, Void> {  
    	  
        @Override  
        protected Void doInBackground(Integer... params) {  
            int times;  
            if (MAX_WIDTH % Math.abs(params[0]) == 0)// 整除  
                times = MAX_WIDTH / Math.abs(params[0]);  
            else  
                times = MAX_WIDTH / 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)layout_right.getLayoutParams();
            if (params[0] < 0)  
                lp.leftMargin = Math.max(lp.leftMargin + params[0], 0);
            else  
                lp.leftMargin = Math.min(lp.leftMargin + params[0], MAX_WIDTH);
  
            if(lp.leftMargin<=0){//展开之后  
                onPanelOpened();//调用OPEN回调函数  
            }
            else if(lp.leftMargin>=MAX_WIDTH){//收缩之后  
                onPanelClosed();//调用CLOSE回调函数  
            }
            layout_right.setLayoutParams(lp);  
        }  
    }

	@Override
	public void onPanelOpened() {
		// TODO Auto-generated method stub
//		Log.i("tag", "=========onPanelOpened========");
	}

	@Override
	public void onPanelClosed() {
		// TODO Auto-generated method stub
//		Log.i("tag", "=========onPanelClosed========");
	}

	@Override
	public boolean onDown(MotionEvent e) {
		// TODO Auto-generated method stub
		mScrollX=0;
		isScrolling=false;
		return true;//需要返回ture才能触发onSingleTapUp
	}

	@Override
	public void onShowPress(MotionEvent e) {
		// TODO Auto-generated method stub
	}

	@Override
	public boolean onSingleTapUp(MotionEvent e) {
		// TODO Auto-generated method stub
		LayoutParams lp = (android.widget.RelativeLayout.LayoutParams)layout_right.getLayoutParams();
		
		if (lp.leftMargin >=MAX_WIDTH)// CLOSE的状态  
            new AsynMove().execute(new Integer[] { -SPEED });// 负数展开  
        else if (lp.leftMargin >= 0)// OPEN的状态  
            new AsynMove().execute(new Integer[] { SPEED });// 正数收缩
		return true;
	}

	@Override
	public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX,
			float distanceY) {
		// TODO Auto-generated method stub
		isScrolling=true;
		mScrollX+=distanceX;//distanceX:向左为正,右为负
		LayoutParams lp = (LayoutParams)layout_right.getLayoutParams();
		lp.leftMargin=lp.leftMargin-(int)mScrollX;
		if(lp.leftMargin<=0){//展开之后  
			isScrolling=false;//拖过头了不需要再执行AsynMove了
			lp.leftMargin=0;
			onPanelOpened();//调用OPEN回调函数  
		}
		if(lp.leftMargin>=MAX_WIDTH){//收缩之后  
			isScrolling=false;
			lp.leftMargin=MAX_WIDTH;
			onPanelClosed();//调用CLOSE回调函数  
		}
		layout_right.setLayoutParams(lp);
		
		return false;
	}

	@Override
	public void onLongPress(MotionEvent e) {
		// TODO Auto-generated method stub
		
	}

	@Override
	public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,
			float velocityY) {
		// TODO Auto-generated method stub
		return false;
	}
	@Override
	public boolean onTouch(View v, MotionEvent event) {
		// TODO Auto-generated method stub
		//拖到一半放开手指时的运动
		if(event.getAction()==MotionEvent.ACTION_UP && isScrolling==true){
			LayoutParams lp=(LayoutParams) layout_right.getLayoutParams();
			if (lp.leftMargin >= (MAX_WIDTH>>1)) {//往左没超过一半
				new AsynMove().execute(new Integer[] { SPEED });
			} 
			else{
				new AsynMove().execute(new Integer[] { -SPEED });
			}
		}
		return mGestureDetector.onTouchEvent(event); 
	}  
      
    
}

TestMenu.zip  (157.1 KB)

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值