这篇文章主要为大家详细介绍了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为手指抬起时执行的事件,单击事件的判断放在此处,如果按下时的坐标和抬起时的坐标相差不大,我们视作单击动作,后期如果需要处理长按动作或双击动作,道理差不多。
完整代码
private final View.OnTouchListener touchListener = new View.OnTouchListener() {
//记录初使按下时的坐标,会因为拖动而改变
private float dX;
private float dY;
//记录初使按下时的坐标,不因拖动而改变
private float sX;
private float sY;
@SuppressLint("ClickableViewAccessibility")
@Override
public boolean onTouch(View view, MotionEvent motionEvent) {
switch (motionEvent.getAction()) {
case MotionEvent.ACTION_DOWN:
dX = motionEvent.getRawX();
dY = motionEvent.getRawY();
sX = motionEvent.getRawX();
sY = motionEvent.getRawY();
break;
case MotionEvent.ACTION_MOVE:
//拖动事件,为了能够实时拖动,而非抬起后再移动,所以处理代码放到ACTION_MOVE中
float nX = (int) motionEvent.getRawX();
float nY = (int) motionEvent.getRawY();
float cW = nX - dX;
float cH = nY - dY;
dX = nX;
dY = nY;
layoutParams.x = (int) (layoutParams.x + cW);
layoutParams.y = (int) (layoutParams.y + cH);
windowManager.updateViewLayout(mView, layoutParams);
break;
case MotionEvent.ACTION_UP:
//如果抬起时的位置和按下时的位置大致相同视作单击事件
//间隔值可能为负值,所以要取绝对值进行比较
if (Math.abs(motionEvent.getRawX() - sX) > 6 && Math.abs(motionEvent.getRawY() - sY) > 6) {
return true;
}
break;
}
return false;
}
};
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持编程学习网。