<强> 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实现拖拽删实例代码