Physical fling enhancements (#505)
This commit is contained in:
parent
956feec116
commit
ba18ccf967
@ -427,7 +427,7 @@ public class MapEventLayer extends AbstractMapEventLayer implements InputListene
|
|||||||
mPrevPinchWidth = pinchWidth;
|
mPrevPinchWidth = pinchWidth;
|
||||||
|
|
||||||
if (Parameters.ANIMATOR2) {
|
if (Parameters.ANIMATOR2) {
|
||||||
if (mDoScale && scaleBy != 1f) {
|
if (scaleBy != 1f) {
|
||||||
if (mScaleTracker.mNumSamples < 0)
|
if (mScaleTracker.mNumSamples < 0)
|
||||||
mScaleTracker.start((float) pinchWidth, 0, e.getTime());
|
mScaleTracker.start((float) pinchWidth, 0, e.getTime());
|
||||||
else
|
else
|
||||||
|
@ -518,7 +518,7 @@ public class MapEventLayer2 extends AbstractMapEventLayer implements InputListen
|
|||||||
mPrevPinchWidth = pinchWidth;
|
mPrevPinchWidth = pinchWidth;
|
||||||
|
|
||||||
if (Parameters.ANIMATOR2) {
|
if (Parameters.ANIMATOR2) {
|
||||||
if (mDoScale && scaleBy != 1f) {
|
if (scaleBy != 1f) {
|
||||||
if (mScaleTracker.mNumSamples < 0)
|
if (mScaleTracker.mNumSamples < 0)
|
||||||
mScaleTracker.start((float) pinchWidth, 0, e.getTime());
|
mScaleTracker.start((float) pinchWidth, 0, e.getTime());
|
||||||
else
|
else
|
||||||
|
@ -41,13 +41,24 @@ public class Animator2 extends Animator {
|
|||||||
/**
|
/**
|
||||||
* The minimum changes that are pleasant for users.
|
* The minimum changes that are pleasant for users.
|
||||||
*/
|
*/
|
||||||
private static final float DEFAULT_MIN_VISIBLE_CHANGE_PIXELS = 0.5f;
|
private static final float DEFAULT_MIN_VISIBLE_CHANGE_PIXELS = 0.6f;
|
||||||
private static final float DEFAULT_MIN_VISIBLE_CHANGE_RADIAN = 0.001f;
|
private static final float DEFAULT_MIN_VISIBLE_CHANGE_RADIAN = 0.001f;
|
||||||
private static final float DEFAULT_MIN_VISIBLE_CHANGE_SCALE = 1f;
|
private static final float DEFAULT_MIN_VISIBLE_CHANGE_SCALE = 1f;
|
||||||
|
|
||||||
private static final float FLING_FRICTION_MOVE = 0.9f;
|
/**
|
||||||
private static final float FLING_FRICTION_ROTATE = 1.0f;
|
* The friction scalar for fling movements (1 as default).
|
||||||
private static final float FLING_FRICTION_SCALE = 1.2f;
|
*/
|
||||||
|
public static float FLING_FRICTION_MOVE = 1.0f;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The friction scalar for fling rotations (1.2 as default).
|
||||||
|
*/
|
||||||
|
public static float FLING_FRICTION_ROTATE = 1.2f;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The friction scalar for fling scales (1.2 as default).
|
||||||
|
*/
|
||||||
|
public static float FLING_FRICTION_SCALE = 1.2f;
|
||||||
|
|
||||||
private final DragForce mFlingRotateForce = new DragForce();
|
private final DragForce mFlingRotateForce = new DragForce();
|
||||||
private final DragForce mFlingScaleForce = new DragForce();
|
private final DragForce mFlingScaleForce = new DragForce();
|
||||||
@ -61,6 +72,11 @@ public class Animator2 extends Animator {
|
|||||||
|
|
||||||
public Animator2(Map map) {
|
public Animator2(Map map) {
|
||||||
super(map);
|
super(map);
|
||||||
|
|
||||||
|
// Init fling force thresholds
|
||||||
|
mFlingRotateForce.setValueThreshold(DEFAULT_MIN_VISIBLE_CHANGE_RADIAN);
|
||||||
|
mFlingScrollForce.setValueThreshold(DEFAULT_MIN_VISIBLE_CHANGE_PIXELS);
|
||||||
|
mFlingScaleForce.setValueThreshold(DEFAULT_MIN_VISIBLE_CHANGE_SCALE);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -71,19 +87,22 @@ public class Animator2 extends Animator {
|
|||||||
public void animateFlingRotate(float angularVelocity, float pivotX, float pivotY) {
|
public void animateFlingRotate(float angularVelocity, float pivotX, float pivotY) {
|
||||||
ThreadUtils.assertMainThread();
|
ThreadUtils.assertMainThread();
|
||||||
|
|
||||||
mMap.getMapPosition(mStartPos);
|
float flingFactor = -0.25f; // Can be changed but should be standardized for all callers
|
||||||
|
|
||||||
mPivot.x = pivotX;
|
|
||||||
mPivot.y = pivotY;
|
|
||||||
|
|
||||||
float flingFactor = -0.4f; // Can be changed but should be standardized for all callers
|
|
||||||
angularVelocity *= flingFactor;
|
angularVelocity *= flingFactor;
|
||||||
|
|
||||||
mFlingRotateForce.setValueThreshold(DEFAULT_MIN_VISIBLE_CHANGE_RADIAN);
|
|
||||||
mFlingRotateForce.setFrictionScalar(FLING_FRICTION_ROTATE);
|
mFlingRotateForce.setFrictionScalar(FLING_FRICTION_ROTATE);
|
||||||
mFlingRotateForce.setValueAndVelocity(0f, angularVelocity);
|
mFlingRotateForce.setValueAndVelocity(0f, angularVelocity);
|
||||||
|
|
||||||
animFlingStart(ANIM_ROTATE);
|
if (!isActive()) {
|
||||||
|
mMap.getMapPosition(mStartPos);
|
||||||
|
|
||||||
|
mPivot.x = pivotX;
|
||||||
|
mPivot.y = pivotY;
|
||||||
|
|
||||||
|
animFlingStart(ANIM_ROTATE);
|
||||||
|
} else {
|
||||||
|
mState |= ANIM_ROTATE;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -99,8 +118,6 @@ public class Animator2 extends Animator {
|
|||||||
if (velocityX * velocityX + velocityY * velocityY < 2048)
|
if (velocityX * velocityX + velocityY * velocityY < 2048)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
mMap.getMapPosition(mStartPos);
|
|
||||||
|
|
||||||
float flingFactor = 2.0f; // Can be changed but should be standardized for all callers
|
float flingFactor = 2.0f; // Can be changed but should be standardized for all callers
|
||||||
float screenFactor = CanvasAdapter.DEFAULT_DPI / CanvasAdapter.dpi;
|
float screenFactor = CanvasAdapter.DEFAULT_DPI / CanvasAdapter.dpi;
|
||||||
|
|
||||||
@ -114,11 +131,16 @@ public class Animator2 extends Animator {
|
|||||||
mScrollRatio.y = velocityY / sumVelocity;
|
mScrollRatio.y = velocityY / sumVelocity;
|
||||||
mScrollDet2D = (float) (mScrollRatio.x * mScrollRatio.x + mScrollRatio.y * mScrollRatio.y);
|
mScrollDet2D = (float) (mScrollRatio.x * mScrollRatio.x + mScrollRatio.y * mScrollRatio.y);
|
||||||
|
|
||||||
mFlingScrollForce.setValueThreshold(DEFAULT_MIN_VISIBLE_CHANGE_PIXELS);
|
|
||||||
mFlingScrollForce.setFrictionScalar(FLING_FRICTION_MOVE);
|
mFlingScrollForce.setFrictionScalar(FLING_FRICTION_MOVE);
|
||||||
mFlingScrollForce.setValueAndVelocity(0f, (float) Math.sqrt(velocityX * velocityX + velocityY * velocityY));
|
mFlingScrollForce.setValueAndVelocity(0f, (float) Math.sqrt(velocityX * velocityX + velocityY * velocityY));
|
||||||
|
|
||||||
animFlingStart(ANIM_MOVE);
|
if (!isActive()) {
|
||||||
|
mMap.getMapPosition(mStartPos);
|
||||||
|
|
||||||
|
animFlingStart(ANIM_MOVE);
|
||||||
|
} else {
|
||||||
|
mState |= ANIM_MOVE;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -129,20 +151,23 @@ public class Animator2 extends Animator {
|
|||||||
public void animateFlingZoom(float scaleVelocity, float pivotX, float pivotY) {
|
public void animateFlingZoom(float scaleVelocity, float pivotX, float pivotY) {
|
||||||
ThreadUtils.assertMainThread();
|
ThreadUtils.assertMainThread();
|
||||||
|
|
||||||
mMap.getMapPosition(mStartPos);
|
|
||||||
|
|
||||||
mPivot.x = pivotX;
|
|
||||||
mPivot.y = pivotY;
|
|
||||||
|
|
||||||
float flingFactor = -1.0f; // Can be changed but should be standardized for all callers
|
float flingFactor = -1.0f; // Can be changed but should be standardized for all callers
|
||||||
float screenFactor = CanvasAdapter.DEFAULT_DPI / CanvasAdapter.dpi;
|
float screenFactor = CanvasAdapter.DEFAULT_DPI / CanvasAdapter.dpi;
|
||||||
scaleVelocity *= flingFactor * screenFactor;
|
scaleVelocity *= flingFactor * screenFactor;
|
||||||
|
|
||||||
mFlingScaleForce.setValueThreshold(DEFAULT_MIN_VISIBLE_CHANGE_SCALE);
|
|
||||||
mFlingScaleForce.setFrictionScalar(FLING_FRICTION_SCALE);
|
mFlingScaleForce.setFrictionScalar(FLING_FRICTION_SCALE);
|
||||||
mFlingScaleForce.setValueAndVelocity(0f, scaleVelocity);
|
mFlingScaleForce.setValueAndVelocity(0f, scaleVelocity);
|
||||||
|
|
||||||
animFlingStart(ANIM_SCALE);
|
if (!isActive()) {
|
||||||
|
mMap.getMapPosition(mStartPos);
|
||||||
|
|
||||||
|
mPivot.x = pivotX;
|
||||||
|
mPivot.y = pivotY;
|
||||||
|
|
||||||
|
animFlingStart(ANIM_SCALE);
|
||||||
|
} else {
|
||||||
|
mState |= ANIM_SCALE;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void animFlingStart(int state) {
|
private void animFlingStart(int state) {
|
||||||
@ -252,7 +277,6 @@ public class Animator2 extends Animator {
|
|||||||
// Do physical fling animation
|
// Do physical fling animation
|
||||||
long deltaT = currentFrametime - mFrameStart;
|
long deltaT = currentFrametime - mFrameStart;
|
||||||
mFrameStart = currentFrametime;
|
mFrameStart = currentFrametime;
|
||||||
boolean isAnimationFinished = true;
|
|
||||||
|
|
||||||
if ((mState & ANIM_SCALE) != 0) {
|
if ((mState & ANIM_SCALE) != 0) {
|
||||||
float valueDelta = mFlingScaleForce.updateValueAndVelocity(deltaT) / 1000f;
|
float valueDelta = mFlingScaleForce.updateValueAndVelocity(deltaT) / 1000f;
|
||||||
@ -261,7 +285,10 @@ public class Animator2 extends Animator {
|
|||||||
valueDelta = valueDelta > 0 ? valueDelta + 1 : -1 / (valueDelta - 1);
|
valueDelta = valueDelta > 0 ? valueDelta + 1 : -1 / (valueDelta - 1);
|
||||||
v.scaleMap(valueDelta, (float) mPivot.x, (float) mPivot.y);
|
v.scaleMap(valueDelta, (float) mPivot.x, (float) mPivot.y);
|
||||||
}
|
}
|
||||||
isAnimationFinished = (velocity == 0);
|
|
||||||
|
if (velocity == 0) {
|
||||||
|
mState &= (~ANIM_SCALE); // End scale mode
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((mState & ANIM_MOVE) != 0) {
|
if ((mState & ANIM_MOVE) != 0) {
|
||||||
@ -276,7 +303,9 @@ public class Animator2 extends Animator {
|
|||||||
v.moveMap(dx, dy);
|
v.moveMap(dx, dy);
|
||||||
}
|
}
|
||||||
|
|
||||||
isAnimationFinished = isAnimationFinished && (velocity == 0);
|
if (velocity == 0) {
|
||||||
|
mState &= (~ANIM_MOVE); // End move mode
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((mState & ANIM_ROTATE) != 0) {
|
if ((mState & ANIM_ROTATE) != 0) {
|
||||||
@ -285,15 +314,19 @@ public class Animator2 extends Animator {
|
|||||||
|
|
||||||
v.rotateMap(valueDelta, (float) mPivot.x, (float) mPivot.y);
|
v.rotateMap(valueDelta, (float) mPivot.x, (float) mPivot.y);
|
||||||
|
|
||||||
isAnimationFinished = isAnimationFinished && (velocity == 0);
|
if (velocity == 0) {
|
||||||
|
mState &= (~ANIM_ROTATE); // End rotate mode
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/*if ((mState & ANIM_TILT) != 0) {
|
/*if ((mState & ANIM_TILT) != 0) {
|
||||||
// Do some tilt fling
|
// Do some tilt fling
|
||||||
isAnimationFinished = isAnimationFinished && (velocity == 0);
|
if(velocity == 0) {
|
||||||
|
mState &= (~ANIM_TILT); // End tilt mode
|
||||||
|
}
|
||||||
}*/
|
}*/
|
||||||
|
|
||||||
if (isAnimationFinished) {
|
if ((mState & (ANIM_MOVE | ANIM_ROTATE | ANIM_SCALE)) == 0) {
|
||||||
//log.debug("animate END");
|
//log.debug("animate END");
|
||||||
cancel();
|
cancel();
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user