安卓View自定义长按时长
安卓系统自带了长按事件,setOnLongClickListener事件即可监听,但是有时候希望自定义这个时间,这时候就需要来定义这个长按事件了。
下面的代码定义一个阀值TOUCH_SLOP,在移动超过阀值和释放之后,会将runnable移除掉,长按时间也就不会触发了,安卓源码长按的原理也是如此。
下面贴上源代码:
public class LongPressViewextends androidx.appcompat.widget.AppCompatButton {
private float mLastX, mLastY;
private RunnablemRunnable;
private boolean isMove;
private static final float TOUCH_SLOP =20;
public LongPressView(Context context) {
super(context);
}
public LongPressView(Context context, @Nullable AttributeSet attrs) {
super(context, attrs);
mRunnable =new Runnable() {
@Override
public void run() {
performLongClick();
Toast.makeText(context, "自定义长按时长5000毫秒", Toast.LENGTH_SHORT).show();
}
};
}
@Override
public boolean onTouchEvent(MotionEvent event) {
float x = event.getX();
float y = event.getY();
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
mLastX = x;
mLastY = y;
isMove =false;
/**
* 第二个参数就是自定义长按时长
*/
postDelayed(mRunnable, 5000);
break;
case MotionEvent.ACTION_MOVE:
if (isMove) {
break;
}
if (Math.abs((mLastX - event.getX())) >TOUCH_SLOP || Math.abs((mLastY - event.getY())) >TOUCH_SLOP) {
isMove =true;
removeCallbacks(mRunnable);
}
break;
case MotionEvent.ACTION_UP:
removeCallbacks(mRunnable);
break;
}
return super.onTouchEvent(event);
}
}
运行上面代码,我们长按5秒,便可执行长按我们的事件逻辑了。