Как перевести анимацию на изображение по диагонали?
Я хочу анимировать изображение по диагонали, как показано ниже. Я попытался перевести анимацию, но я могу сделать это только параллельно оси X или параллельной оси Y.
но не мог понять, как это сделать по диагонали. И я также не уверен, что это можно сделать с помощью анимации перевода или какой-либо другой анимации. Поэтому, пожалуйста, предложите мне, как я могу это сделать, или если кто-нибудь может дать мне полезную ссылку, тогда я также буду obiliged.
2 ответов
один из способов-это использовать AnimatorSet
играть больше ObjectAnimator
вместе.
private void animateDiagonalPan(View v) {
AnimatorSet animSetXY = new AnimatorSet();
ObjectAnimator y = ObjectAnimator.ofFloat(v,
"translationY",v.getY(), targetY);
ObjectAnimator x = ObjectAnimator.ofFloat(v,
"translationX", v.getX(), targetX);
animSetXY.playTogether(x, y);
animSetXY.setInterpolator(new LinearInterpolator(1f));
animSetXY.setDuration(300);
animSetXY.start();
}
или вы можете использовать пользовательский View
с пользовательским Property
, но в этом случае вам нужно будет вычислить перевод на X и Y самостоятельно:
final Property<YourView, Float> transProperty = new Property<YourView, Float>(
float.class, "translation") {
@Override
public Float get(YourView) {
return object.getTranslation();
}
@Override
public void set(YourView, Float value) {
object.translate(value);
}
};
private void translate(float value){
setTranslationX(value);
setTranslationY(value);
}
и использовать его, чтобы оживить:
private void animateDiagonalPan(View v) {
ObjectAnimator xy = ObjectAnimator.ofFloat(v,
transProperty, targetValue);
xy.setInterpolator(new LinearInterpolator(1f));
xy.setDuration(300);
xy.start();
}
вы можете достичь этого только с одним ObjectAnimator.
ObjectAnimator centerChangeAnim = ObjectAnimator.ofObject(this, "centerpoint", new PointEvaluator(), fromPoint, toPoint);
centerChangeAnim.start()
и в том же классе добавьте функцию обратного вызова.
public void setCenterpoint(Point centerPoint) {
this.circleCenter = centerPoint;
}
и вот оценщик customtype, который объединяет X и Y.
public class PointEvaluator implements TypeEvaluator<Point> {
@Override
public Point evaluate(float t, Point startPoint, Point endPoint) {
int x = (int) (startPoint.x + t * (endPoint.x - startPoint.x));
int y = (int) (startPoint.y + t * (endPoint.y - startPoint.y));
return new Point(x,y);
}
}
наслаждайтесь !