安卓系統(tǒng)自帶了長(zhǎng)按事件扣典,setOnLongClickListener事件即可監(jiān)聽,但是有時(shí)候希望自定義這個(gè)時(shí)間,這時(shí)候就需要來定義這個(gè)長(zhǎng)按事件了池凄。
下面的代碼定義一個(gè)閥值TOUCH_SLOP,在移動(dòng)超過閥值和釋放之后鬼廓,會(huì)將runnable移除掉肿仑,長(zhǎng)按時(shí)間也就不會(huì)觸發(fā)了,安卓源碼長(zhǎng)按的原理也是如此碎税。
下面貼上源代碼:
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, "自定義長(zhǎng)按時(shí)長(zhǎng)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;
? ? ? ? ? ? ? ? /**
* 第二個(gè)參數(shù)就是自定義長(zhǎng)按時(shí)長(zhǎng)
*/
? ? ? ? ? ? ? ? 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);
? ? }
}
運(yùn)行上面代碼尤慰,我們長(zhǎng)按5秒,便可執(zhí)行長(zhǎng)按我們的事件邏輯了雷蹂。