TouchDelegate相关文章

Android鲜为人知的TouchDelegate

Android使用TouchDelegate增加View的触摸范围

ListView Tips & Tricks #5: Enlarged Touchable Areas

TouchDelegateGroup

import android.graphics.Rect;
import android.view.MotionEvent;
import android.view.TouchDelegate;
import android.view.View;

import androidx.annotation.NonNull;

import java.util.ArrayList;

public class TouchDelegateGroup extends TouchDelegate {
    private ArrayList<TouchDelegate> mTouchDelegates = new ArrayList<>();
    private TouchDelegate mCurrentTouchDelegate;

    public TouchDelegateGroup(@NonNull Rect bounds, @NonNull View delegateView) {
        super(bounds, delegateView);
        mTouchDelegates.add(this);
    }

    public void addTouchDelegate(@NonNull TouchDelegate touchDelegate) {
        mTouchDelegates.add(touchDelegate);
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        TouchDelegate delegate = null;
        switch (event.getAction()) {
            case MotionEvent.ACTION_DOWN:
                for (TouchDelegate touchDelegate : mTouchDelegates) {
                    if (onDelegateTouchEvent(touchDelegate, event)) {
                        mCurrentTouchDelegate = touchDelegate;
                        return true;
                    }
                }
                break;
            case MotionEvent.ACTION_MOVE:
                delegate = mCurrentTouchDelegate;
                break;
            case MotionEvent.ACTION_CANCEL:
            case MotionEvent.ACTION_UP:
                delegate = mCurrentTouchDelegate;
                mCurrentTouchDelegate = null;
                break;
        }
        if (delegate != null) {
            return onDelegateTouchEvent(delegate, event);
        }
        return false;
    }

    public boolean onSelfTouchEvent(MotionEvent event) {
        return super.onTouchEvent(event);
    }

    public boolean onDelegateTouchEvent(TouchDelegate touchDelegate, MotionEvent event) {
        if (touchDelegate instanceof TouchDelegateGroup) {
            return ((TouchDelegateGroup) touchDelegate).onSelfTouchEvent(event);
        } else {
            return touchDelegate.onTouchEvent(event);
        }
    }
}

发表评论