您的位置:首页 > 移动开发 > Android开发

android 视屏手势 VideoGestureView

2017-04-19 16:06 176 查看
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);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  android view 视频 手势