首页 > 其他分享 >Android自定义长按事件

Android自定义长按事件

时间:2023-03-20 10:03:23浏览次数:35  
标签:MotionEvent 自定义 int mLongPressRunnable break 事件 import Android event


Android系统自带了长按事件,setOnLongClickListener即可监听。但是有时候,你不希望用系统的长按事件,比如当希望长按的时间更长一点的时候。这时候就需要自己来定义这个长按事件了。
下面的代码定义了一个阈值TOUCH_SLOP,在移动超过阈值和释放之后,会将Runnable从事件队列中remove掉,长按事件也就不会再触发了。源码中实现长按的原理也基本如此。

package chroya.fun;

  import android.content.Context;

  import android.view.MotionEvent;

  import android.view.View;

  import android.view.ViewConfiguration;

  public class LongPressView2 extends View{

  private int mLastMotionX, mLastMotionY;

  //是否移动了

  private boolean isMoved;

  //长按的runnable

  private Runnable mLongPressRunnable;

  //移动的阈值

  private static final int TOUCH_SLOP = 20;

  public LongPressView2(Context context) {

  super(context);

  mLongPressRunnable = new Runnable() {

  @Override

  public void run() {

  performLongClick();

  }

  };

  }

  public boolean dispatchTouchEvent(MotionEvent event) {

  int x = (int) event.getX();

  int y = (int) event.getY();

  switch(event.getAction()) {

  case MotionEvent.ACTION_DOWN:

  mLastMotionX = x;

  mLastMotionY = y;

  isMoved = false;

  postDelayed(mLongPressRunnable, ViewConfiguration.getLongPressTimeout());

  break;

  case MotionEvent.ACTION_MOVE:

  if(isMoved) break;

  if(Math.abs(mLastMotionX-x) > TOUCH_SLOP|| Math.abs(mLastMotionY-y) > TOUCH_SLOP) {

  //移动超过阈值,则表示移动了

  isMoved = true;

  removeCallbacks(mLongPressRunnable);

  }

  break;

  case MotionEvent.ACTION_UP:

  //释放了

  removeCallbacks(mLongPressRunnable);

  break;

  }

  return true;

  }

  }

标签:MotionEvent,自定义,int,mLongPressRunnable,break,事件,import,Android,event
From: https://blog.51cto.com/u_5454003/6131811

相关文章