最近项目有个需求,长按5s弹出相应操作,而系统的OnLongClickListenr 按下时长为500ms,不能修改 ,所以换了另一个思路,就是用OnTouchListener来处理长按事件。
最近在用RxJava,所以用Rxjava来做这部分工作,当然你也可以选择handler、Timer或者Threa来做计时。
思路:当按下按钮时启动计时器,假设时长为5s,5s后判断手指的移动距离,如果滑动超出一定距离则判定该事件无效。在此期间如果抬手了,则取消订阅,订阅的事件也不会执行。
下面上代码。
private int x, y, mDownX, mDownY;
private Subscription subscription;
button.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
x = (int) event.getX();
y = (int) event.getY();
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
//保存按下时的坐标
mDownX = x;
mDownY = y;
//设置延时5s
subscription = Observable.timer(5, TimeUnit.SECONDS)
.subscribe(new Action1<Long>() {
@Override
public void call(Long aLong) {
float offsetX = Math.abs(x - mDownX);
float offsetY = Math.abs(y - mDownY);
if (offsetX <= 10 && offsetY <= 10) {//判断移动差值
//这里处理长按触发事件
}
}
});
break;
case MotionEvent.ACTION_MOVE:
break;
case MotionEvent.ACTION_UP://UP则取消订阅
if (subscription != null)
subscription.unsubscribe();
break;
}
return false;
}
});