android 视屏手势 VideoGestureView

本文介绍了一个名为VideoGestureView的自定义Android视图组件,通过屏幕两侧的滑动操作实现视频的亮度、音量调节及播放进度控制等功能。此外,还包括单击、双击和长按等交互方式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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);
    }
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值