Android 自定义事件处理器

399 阅读1分钟

在项目开发过程中,自定义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;
    }
}

有需要改进的地方希望大家在下面留言,一起学习一起进步