package com.youplayer.util;
import android.util.FloatMath;
import android.view.MotionEvent;
public class YouPlayerTouchPointersUtil {
public static final String tag = "TouchPointers";
private TouchPointersMove mTouchPointersMove;
private TouchPointersZoom mTouchPointersZoom;
public YouPlayerTouchPointersUtil(){
mTouchPointersMove = new TouchPointersMove();
mTouchPointersZoom = new TouchPointersZoom();
}
public void setMoveEvent(MotionEvent event){
if(mTouchPointersMove != null){
mTouchPointersMove.setEvent(event);
}
}
public void setZoomEvent(MotionEvent event){
if(mTouchPointersZoom != null){
mTouchPointersZoom.setEvent(event);
}
}
public class TouchPointersMove{
private float old1_X = 0;
private float old1_Y = 0;
private float old2_X = 0;
private float old2_Y = 0;
private boolean x1_left_move = false;
private boolean x2_left_move = false;
private boolean x1_right_move = false;
private boolean x2_right_move = false;
private boolean y1_top_move = false;
private boolean y2_top_move = false;
private boolean y1_bottom_move = false;
private boolean y2_bottom_move = false;
private float POINTER_DISTANCE = 5;
public TouchPointersMove(){
}
public void setMoveDefaultValue(){
x1_right_move = false;
x2_right_move = false;
x1_left_move = false;
x2_left_move = false;
y1_top_move = false;
y2_top_move = false;
y1_bottom_move = false;
y2_bottom_move = false;
}
public void setPos1DefaultValue(MotionEvent event){
old1_X = event.getX(event.getPointerId(0));
old1_Y = event.getY(event.getPointerId(0));
}
public void setPos2DefaultValue(MotionEvent event){
old2_X = event.getX(event.getPointerId(1));
old2_Y = event.getY(event.getPointerId(1));
}
public void setEvent(MotionEvent event){
try {
if(event.getPointerCount() != 2){
return;
}
switch(event.getAction()){
case MotionEvent.ACTION_POINTER_1_DOWN:
v("TouchPointers", "ACTION_POINTER_1_DOWN");
setPos1DefaultValue(event);
setPos2DefaultValue(event);
break;
case MotionEvent.ACTION_POINTER_1_UP:
v("TouchPointers", "ACTION_POINTER_1_UP");
setMoveDefaultValue();
break;
case MotionEvent.ACTION_POINTER_2_DOWN:
v("TouchPointers", "ACTION_POINTER_2_DOWN");
setPos1DefaultValue(event);
setPos2DefaultValue(event);
break;
case MotionEvent.ACTION_POINTER_2_UP:
v("TouchPointers", "ACTION_POINTER_2_UP");
setMoveDefaultValue();
break;
case MotionEvent.ACTION_MOVE:
// v("TouchPointers", "ACTION_MOVE");
touchMove(event);
break;
default:
break;
}
} catch (Exception e) {
e.printStackTrace();
}
}
public void touchMove(MotionEvent event){
float x1 = event.getX(event.getPointerId(0));
float y1 = event.getY(event.getPointerId(0));
float x2 = event.getX(event.getPointerId(1));
float y2 = event.getY(event.getPointerId(1));
boolean is_left_move = isLeftMove(old1_X, old1_Y, old2_X, old2_Y, x1, y1, x2, y2);
if(is_left_move){
leftMoveNotify();
}
boolean is_right_move = isRightMove(old1_X, old1_Y, old2_X, old2_Y, x1, y1, x2, y2);
if(is_right_move){
rightMoveNotify();
}
boolean is_top_move = isTopMove(old1_X, old1_Y, old2_X, old2_Y, x1, y1, x2, y2);
if(is_top_move){
topMoveNotify();
}
boolean is_bottom_move = isBottomMove(old1_X, old1_Y, old2_X, old2_Y, x1, y1, x2, y2);
if(is_bottom_move){
bottomMoveNotify();
}
old1_X = x1;
old1_Y = y1;
old2_X = x2;
old2_Y = y2;
}
public float distanceMoveX(float x0, float x1){
return (x1 - x0);
}
public float distanceMoveY(float y0, float y1){
return (y1 - y0);
}
public boolean isLeftMove(float oldx1, float oldy1, float oldx2, float oldy2, float x1, float y1, float x2, float y2){
boolean result = false;
float x1_distance = distanceMoveX(oldx1, x1);
float x2_distance = distanceMoveX(oldx2, x2);
float y1_distance = distanceMoveY(oldy1, y1);
float y2_distance = distanceMoveY(oldy2, y2);
if(!x1_left_move || !x2_left_move){
if( (x1_distance < 0 && Math.abs(x1_distance) > POINTER_DISTANCE) && (Math.abs(x1_distance) > Math.abs(y1_distance)) ){
x1_left_move = true;
}
if( (x2_distance < 0 && Math.abs(x2_distance) > POINTER_DISTANCE) && (Math.abs(x2_distance) > Math.abs(y2_distance)) ){
x2_left_move = true;
}
if(x1_left_move && x2_left_move ){
// e("isLeftMove", "left x move");
x1_left_move = false;
x2_left_move = false;
result = true;
}
}
return result;
}
public boolean isRightMove(float oldx1, float oldy1, float oldx2, float oldy2, float x1, float y1, float x2, float y2){
boolean result = false;
float x1_distance = distanceMoveX(oldx1, x1);
float x2_distance = distanceMoveX(oldx2, x2);
float y1_distance = distanceMoveY(oldy1, y1);
float y2_distance = distanceMoveY(oldy2, y2);
if(!x1_right_move || !x2_right_move){
if( (x1_distance > 0 && Math.abs(x1_distance) > POINTER_DISTANCE) && (Math.abs(x1_distance) > Math.abs(y1_distance)) ){
x1_right_move = true;
}
if( (x2_distance > 0 && Math.abs(x2_distance) > POINTER_DISTANCE) && (Math.abs(x2_distance) > Math.abs(y2_distance)) ){
x2_right_move = true;
}
if(x1_right_move && x2_right_move){
// e("isRightMove", "right x move");
x1_right_move = false;
x2_right_move = false;
result = true;
}
}
return result;
}
public boolean isTopMove(float oldx1, float oldy1, float oldx2, float oldy2, float x1, float y1, float x2, float y2){
boolean result = false;
float x1_distance = distanceMoveX(oldx1, x1);
float x2_distance = distanceMoveX(oldx2, x2);
float y1_distance = distanceMoveY(oldy1, y1);
float y2_distance = distanceMoveY(oldy2, y2);
if(!y1_top_move || !y2_top_move){
if( (y1_distance < 0 && Math.abs(y1_distance) > POINTER_DISTANCE) && (Math.abs(y1_distance) > Math.abs(x1_distance)) ){
y1_top_move = true;
}
if( (y2_distance < 0 && Math.abs(y2_distance) > POINTER_DISTANCE) && (Math.abs(y2_distance) > Math.abs(x2_distance)) ){
y2_top_move = true;
}
if(y1_top_move && y2_top_move ){
// e("isTopMove", "top y move");
y1_top_move = false;
y2_top_move = false;
result = true;
}
}
return result;
}
public boolean isBottomMove(float oldx1, float oldy1, float oldx2, float oldy2, float x1, float y1, float x2, float y2){
boolean result = false;
float x1_distance = distanceMoveX(oldx1, x1);
float x2_distance = distanceMoveX(oldx2, x2);
float y1_distance = distanceMoveY(oldy1, y1);
float y2_distance = distanceMoveY(oldy2, y2);
if(!y1_bottom_move || !y2_bottom_move){
if( (y1_distance > 0 && Math.abs(y1_distance) > POINTER_DISTANCE) && (Math.abs(y1_distance) > Math.abs(x1_distance)) ){
y1_bottom_move = true;
}
if( (y2_distance > 0 && Math.abs(y2_distance) > POINTER_DISTANCE) && (Math.abs(y2_distance) > Math.abs(x2_distance)) ){
y2_bottom_move = true;
}
if(y1_bottom_move && y2_bottom_move ){
// e("isBottomMove", "bottom y move");
y1_bottom_move = false;
y2_bottom_move = false;
result = true;
}
}
return result;
}
}
public class TouchPointersZoom{
private float oldDiff = 10.0f;
private float POINTER_DIFF = 50.0f;
public TouchPointersZoom(){
}
public void setPos1DefaultValue(MotionEvent event){
event.getX(event.getPointerId(0));
event.getY(event.getPointerId(0));
}
public void setPos2DefaultValue(MotionEvent event){
event.getX(event.getPointerId(1));
event.getY(event.getPointerId(1));
}
public void setZoomDefaultValue(){
is_out_zoom_notify = false;
is_in_zoom_notify = false;
}
public void setEvent(MotionEvent event){
try {
if(event.getPointerCount() != 2){
return;
}
switch(event.getAction()){
case MotionEvent.ACTION_POINTER_1_DOWN:
// v("TouchPointersZoom", "ACTION_POINTER_1_DOWN");
setPos1DefaultValue(event);
setPos2DefaultValue(event);
oldDiff = spacing(event);
// v("oldDiff", "oldDiff:" + oldDiff);
break;
case MotionEvent.ACTION_POINTER_1_UP:
// v("TouchPointersZoom", "ACTION_POINTER_1_UP");
setZoomDefaultValue();
break;
case MotionEvent.ACTION_POINTER_2_DOWN:
v("TouchPointersZoom", "ACTION_POINTER_2_DOWN");
setPos1DefaultValue(event);
setPos2DefaultValue(event);
oldDiff = spacing(event);
// v("oldDiff", "oldDiff:" + oldDiff);
break;
case MotionEvent.ACTION_POINTER_2_UP:
v("TouchPointersZoom", "ACTION_POINTER_2_UP");
setZoomDefaultValue();
break;
case MotionEvent.ACTION_MOVE:
v("TouchPointersZoom", "ACTION_MOVE");
touchZoom(event);
break;
default:
break;
}
} catch (Exception e) {
e.printStackTrace();
}
}
public void touchZoom(MotionEvent event){
if(isInZoom(event)){
inZoomNotify();
}
if(isOutZoom(event)){
outZoomNotify();
}
}
public float spacing(MotionEvent event) {
float x = event.getX(event.getPointerId(0)) - event.getX(event.getPointerId(1));
float y = event.getY(event.getPointerId(0)) - event.getY(event.getPointerId(1));
return Math.abs(FloatMath.sqrt(x * x + y * y));
}
public boolean isInZoom(MotionEvent event){
boolean result = false;
float newDiff = spacing(event);
if(newDiff + POINTER_DIFF < oldDiff){
result = true;
}
return result;
}
public boolean isOutZoom(MotionEvent event){
boolean result = false;
float newDiff = spacing(event);
if(newDiff - POINTER_DIFF > oldDiff){
result = true;
}
return result;
}
}
boolean isZoom = true;
public void setIsZoom(boolean isZoom){
this.isZoom = isZoom;
}
public boolean getIsZoom(){
return isZoom;
}
boolean isMove = true;
public void setIsMove(boolean isMove){
this.isMove = isMove;
}
public boolean getIsMove(){
return isMove;
}
public TouchPointersMoveCallback mTouchPointersMoveCallback;
public void setUtilMoveCallback(YouPlayerTouchPointersUtil.TouchPointersMoveCallback callback){
mTouchPointersMoveCallback = callback;
}
public void leftMoveNotify(){
if(mTouchPointersMoveCallback != null){
mTouchPointersMoveCallback.onLeftMoveCallback();
// v("leftMoveNotify", "leftMoveNotify");
}
}
public void rightMoveNotify(){
if(mTouchPointersMoveCallback != null){
mTouchPointersMoveCallback.onRightMoveCallback();
// v("rightMoveNotify", "rightMoveNotify");
}
}
public void topMoveNotify(){
if(mTouchPointersMoveCallback != null){
mTouchPointersMoveCallback.onTopMoveCallback();
// v("topMoveNotify", "topMoveNotify");
}
}
public void bottomMoveNotify(){
if(mTouchPointersMoveCallback != null){
mTouchPointersMoveCallback.onBottomMoveCallback();
// v("bottomMoveNotify", "bottomMoveNotify");
}
}
private TouchPointersZoomCallback mTouchPointersZoomCallback;
private boolean is_out_zoom_notify = false;
private boolean is_in_zoom_notify = false;
public void setUtilZoomCallback(TouchPointersZoomCallback callback){
mTouchPointersZoomCallback = callback;
}
public void inZoomNotify(){
if(mTouchPointersZoomCallback != null){
if(!is_in_zoom_notify){
mTouchPointersZoomCallback.onInZoomCallback();
is_in_zoom_notify = true;
// v("inZoomNotify", "inZoomNotify");
}
}
}
public void outZoomNotify(){
if(mTouchPointersZoomCallback != null){
if(!is_out_zoom_notify){
mTouchPointersZoomCallback.onOutZoomCallback();
is_out_zoom_notify = true;
// v("outZoomNotify", "outZoomNotify");
}
}
}
public interface TouchPointersMoveCallback{
public void onLeftMoveCallback();
public void onRightMoveCallback();
public void onTopMoveCallback();
public void onBottomMoveCallback();
}
public interface TouchPointersZoomCallback{
public void onInZoomCallback();
public void onOutZoomCallback();
}
public static void v(String type, String msg){
// String des = String.format("[%10.10s][%16.16s]%s", tag, type, msg);
LOG.v("TOUCHpOINTERuTIL",type, msg);
}
public static void e(String type, String msg){
// String des = String.format("[%10.10s][%16.16s]%s", tag, type, msg);
// Log.e("TP", des);
LOG.e("TOUCHpOINTERuTIL",type, msg);
}
}