android控件实现单击拖动效果
本文实例为大家分享了android控件实现单击拖动效果的具体代码,供大家参考,具体内容如下
分析
setOnClickListener
setOnClickListener可以接收控件的单击动作,无返回值
要想拖动控件,就要利用setOnTouchListener自己定义了
setOnTouchListener
通过按下时的坐标和移动时的坐标之间的差值,来计算移动的距离,然后更改控件的位置以达到拖动的目的
因Touch事件执行完成后如果返回false则会继续执行单击事件,不是我们想要的。如果直接返回true代表处理完了事件,不再执行单击事件,也不是我们想要的。
这时候就要判断什么时候返回true,什么时候返回false,以达到同时实现单击+拖动的目的
实例代码
绑定事件
//绑定拖动事件 floatView.floatMenuIcon.setOnTouchListener(touchListener); //绑定单击事件,此处为lambda表达式 floatView.floatMenuIcon.setOnClickListener(view->{ EventBus.getDefault().post(AccessibilityService.GLOBAL_ACTION_BACK); });
重写onTouchListener
注意事项
ACTION_UP为手指抬起时执行的事件,单击事件的判断放在此处,如果按下时的坐标和抬起时的坐标相差不大,我们视作单击动作,后期如果需要处理长按动作或双击动作,道理差不多。
完整代码
privatefinalView.OnTouchListenertouchListener=newView.OnTouchListener(){ //记录初使按下时的坐标,会因为拖动而改变 privatefloatdX; privatefloatdY; //记录初使按下时的坐标,不因拖动而改变 privatefloatsX; privatefloatsY; @SuppressLint("ClickableViewAccessibility") @Override publicbooleanonTouch(Viewview,MotionEventmotionEvent){ switch(motionEvent.getAction()){ caseMotionEvent.ACTION_DOWN: dX=motionEvent.getRawX(); dY=motionEvent.getRawY(); sX=motionEvent.getRawX(); sY=motionEvent.getRawY(); break; caseMotionEvent.ACTION_MOVE: //拖动事件,为了能够实时拖动,而非抬起后再移动,所以处理代码放到ACTION_MOVE中 floatnX=(int)motionEvent.getRawX(); floatnY=(int)motionEvent.getRawY(); floatcW=nX-dX; floatcH=nY-dY; dX=nX; dY=nY; layoutParams.x=(int)(layoutParams.x+cW); layoutParams.y=(int)(layoutParams.y+cH); windowManager.updateViewLayout(mView,layoutParams); break; caseMotionEvent.ACTION_UP: //如果抬起时的位置和按下时的位置大致相同视作单击事件 //间隔值可能为负值,所以要取绝对值进行比较 if(Math.abs(motionEvent.getRawX()-sX)>6&&Math.abs(motionEvent.getRawY()-sY)>6){ returntrue; } break; } returnfalse; } };
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。