长按OnLongClickListener无法修改长按时间的解决办法
最近项目有个需求,长按5s弹出相应操作,而系统的OnLongClickListenr 按下时长为500ms,不能修改 ,所以换了另一个思路,就是用OnTouchListener来处理长按事件。
最近在用RxJava,所以用Rxjava来做这部分工作,当然你也可以选择handler、Timer或者Threa来做计时。
思路:当按下按钮时启动计时器,假设时长为5s,5s后判断手指的移动距离,如果滑动超出一定距离则判定该事件无效。在此期间如果抬手了,则取消订阅,订阅的事件也不会执行。
下面上代码。
private int x, y, mDownX, mDownY; private Subscription subscription;
tv_message.setOnTouchListener(new 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; subscription = Observable.timer(5, TimeUnit.SECONDS)//设置延时5s .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; } });