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;
}
}
在使用时继承该类,并覆盖三个回调方法,就可以在合适的时机得到回调。
感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!