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
- android 视屏手势 VideoGestureView
- Android GestureDetector 手势滑屏
- Android手势锁屏界面
- android手势
- android 手势
- Android手势
- Android:手势
- Android手势
- Android手势
- Android 手势
- Android手势
- Android--手势
- Android手势
- Android 手势
- android手势
- android 添加左右滑屏手势
- Android ViewFlipper的使用(手势滑屏)
- Android开发 Android手势
- 1107. Social Clusters (30)
- shell命令学习网站
- iOS瘦身-无用Pod依赖检查脚本
- ubuntu下libusb安装与测试
- dojo初解和dojo.connect用法(转)
- android 视屏手势 VideoGestureView
- 查看网络流量
- AFNetworking(v3.0+)框架学习总结(二内部逻辑处理过程)
- 【类反射】反射示例(模拟Instanceof的功能)
- Linux系统下配置Java环境
- Android .9图片
- Oracle 触发器更新本表数据
- Android Loader 异步加载详解一:基础概念
- Linux环境下配置虚拟主机域名