android 视屏手势 VideoGestureView

来源:互联网 发布:德军总部剧情知乎 编辑:程序博客网 时间:2024/06/05 14:28
android 视屏手势 VideoGestureView,分屏幕两侧滑动,可实现上下亮度,上下声音,左右进度,单击,双击,长按功能
import android.content.Context;import android.os.Looper;import android.util.AttributeSet;import android.view.MotionEvent;import android.view.ViewConfiguration;import android.view.ViewGroup;import android.view.ViewParent;import java.util.Timer;import java.util.TimerTask;/** * Created by Administrator on 2017/3/9. */public class VideoGestureView extends ViewGroup {    float x1 = 0, y1 = 0;    private long ActionDownTime, ActionUpTime;    private int slop;    private int mActivePointerId = -1;    private int mMode;    private int mDeltaXSum,mDeltaYSum;    public static final int Mode_None = 0, //未捕获事件            Mode_Left_Vertical = 1,//左边垂直            Mode_Right_Vertical = 2,//右边垂直            Mode_Horizontal = 3;//横向滑动    private void init() {        slop = ViewConfiguration.get(getContext()).getScaledTouchSlop();    }    public VideoGestureView(Context context) {        super(context);        init();    }    public VideoGestureView(Context context, AttributeSet attrs) {        super(context, attrs);        init();    }    public VideoGestureView(Context context, AttributeSet attrs, int defStyleAttr) {        super(context, attrs, defStyleAttr);        init();    }    public VideoGestureView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {        super(context, attrs, defStyleAttr, defStyleRes);        init();    }    @Override    protected void onLayout(boolean b, int i, int i1, int i2, int i3) {    }    @Override    public boolean onInterceptTouchEvent(MotionEvent ev) {//        return super.onInterceptTouchEvent(ev);        return true;    }    @Override    public boolean onTouchEvent(MotionEvent event) {        if (!isEnabled() || vedioGsstuerListener == null) {            return false;        }        switch (event.getAction() & MotionEvent.ACTION_MASK) {            case MotionEvent.ACTION_DOWN:                ActionDownTime = System.currentTimeMillis();                IsDoubleClick();                x1 = event.getX();                y1 = event.getY();                mActivePointerId = event.getPointerId(0);                mDeltaXSum = 0;                mDeltaYSum = 0;                mMode = Mode_None;                break;            case MotionEvent.ACTION_POINTER_DOWN:                ActionDownTime = System.currentTimeMillis();                IsDoubleClick();                final int index = event.getActionIndex();                x1 = (int) event.getX(index);                y1 = (int) event.getY(index);                mActivePointerId = event.getPointerId(index);                break;            case MotionEvent.ACTION_POINTER_UP:                ActionUpTime = System.currentTimeMillis();                onSecondaryPointerUp(event);                break;            case MotionEvent.ACTION_UP:                ActionUpTime = System.currentTimeMillis();                mMode = Mode_None;                break;            case MotionEvent.ACTION_MOVE:                final int activePointerIndex = event.findPointerIndex(mActivePointerId);                if (activePointerIndex == -1) {                    break;                }                final int x = (int) event.getX(activePointerIndex);                final int y = (int) event.getY(activePointerIndex);                int deltaX = x - (int)x1;                int deltaY = y - (int)y1;                if (mMode==Mode_None&&(Math.abs(deltaX) > slop || Math.abs(deltaY) > slop)) {                    if(timer!=null){                        timer.purge();                        isDoubleClick = false;                    }                    if (Math.abs(deltaX) > Math.abs(deltaY)) {                        mMode=Mode_Horizontal;                    } else {                        if(x1 < getWidth() / 2){                            mMode = Mode_Left_Vertical;                        }else {                            mMode = Mode_Right_Vertical;                        }                    }                    final ViewParent parent = getParent();                    if (parent != null) {                        parent.requestDisallowInterceptTouchEvent(true);                    }                }else {                    if (getParent() != null)                        getParent().requestDisallowInterceptTouchEvent(false);                }                if (mMode != Mode_None) {                    x1 = x;                    y1 = y;                    mDeltaXSum += deltaX;                    mDeltaYSum += deltaY;                    if (vedioGsstuerListener != null) {                        vedioGsstuerListener.onMoveing(mMode, deltaX, deltaY, mDeltaXSum, mDeltaYSum);                    }                }                break;        }        return true;    }    private Timer timer = null;    private Boolean isDoubleClick = false;    private void IsDoubleClick() {        if (isDoubleClick == false) {            isDoubleClick = true;                        timer = new Timer();            timer.schedule(new TimerTask() {                @Override                public void run() {                    Looper.prepare();                    if (isDoubleClick == true) {                        if (mMode==Mode_None) {                            if (ActionDownTime > ActionUpTime) {                                vedioGsstuerListener.longClick();                            } else {                                vedioGsstuerListener.click();                            }                        }                        isDoubleClick = false;                    }                    Looper.loop();                }            }, 500);        } else {            vedioGsstuerListener.doubleClick();            isDoubleClick = false;            ActionDownTime = 0L;            ActionUpTime = 0L;        }    }    private void onSecondaryPointerUp(MotionEvent ev) {        final int pointerIndex = (ev.getAction() & MotionEvent.ACTION_POINTER_INDEX_MASK) >>                MotionEvent.ACTION_POINTER_INDEX_SHIFT;        final int pointerId = ev.getPointerId(pointerIndex);        if (pointerId == mActivePointerId) {            final int newPointerIndex = pointerIndex == 0 ? 1 : 0;            x1 = (int) ev.getX(newPointerIndex);            y1 = (int) ev.getY(newPointerIndex);            mActivePointerId = ev.getPointerId(newPointerIndex);        }    }    private VedioGsstuerListener vedioGsstuerListener;    public void setVedioGsstuerListener(VedioGsstuerListener listener) {        this.vedioGsstuerListener = listener;    }    public interface VedioGsstuerListener {        void doubleClick();        void click();        void longClick();        /**         * @param mode      模式         * @param deltaX    滑动的x偏移量         * @param deltaY    滑动的y偏移量         * @param deltaXSum 滑动的x偏移量之和         * @param deltaYSum 滑动的y偏移量之和         */        void onMoveing(int mode, int deltaX, int deltaY, int deltaXSum, int deltaYSum);    }}
0 0
原创粉丝点击