Android TouchListener实现拖拽删实例代码

  

<强> Android TouchListener实现拖拽删实例代码

  

如果为一个控件设置了该触摸监听,控件会随着用户的拖动而移动,如果拖动的距离大过设置的临界值,那么当松开手指时会有回调onDragComplete,用户可在该方法中将该控件从父布局中删除,或这进行其他操作。如果用户拖拽的距离小于临界值,那么当用户松开手指时控件会回谈到原来的初始位置。这时会触发onDragRebound回调。如果用户触摸控件之后没有拖拽而是直接松开手指,会触发onClick回调,这样用户就不用为该控件设置onClick监听。

  

源码如下:
  

           进口android.util.Log;   进口android.view.MotionEvent;   进口android.view.View;   进口android.view.ViewGroup;/* *   *由zhangjg 14-10-10。   */公共类DragTouchListener实现视图。OnTouchListener {/* *   *拖动方向   */公共静态最终int DIRECTION_UP=0;   公共静态最终int DIRECTION_DOWN=1;   公共静态最终int DIRECTION_LEFT=2;   公共静态最终int DIRECTION_RIGHT=3;         私人int mDragDirection=1;   私人int mDragDistance=1;   私人ViewGroup。MarginLayoutParams mParams;   私人ViewGroup。MarginLayoutParams mOriginParams;         私人int viewOriginMargin=-1000;      私人浮动mStartY=0;   私人浮动mStartX=0;   私人布尔isTouched=false;      公共DragTouchListener (int dragDirection int dragDistance) {   mDragDirection=dragDirection;   mDragDistance=dragDistance;   }      保护无效onClick(查看视图){      }      保护无效onDragComplete(查看视图){      }      保护无效onDragRebound(查看视图){      }      @Override   公共布尔ondraw(查看视图,MotionEvent MotionEvent) {         如果(viewOriginMargin==-1000) {   mParams=(ViewGroup.MarginLayoutParams) view.getLayoutParams ();   如果(mDragDirection==DIRECTION_UP) {   viewOriginMargin=mParams.bottomMargin;   }else if (mDragDirection==DIRECTION_DOWN) {   viewOriginMargin=mParams.topMargin;   }else if (mDragDirection==DIRECTION_LEFT) {   viewOriginMargin=mParams.rightMargin;   }else if (mDragDirection==DIRECTION_RIGHT) {   viewOriginMargin=mParams.leftMargin;   }   }         int action=motionEvent.getAction ();   开关(行动){   案例MotionEvent.ACTION_DOWN:   isTouched=true;   mStartY=motionEvent.getY ();   mStartX=motionEvent.getX ();   返回true;   案例MotionEvent.ACTION_MOVE:   浮动y=motionEvent.getY ();   浮动x=motionEvent.getX ();      如果(mDragDirection==DIRECTION_UP) {   如果(y & lt;mStartY) {   mParams。页下空白=viewOriginMargin + (int) (mStartY - y);   }   }else if (mDragDirection==DIRECTION_DOWN) {   如果(y比;mStartY) {   mParams。页面顶栏=viewOriginMargin + (int) (y - mStartY);   }   }else if (mDragDirection==DIRECTION_LEFT) {   如果(x & lt;mStartX) {   mParams。rightMargin=viewOriginMargin + (int) (mStartX - x);   }   }else if (mDragDirection==DIRECTION_RIGHT) {   如果x比;mStartX) {   mParams。leftMargin=viewOriginMargin + (int) (x - mStartX);   }   }      view.setLayoutParams (mParams);   打破;   案例MotionEvent.ACTION_UP:   浮动nowY=motionEvent.getY ();   浮动nowX=motionEvent.getX ();      int△=(int) nowX - (int) mStartX;   intδy=(int) nowY - (int) mStartY;      如果(isTouched,,Math.abs (△) & lt;5,,Math.abs(δy) & lt;5){   onClick(查看);   打破;   }      如果(mDragDirection==DIRECTION_UP) {   如果(isTouched,,mStartY - nowY比;mDragDistance) {//日志。我(“test-drag”、“方向,startY=" + mStartY +”, nowY=" + nowY +//?startY - nowY=" + (mStartY - nowY) +“, dragDistance:”+ mDragDistance);   onDragComplete(查看);      }else if (mStartY - nowY祝辞0,,mStartY - nowY & lt;mDragDistance) {   mParams。页下空白=viewOriginMargin;   view.setLayoutParams (mParams);   onDragRebound(查看);   }   }else if (mDragDirection==DIRECTION_DOWN) {      如果(isTouched,,nowY - mStartY比;mDragDistance) {   onDragComplete(查看);   }else if (nowY - mStartY祝辞0,,nowY - mStartY & lt;mDragDistance) {   mParams。页面顶栏=viewOriginMargin;   view.setLayoutParams (mParams);   onDragRebound(查看);   }   }else if (mDragDirection==DIRECTION_LEFT) {   如果(isTouched,,mStartX - nowX比;mDragDistance) {   onDragComplete(查看);   }else if (mStartX - nowX祝辞0,,mStartX - nowX & lt;mDragDistance) {   mParams。rightMargin=viewOriginMargin;   view.setLayoutParams (mParams);   onDragRebound(查看);   }   }else if (mDragDirection==DIRECTION_RIGHT) {   如果(isTouched,,nowX - mStartX比;mDragDistance) {   onDragComplete(查看);   }else if (nowX - mStartX祝辞0,,nowX - mStartX & lt;mDragDistance) {   mParams。leftMargin=viewOriginMargin;   view.setLayoutParams (mParams);   onDragRebound(查看);   }   }      isTouched=false;      打破;   }   返回错误;   }   }      

Android TouchListener实现拖拽删实例代码