Moh*_*dar 6 android gesture-recognition android-6.0-marshmallow
我正在使用 ScaleGestureDetector 来检测捏合和捏合动作,方法是获取比例因子,如果小于 1,则缩小,反之亦然。
但问题在于,在 Android 6.0 上,比例因子始终为 1.0,这使得无法区分捏合和捏合。
在此先感谢您的帮助。
import android.content.Context;
import android.os.Handler;
import android.support.v4.view.GestureDetectorCompat;
import android.support.v4.view.MotionEventCompat;
import android.util.Log;
import android.view.GestureDetector;
import android.view.MotionEvent;
import android.view.ScaleGestureDetector;
import android.view.VelocityTracker;
import android.widget.FrameLayout;
public class TouchableWrapper extends FrameLayout
{
private GestureDetectorCompat mGestureDetector;
private ScaleGestureDetector mScaleGestureDetector;
private VelocityTracker mVelocityTracker;
private boolean acceptEvents=true;
ScaleGestureDetector temp;
private final GestureDetector.SimpleOnGestureListener mGestureListener = new GestureDetector.SimpleOnGestureListener()
{
@Override
public boolean onDoubleTap(MotionEvent e)
{
EventBus_Singleton.getInstance().post(new EventBus_Poster(Constants.MAP_DOUBLE_TOUCHED));
return true;
}
@Override
public boolean onDoubleTapEvent(MotionEvent e) {
return super.onDoubleTapEvent(e);
}
};
private final ScaleGestureDetector.OnScaleGestureListener mScaleGestureListener = new ScaleGestureDetector.SimpleOnScaleGestureListener()
{
/**
* This is the active focal point in terms of the viewport. Could be a local
* variable but kept here to minimize per-frame allocations.
*/
float startingSpan;
float startFocusX;
float startFocusY;
@Override
public boolean onScaleBegin(ScaleGestureDetector scaleGestureDetector)
{
temp=scaleGestureDetector;
startingSpan = scaleGestureDetector.getCurrentSpan();
startFocusX = scaleGestureDetector.getFocusX();
startFocusY = scaleGestureDetector.getFocusY();
return true;
}
@Override
public boolean onScale(ScaleGestureDetector scaleGestureDetector)
{
super.onScale(scaleGestureDetector);
float scale = scaleGestureDetector.getScaleFactor();
//mVelocityTracker.computeCurrentVelocity(1000);
if(acceptEvents)
{
Log.e("scaleGestureDetector.getCurrentSpan()", scaleGestureDetector.getCurrentSpan()+"");
Log.e("startingSpan", startingSpan+"");
Log.e("onScale",scale+"");
if (scale <= 1.0)
{
acceptEvents = false;
EventBus_Singleton.getInstance().post(new EventBus_Poster(Constants.MAP_ZOOMED_OUT));
}
else
{
acceptEvents = false;
EventBus_Singleton.getInstance().post(new EventBus_Poster(Constants.MAP_ZOOMED_IN));
}
}
return true;
}
};
public TouchableWrapper(Context context)
{
super(context);
mScaleGestureDetector = new ScaleGestureDetector(context, mScaleGestureListener);
mGestureDetector = new GestureDetectorCompat(context, mGestureListener);
mVelocityTracker = VelocityTracker.obtain();
}
@Override
public boolean onInterceptTouchEvent(MotionEvent ev)
{
mGestureDetector.onTouchEvent(ev);
//Log.e("Motion Event pointer count",ev.getPointerCount()+"");
int action = MotionEventCompat.getActionMasked(ev);
switch (action)
{
case (MotionEvent.ACTION_DOWN):
Log.e("MotionEvent", "Action was DOWN");
break;
case (MotionEvent.ACTION_MOVE):
//Log.e("MotionEvent", "Action was MOVE");
/*if(acceptEvents)
{
if(MotionEventCompat.getPointerCount(ev)==2)
{
x1=MotionEventCompat.getX(ev,0);
x2=MotionEventCompat.getX(ev,1);
y1=MotionEventCompat.getY(ev,0);
y2=MotionEventCompat.getY(ev,1);
if(differenceX==0||differenceY==0)
{
differenceX=Math.abs(x1-x2);
differenceY=Math.abs(y1-y2);
}
else
{
differenceXPrime=Math.abs(x1-x2);
differenceYPrime=Math.abs(y1-y2);
if (differenceXPrime-differenceX>100 || differenceYPrime-differenceY>100)
{
Log.e("Zoomed out","differenceX:"+differenceX+" differenceXPrime:"+differenceXPrime+" differenceY:"+differenceY+" differenceYPrime:"+differenceYPrime);
differenceX=0;
differenceY=0;
acceptEvents=false;
EventBus_Singleton.getInstance().post(new EventBus_Poster(Constants.MAP_ZOOMED_IN));
}
else if(differenceX-differenceXPrime>100 || differenceY-differenceYPrime>100)
{
Log.e("Zoomed in","differenceX:"+differenceX+" differenceXPrime:"+differenceXPrime+" differenceY:"+differenceY+" differenceYPrime:"+differenceYPrime);
differenceX=0;
differenceY=0;
acceptEvents=false;
EventBus_Singleton.getInstance().post(new EventBus_Poster(Constants.MAP_ZOOMED_OUT));
}
}
}
}*/
break;
case (MotionEvent.ACTION_UP):
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
EventBus_Singleton.getInstance().post(new EventBus_Poster(Constants.ENABLE_MAP_GESTURE));
acceptEvents=true;
}
},300);
Log.e("MotionEvent", "Action was UP");
break;
case (MotionEvent.ACTION_POINTER_UP):
Log.e("MotionEvent", "Action was POINTER UP");
break;
case (MotionEvent.ACTION_POINTER_DOWN):
EventBus_Singleton.getInstance().post(new EventBus_Poster(Constants.DISABLE_MAP_GESTURE));
Log.e("MotionEvent", "Action was POINTER DOWN");
break;
case (MotionEvent.ACTION_CANCEL):
Log.e("MotionEvent", "Action was CANCEL");
break;
case (MotionEvent.ACTION_OUTSIDE):
Log.e("MotionEvent", "Movement occurred outside bounds of current screen element");
break;
}
mVelocityTracker.addMovement(ev);
mScaleGestureDetector.onTouchEvent(ev);
return super.onInterceptTouchEvent(ev);
}
}
Run Code Online (Sandbox Code Playgroud)
我认为 onInterceptTouchEvent 没有调用。您需要在 TouchableWrapper 类中重写 onTouchEvent,如下所示:
@Override
public boolean onTouchEvent(MotionEvent event) {
mScaleGestureDetector.onTouchEvent(event);
return true;
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1632 次 |
| 最近记录: |