在项目开发过程中,自定义view有各种事件需要处理,比如说,滑动事件,单击事件,长按事件,双击事件等,所以就专门写了一个工具类进行事件处理。
import android.content.Context;
import android.view.GestureDetector;
import android.view.MotionEvent;
import android.view.VelocityTracker;
import android.view.ViewConfiguration;
public class GestureHandler {
private float mPositionX, mPositionY;
private float xOffset, yOffset;
private boolean isScroll = false;
private GestureListener mGestureListener;
private Context mContext;
private long mDownTime;
public GestureHandler(Context context, GestureListener gestureListener) {
mContext = context;
mGestureListener = gestureListener;
}
public interface GestureListener {
//手指按下
void onDown(float x, float y);
//单击事件
void onSingleTapUp(float x, float y);
//长按事件
void onLongSingleTapUp(float x, float y);
//滑动事件
void onScroll(float x, float y, float distanceX, float distanceY);
//滑动结束
void onScrollFinish(float x, float y);
}
private boolean isScroll(float xOffset, float yOffset) {
if (Math.abs(xOffset) >= ViewConfiguration.get(mContext).getScaledTouchSlop()) {
return true;
}
if (Math.abs(yOffset) >= ViewConfiguration.get(mContext).getScaledTouchSlop()) {
return true;
}
return false;
}
public boolean onTouchEvent(MotionEvent event) {
switch (event.getAction() & event.ACTION_MASK) {
case MotionEvent.ACTION_DOWN:
isScroll = false;
mPositionX = event.getX();
mPositionY = event.getY();
if (mGestureListener != null) {
mGestureListener.onDown(event.getX(), event.getY());
}
mDownTime = System.currentTimeMillis();
break;
case MotionEvent.ACTION_MOVE:
xOffset = (event.getX() - mPositionX) + xOffset;
yOffset = (event.getY() - mPositionY) + yOffset;
if (isScroll(xOffset, yOffset) && !isScroll) {
isScroll = true;
}
mPositionX = event.getX();
mPositionY = event.getY();
if (isScroll) {
if (mGestureListener != null) {
mGestureListener.onScroll(event.getX(), event.getY(), xOffset, yOffset);
}
}
break;
case MotionEvent.ACTION_UP:
case MotionEvent.ACTION_CANCEL:
if (isScroll) {
if (mGestureListener != null) {
mGestureListener.onScrollFinish(event.getX(), event.getY());
}
} else {
long nowTime = System.currentTimeMillis();
long distance = nowTime - mDownTime;
long pressTimeout = ViewConfiguration.get(mContext).getLongPressTimeout();
if (distance < pressTimeout) {
mGestureListener.onSingleTapUp(event.getX(), event.getY());
} else {
mGestureListener.onLongSingleTapUp(event.getX(), event.getY());
}
}
xOffset = 0;
yOffset = 0;
isScroll = false;
return true;
default:
break;
}
return true;
}
}
有需要改进的地方希望大家在下面留言,一起学习一起进步