ObjectAnimator на пути не работает на Зефир?

ObjectAnimator.ofFloat(Object target, String xPropertyName, String yPropertyName, Path path) Кажется, работает в API 21, но не 23? Простое воспроизведение: вот упражнение и макет. Попробуйте долгое нажатие на текстовое представление, оба уровня будут работать. Но просто нажмите на вид: 21 работает, но не 23.

public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        final View hello = findViewById(R.id.hello);
        final Path p = new Path();
        p.addCircle(-200, 0, 100, Path.Direction.CW);
        hello.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                ObjectAnimator a = ObjectAnimator.ofFloat(hello, "translationX", "translationY", p);
                a.setDuration(1000);
                a.start();
            }
        });
        hello.setOnLongClickListener(new View.OnLongClickListener() {
            @Override
            public boolean onLongClick(View v) {
                ObjectAnimator a = ObjectAnimator.ofFloat(hello, "scaleX", 2);
                a.setDuration(1000);
                a.start();
                return true;
            }
        });
    }
}

-

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/activity_main"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="letstwinkle.com.pathtest.MainActivity">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Hello World!"
        android:layout_alignParentTop="true"
        android:layout_alignParentEnd="true"
        android:layout_marginEnd="63dp"
        android:layout_marginTop="210dp"
        android:id="@+id/hello"
        android:background="#880033"/>
</RelativeLayout>

Это может быть тем же, что и эта ошибка, о которой сообщалось в июне. https://code.google.com/p/android/issues/detail?id=212776

1 ответ

Решение

В качестве обходного пути вы можете использовать ValueAnimator с обычаем AnimatorUpdateListener,

Сначала тебе нужен PathMeasure для тебя Path, Это даст вам доступ к данным, таким как длина пути и координаты на пути для определенного расстояния (0 <= расстояние <= длина пути).

Path p = new Path();
p.addCircle(-200, 0, 100, Path.Direction.CW);
PathMeasure pathMeasure = new PathMeasure(p, true);

Затем вы устанавливаете ValueAnimator анимировать от 0 до длины пути.

final ValueAnimator a = ValueAnimator.ofFloat(0,pathMeasure.getLength());
a.setDuration(1000);

Далее вы добавляете AnimatorUpdateListener на самом деле манипулировать View, Сначала я покажу, как его добавить:

MyAnimatorUpdateListener myListener = new MyAnimatorUpdateListener(hello, pathMeasure);
a.addUpdateListener(myListener);

Продолжайте с OnClickListener:

hello.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        a.start();
    }
});

Обратите внимание, что я изменил код и объявил / инициализировал ValueAnimator за пределами OnClickListener чтобы получить лучшую производительность: таким образом, он не будет создаваться заново каждый раз, когда я нажимаю TextView и поэтому сборщик мусора будет менее занят:).

Наконец, AnimatorUpdateListener код:

class MyAnimatorUpdateListener implements ValueAnimator.AnimatorUpdateListener
{
    private View view;
    private PathMeasure pathMeasure;
    private float[] coordinates = new float[2];

    public MyAnimatorUpdateListener(View view, PathMeasure pathMeasure)
    {
        this.view = view;
        this.pathMeasure = pathMeasure;
    }

    @Override
    public void onAnimationUpdate(ValueAnimator animation) {
        float distance = (float) animation.getAnimatedValue();
        pathMeasure.getPosTan(distance, coordinates, null);
        view.setTranslationX(coordinates[0]);
        view.setTranslationY(coordinates[1]);
    }
}
Другие вопросы по тегам