首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 移动开发 > 移动开发 >

仿众人网右边可推出的效果(带拖动)

2012-06-28 
仿人人网右边可推出的效果(带拖动)添加了拖动功能,按住小图标,拖动超过一半的时候打开,没到一半的时候关闭

仿人人网右边可推出的效果(带拖动)
添加了拖动功能,按住小图标,拖动超过一半的时候打开,没到一半的时候关闭。只添加了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();            }            @Overrideprotected void onResume() {// TODO Auto-generated method stubsuper.onResume();}@Overridepublic void onAttachedToWindow() {// TODO Auto-generated method stubsuper.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);          }      }@Overridepublic void onPanelOpened() {// TODO Auto-generated method stub//Log.i("tag", "=========onPanelOpened========");}@Overridepublic void onPanelClosed() {// TODO Auto-generated method stub//Log.i("tag", "=========onPanelClosed========");}@Overridepublic boolean onDown(MotionEvent e) {// TODO Auto-generated method stubmScrollX=0;isScrolling=false;return true;//需要返回ture才能触发onSingleTapUp}@Overridepublic void onShowPress(MotionEvent e) {// TODO Auto-generated method stub}@Overridepublic boolean onSingleTapUp(MotionEvent e) {// TODO Auto-generated method stubLayoutParams 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;}@Overridepublic boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX,float distanceY) {// TODO Auto-generated method stubisScrolling=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;}@Overridepublic void onLongPress(MotionEvent e) {// TODO Auto-generated method stub}@Overridepublic boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,float velocityY) {// TODO Auto-generated method stubreturn false;}@Overridepublic 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); }            }

其他都和这里的一样。 1 楼 weisi2375 2012-06-11   下来看看。 呵呵 2 楼 qi19901212 2012-06-20   没图片啊。望楼主添加

热点排行