-
-
Save guohai/2293628 to your computer and use it in GitHub Desktop.
import android.graphics.PointF; | |
import android.view.animation.Animation; | |
import android.view.animation.Transformation; | |
// http://www.math.ubc.ca/~cass/gfx/bezier.html | |
public class ArcTranslateAnimation extends Animation { | |
private int mFromXType = ABSOLUTE; | |
private int mToXType = ABSOLUTE; | |
private int mFromYType = ABSOLUTE; | |
private int mToYType = ABSOLUTE; | |
private float mFromXValue = 0.0f; | |
private float mToXValue = 0.0f; | |
private float mFromYValue = 0.0f; | |
private float mToYValue = 0.0f; | |
private float mFromXDelta; | |
private float mToXDelta; | |
private float mFromYDelta; | |
private float mToYDelta; | |
private PointF mStart; | |
private PointF mControl; | |
private PointF mEnd; | |
/** | |
* Constructor to use when building a ArcTranslateAnimation from code | |
* | |
* @param fromXDelta | |
* Change in X coordinate to apply at the start of the animation | |
* @param toXDelta | |
* Change in X coordinate to apply at the end of the animation | |
* @param fromYDelta | |
* Change in Y coordinate to apply at the start of the animation | |
* @param toYDelta | |
* Change in Y coordinate to apply at the end of the animation | |
*/ | |
public ArcTranslateAnimation(float fromXDelta, float toXDelta, | |
float fromYDelta, float toYDelta) { | |
mFromXValue = fromXDelta; | |
mToXValue = toXDelta; | |
mFromYValue = fromYDelta; | |
mToYValue = toYDelta; | |
mFromXType = ABSOLUTE; | |
mToXType = ABSOLUTE; | |
mFromYType = ABSOLUTE; | |
mToYType = ABSOLUTE; | |
} | |
/** | |
* Constructor to use when building a ArcTranslateAnimation from code | |
* | |
* @param fromXType | |
* Specifies how fromXValue should be interpreted. One of | |
* Animation.ABSOLUTE, Animation.RELATIVE_TO_SELF, or | |
* Animation.RELATIVE_TO_PARENT. | |
* @param fromXValue | |
* Change in X coordinate to apply at the start of the animation. | |
* This value can either be an absolute number if fromXType is | |
* ABSOLUTE, or a percentage (where 1.0 is 100%) otherwise. | |
* @param toXType | |
* Specifies how toXValue should be interpreted. One of | |
* Animation.ABSOLUTE, Animation.RELATIVE_TO_SELF, or | |
* Animation.RELATIVE_TO_PARENT. | |
* @param toXValue | |
* Change in X coordinate to apply at the end of the animation. | |
* This value can either be an absolute number if toXType is | |
* ABSOLUTE, or a percentage (where 1.0 is 100%) otherwise. | |
* @param fromYType | |
* Specifies how fromYValue should be interpreted. One of | |
* Animation.ABSOLUTE, Animation.RELATIVE_TO_SELF, or | |
* Animation.RELATIVE_TO_PARENT. | |
* @param fromYValue | |
* Change in Y coordinate to apply at the start of the animation. | |
* This value can either be an absolute number if fromYType is | |
* ABSOLUTE, or a percentage (where 1.0 is 100%) otherwise. | |
* @param toYType | |
* Specifies how toYValue should be interpreted. One of | |
* Animation.ABSOLUTE, Animation.RELATIVE_TO_SELF, or | |
* Animation.RELATIVE_TO_PARENT. | |
* @param toYValue | |
* Change in Y coordinate to apply at the end of the animation. | |
* This value can either be an absolute number if toYType is | |
* ABSOLUTE, or a percentage (where 1.0 is 100%) otherwise. | |
*/ | |
public ArcTranslateAnimation(int fromXType, float fromXValue, int toXType, | |
float toXValue, int fromYType, float fromYValue, int toYType, | |
float toYValue) { | |
mFromXValue = fromXValue; | |
mToXValue = toXValue; | |
mFromYValue = fromYValue; | |
mToYValue = toYValue; | |
mFromXType = fromXType; | |
mToXType = toXType; | |
mFromYType = fromYType; | |
mToYType = toYType; | |
} | |
@Override | |
protected void applyTransformation(float interpolatedTime, Transformation t) { | |
float dx = calcBezier(interpolatedTime, mStart.x, mControl.x, mEnd.x); | |
float dy = calcBezier(interpolatedTime, mStart.y, mControl.y, mEnd.y); | |
t.getMatrix().setTranslate(dx, dy); | |
} | |
@Override | |
public void initialize(int width, int height, int parentWidth, | |
int parentHeight) { | |
super.initialize(width, height, parentWidth, parentHeight); | |
mFromXDelta = resolveSize(mFromXType, mFromXValue, width, parentWidth); | |
mToXDelta = resolveSize(mToXType, mToXValue, width, parentWidth); | |
mFromYDelta = resolveSize(mFromYType, mFromYValue, height, parentHeight); | |
mToYDelta = resolveSize(mToYType, mToYValue, height, parentHeight); | |
mStart = new PointF(mFromXDelta, mFromYDelta); | |
mEnd = new PointF(mToXDelta, mToYDelta); | |
mControl = new PointF(mFromXDelta, mToYDelta); // How to choose the | |
// Control point(we can | |
// use the cross of the | |
// two tangents from p0, | |
// p1) | |
} | |
/** | |
* Calculate the position on a quadratic bezier curve by given three points | |
* and the percentage of time passed. | |
* | |
* from http://en.wikipedia.org/wiki/B%C3%A9zier_curve | |
* | |
* @param interpolatedTime | |
* the fraction of the duration that has passed where 0 <= time | |
* <= 1 | |
* @param p0 | |
* a single dimension of the starting point | |
* @param p1 | |
* a single dimension of the control point | |
* @param p2 | |
* a single dimension of the ending point | |
*/ | |
private long calcBezier(float interpolatedTime, float p0, float p1, float p2) { | |
return Math.round((Math.pow((1 - interpolatedTime), 2) * p0) | |
+ (2 * (1 - interpolatedTime) * interpolatedTime * p1) | |
+ (Math.pow(interpolatedTime, 2) * p2)); | |
} | |
} |
Could you please show me more details, such as view type and device information under your test.
I have successfully run the demo(https://github.com/guohai/and-ui-bezier-demo) app on HTC D816(Android 4.4.2).
Or you can directly download the apk by https://drive.google.com/file/d/0Byif_EC71S3XNUV2RllJcFNnM00/view?usp=sharing
Thankyou so much! I got it to work, I had misread the description of parameters. I was just supposed to use it like a simple TranslateAnimation
:
ArcTranslateAnimation anim = new ArcTranslateAnimation(0, deltaX , 0, deltaY);
anim.setDuration(500);
anim.setFillAfter(true);
view.startAnimation(anim);
ArcTranslateAnimation is working.
But you have to be requested.
because I do not speak English well.. so I will show you an image.
http://postfiles9.naver.net/20150507_200/luna000_1430941321114R55Ey_JPEG/arc_translate.jpg?type=w2
Could you please fix it
HI. Can this class be used to move a view in a circular path or a circular arc of a circle.?
I am not getting it how to use it for the above use case.
How do I use this? Can you please provide an example? Right now, I'm trying this but nothing happens: