Android TouchListener实现拖拽删实例代码
AndroidTouchListener实现拖拽删实例代码
如果为一个控件设置了该触摸监听,控件会随着用户的拖动而移动,如果拖动的距离大过设置的临界值,那么当松开手指时会有回调onDragComplete,用户可在该方法中将该控件从父布局中删除,或这进行其他操作。如果用户拖拽的距离小于临界值,那么当用户松开手指时控件会回谈到原来的初始位置。这时会触发onDragRebound回调。如果用户触摸控件之后没有拖拽而是直接松开手指,会触发onClick回调,这样用户就不用为该控件设置onClick监听。
源码如下:
importandroid.util.Log; importandroid.view.MotionEvent; importandroid.view.View; importandroid.view.ViewGroup; /** *Createdbyzhangjgon14-10-10. */ publicclassDragTouchListenerimplementsView.OnTouchListener{ /** *dragdirections */ publicstaticfinalintDIRECTION_UP=0; publicstaticfinalintDIRECTION_DOWN=1; publicstaticfinalintDIRECTION_LEFT=2; publicstaticfinalintDIRECTION_RIGHT=3; privateintmDragDirection=-1; privateintmDragDistance=-1; privateViewGroup.MarginLayoutParamsmParams; privateViewGroup.MarginLayoutParamsmOriginParams; privateintviewOriginMargin=-1000; privatefloatmStartY=0; privatefloatmStartX=0; privatebooleanisTouched=false; publicDragTouchListener(intdragDirection,intdragDistance){ mDragDirection=dragDirection; mDragDistance=dragDistance; } protectedvoidonClick(Viewview){ } protectedvoidonDragComplete(Viewview){ } protectedvoidonDragRebound(Viewview){ } @Override publicbooleanonTouch(Viewview,MotionEventmotionEvent){ if(viewOriginMargin==-1000){ mParams=(ViewGroup.MarginLayoutParams)view.getLayoutParams(); if(mDragDirection==DIRECTION_UP){ viewOriginMargin=mParams.bottomMargin; }elseif(mDragDirection==DIRECTION_DOWN){ viewOriginMargin=mParams.topMargin; }elseif(mDragDirection==DIRECTION_LEFT){ viewOriginMargin=mParams.rightMargin; }elseif(mDragDirection==DIRECTION_RIGHT){ viewOriginMargin=mParams.leftMargin; } } intaction=motionEvent.getAction(); switch(action){ caseMotionEvent.ACTION_DOWN: isTouched=true; mStartY=motionEvent.getY(); mStartX=motionEvent.getX(); returntrue; caseMotionEvent.ACTION_MOVE: floaty=motionEvent.getY(); floatx=motionEvent.getX(); if(mDragDirection==DIRECTION_UP){ if(y<mStartY){ mParams.bottomMargin=viewOriginMargin+(int)(mStartY-y); } }elseif(mDragDirection==DIRECTION_DOWN){ if(y>mStartY){ mParams.topMargin=viewOriginMargin+(int)(y-mStartY); } }elseif(mDragDirection==DIRECTION_LEFT){ if(x<mStartX){ mParams.rightMargin=viewOriginMargin+(int)(mStartX-x); } }elseif(mDragDirection==DIRECTION_RIGHT){ if(x>mStartX){ mParams.leftMargin=viewOriginMargin+(int)(x-mStartX); } } view.setLayoutParams(mParams); break; caseMotionEvent.ACTION_UP: floatnowY=motionEvent.getY(); floatnowX=motionEvent.getX(); intdeltaX=(int)nowX-(int)mStartX; intdeltaY=(int)nowY-(int)mStartY; if(isTouched&&Math.abs(deltaX)<5&&Math.abs(deltaY)<5){ onClick(view); break; } if(mDragDirection==DIRECTION_UP){ if(isTouched&&mStartY-nowY>mDragDistance){ //Log.i("test-drag","directionup,startY="+mStartY+",nowY="+nowY+ //",startY-nowY="+(mStartY-nowY)+",dragDistance:"+mDragDistance); onDragComplete(view); }elseif(mStartY-nowY>0&&mStartY-nowY<mDragDistance){ mParams.bottomMargin=viewOriginMargin; view.setLayoutParams(mParams); onDragRebound(view); } }elseif(mDragDirection==DIRECTION_DOWN){ if(isTouched&&nowY-mStartY>mDragDistance){ onDragComplete(view); }elseif(nowY-mStartY>0&&nowY-mStartY<mDragDistance){ mParams.topMargin=viewOriginMargin; view.setLayoutParams(mParams); onDragRebound(view); } }elseif(mDragDirection==DIRECTION_LEFT){ if(isTouched&&mStartX-nowX>mDragDistance){ onDragComplete(view); }elseif(mStartX-nowX>0&&mStartX-nowX<mDragDistance){ mParams.rightMargin=viewOriginMargin; view.setLayoutParams(mParams); onDragRebound(view); } }elseif(mDragDirection==DIRECTION_RIGHT){ if(isTouched&&nowX-mStartX>mDragDistance){ onDragComplete(view); }elseif(nowX-mStartX>0&&nowX-mStartX<mDragDistance){ mParams.leftMargin=viewOriginMargin; view.setLayoutParams(mParams); onDragRebound(view); } } isTouched=false; break; } returnfalse; } }
在使用时继承该类,并覆盖三个回调方法,就可以在合适的时机得到回调。
感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!