package com.dl7.player.utils;
import android.graphics.PointF;
import android.view.MotionEvent;
/**
* Created by Rukey7 on 2016/11/21.
*/
public final class MotionEventUtils {
public static final int FINGER_FLAG_1 = 601;
public static final int FINGER_FLAG_2 = 602;
public static final int FINGER_FLAG_3 = 603;
private MotionEventUtils() {
throw new AssertionError();
}
/**
* Determine the space between the first two fingers
*/
public static float calcSpacing(MotionEvent event, int index1, int index2) {
float x = event.getX(index1) - event.getX(index2);
float y = event.getY(index1) - event.getY(index2);
return (float) Math.sqrt(x * x + y * y);
}
/**
* Determine the space between the two fingers
* @param event
* @param fingerFlag
* @return
*/
public static float calcSpacing(MotionEvent event, int fingerFlag) {
float x, y;
if (FINGER_FLAG_1 == fingerFlag) {
x = (event.getX(0) + event.getX(1)) / 2 - event.getX(2);
y = (event.getY(0) + event.getY(1)) / 2 - event.getY(2);
} else if (FINGER_FLAG_2 == fingerFlag) {
x = (event.getX(0) + event.getX(2)) / 2 - event.getX(1);
y = (event.getY(0) + event.getY(2)) / 2 - event.getY(1);
} else if (FINGER_FLAG_3 == fingerFlag) {
x = (event.getX(2) + event.getX(1)) / 2 - event.getX(0);
y = (event.getY(2) + event.getY(1)) / 2 - event.getY(0);
} else {
x = (event.getX(0) - event.getX(1));
y = (event.getY(0) - event.getY(1));
}
return (float) Math.sqrt(x * x + y * y);
}
/**
* Calculate the mid point of two pointers
*/
public static void midPoint(PointF point, MotionEvent event) {
float x = event.getX(0) + event.getX(1) + event.getX(2);
float y = event.getY(0) + event.getY(1) + event.getY(2);
point.set(x / 3, y / 3);
}
/**
* 计算靠的最近的两指
* @param event
* @return
*/
public static int calcFingerFlag(MotionEvent event) {
float space1 = calcSpacing(event, 0, 1);
float space2 = calcSpacing(event, 0, 2);
float space3 = calcSpacing(event, 2, 1);
float minSpace = Math.min(space1, Math.min(space2, space3));
if (minSpace == space1) {
return FINGER_FLAG_1;
} else if (minSpace == space2) {
return FINGER_FLAG_2;
} else if (minSpace == space3) {
return FINGER_FLAG_3;
} else {
return -1;
}
}
/**
* Calculate the degree to be rotated by.
*
* @param event
* @return Degrees
*/
public static float rotation(MotionEvent event, int fingerFlag) {
double delta_x, delta_y;
if (FINGER_FLAG_1 == fingerFlag) {
delta_x = (event.getX(0) + event.getX(1)) / 2 - event.getX(2);
delta_y = (event.getY(0) + event.getY(1)) / 2 - event.getY(2);
} else if (FINGER_FLAG_2 == fingerFlag) {
delta_x = (event.getX(0) + event.getX(2)) / 2 - event.getX(1);
delta_y = (event.getY(0) + event.getY(2)) / 2 - event.getY(1);
} else if (FINGER_FLAG_3 == fingerFlag) {
delta_x = (event.getX(2) + event.getX(1)) / 2 - event.getX(0);
delta_y = (event.getY(2) + event.getY(1)) / 2 - event.getY(0);
} else {
delta_x = (event.getX(0) - event.getX(1));
delta_y = (event.getY(0) - event.getY(1));
}
double radians = Math.atan2(delta_y, delta_x);
return (float) Math.toDegrees(radians);
}
}