android 拖动 点击事件,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;

}

};

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值