Как перевести анимацию на изображение по диагонали?

Я хочу анимировать изображение по диагонали, как показано ниже. Я попытался перевести анимацию, но я могу сделать это только параллельно оси X или параллельной оси Y.

но не мог понять, как это сделать по диагонали. И я также не уверен, что это можно сделать с помощью анимации перевода или какой-либо другой анимации. Поэтому, пожалуйста, предложите мне, как я могу это сделать, или если кто-нибудь может дать мне полезную ссылку, тогда я также буду obiliged.

enter image description here

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);
    }
}

наслаждайтесь !