Как обновить X и Y View после перевода анимации без мерцания (Android) - PullRequest
0 голосов
/ 26 июня 2019

Я пытаюсь переместить вид в макете и воспроизводить анимацию, не мигая. До сих пор мне удавалось воспроизводить анимацию, которую можно рисовать, и воспроизводить другую анимацию с переводом для перемещения представления, но оно мерцает. Код, который я использую для перевода:

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
    android:interpolator="@android:anim/linear_interpolator"
    android:fillEnabled="true"
    android:fillAfter="true">

    <!--Move-->
    <translate
    android:duration="400"
    android:fromXDelta="0%"
    android:fromYDelta="0%"
    android:toXDelta="-100%"
    android:toYDelta="0%"/>

</set>

Это для левого движения, остальные 3 направления имеют ту же логику.
Другие анимации, которые я использую для фона этого вида, когда он движется, не имеют значения, и с ними нет проблем.
Теперь к тому, что я использую для перемещения вида:

private void moveView(final View view, final int coordX, final int coordY, final int direction){
        runOnUiThread(new Runnable() {
            @Override
            public void run() {
                Animation animMove;

                switch(direction){
                    case 1: // top
                        animMove = AnimationUtils.loadAnimation(getApplicationContext(), R.anim.move_top);
                        break;
                    case 2: // right
                        animMove = AnimationUtils.loadAnimation(getApplicationContext(), R.anim.move_right);
                        break;
                    case 3: // bottom
                        animMove = AnimationUtils.loadAnimation(getApplicationContext(), R.anim.move_bottom);
                        break;
                    default: // left = 4
                        animMove = AnimationUtils.loadAnimation(getApplicationContext(), R.anim.move_left);
                        break;
                }

                AnimationListener listener = new AnimationListener() {
                    @Override
                    public void onAnimationStart(Animation animation) { }
                    @Override
                    public void onAnimationEnd(Animation animation) {
                        view.clearAnimation();
                        view.setX(coordX*side);
                        view.setY(coordY*side);
                    }
                    @Override
                    public void onAnimationRepeat(Animation animation) { }
                };

                animMove.setAnimationListener(listener);
                view.startAnimation(animMove);
            }
        });
    }

Дело в том, что я хочу переместить это представление несколько раз (количество ходов не фиксировано). И каждый раз, когда я перемещаю вид, он мерцает. Не имеет значения, является ли android: fillAfter истинным или ложным - он либо мигает назад или вперед, прежде чем перейти к тому месту, где он находился (координаты), в зависимости от того, истинно оно или ложно.
Это может быть из-за того, что я использую 2 анимации - 1 на фоне вида и 2 для движения, и он очищает их обоих. Я понятия не имею, как это исправить. Это разрушает пользовательский опыт, который я себе представлял.
Должен ли я поместить другое представление в представление для удержания фоновой анимации, чтобы оно не останавливало фоновую анимацию при попытке очистить анимацию движения (будет ли даже работать IDK) или есть более разумное решение?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...