Реверс анимации - PullRequest
       4

Реверс анимации

45 голосов
/ 08 ноября 2010

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

Есть ли способ инвертировать анимацию в Android без перекодирования и изменения параметров?

Ответы [ 8 ]

74 голосов
/ 10 марта 2011

Нет, к сожалению, вы не можете сделать это с объектом Анимация. Но вы можете смоделировать его, используя интерполятор, который будет инвертировать анимацию:

package com.example.android;

import android.view.animation.Interpolator;

public class ReverseInterpolator implements Interpolator {
    @Override
    public float getInterpolation(float paramFloat) {
        return Math.abs(paramFloat -1f);
    }
}

Затем на анимации вы можете установить новый интерполятор:

myAnimation.setInterpolator(new ReverseInterpolator());
25 голосов
/ 19 декабря 2012

Если вы используете Object или ValueAnimator для анимации представления, вы можете просто сделать

ValueAnimator myAnimator = new ValueAnimator();  
myAnimator.reverse()

Документацию можно найти здесь .

13 голосов
/ 11 февраля 2015

Основываясь на идее pcans , вы можете инвертировать любой интерполятор, а не только линейный.

class ReverseInterpolator implements Interpolator{
    private final Interpolator delegate;

    public ReverseInterpolator(Interpolator delegate){
        this.delegate = delegate;
    }

    public ReverseInterpolator(){
        this(new LinearInterpolator());
    }

    @Override
    public float getInterpolation(float input) {
        return 1 - delegate.getInterpolation(input);
    }
}

Использование

ReverseInterpolator reverseInterpolator = new ReverseInterpolator(new AccelerateInterpolator())
myAnimation.setInterpolator(reverseInterpolator);
6 голосов
/ 28 сентября 2012

У меня похожий подход к pcans но немного отличается.Он принимает Interpolator и будет эффективно передавать значения, которые будут такими же, как при использовании переданного в Interpolator в обычном режиме, а затем в режиме REVERSE.Избавляет вас от необходимости думать о ошибочных реализациях Animation.REVERSE на Android.Смотрите код здесь

public class ReverseInterpolator implements Interpolator {

    private final Interpolator mInterpolator;

    public ReverseInterpolator(Interpolator interpolator){
        mInterpolator = interpolator;
    }

    @Override
    public float getInterpolation(float input) {
        return mInterpolator.getInterpolation(reverseInput(input));
    }

    /**
     * Map value so 0-0.5 = 0-1 and 0.5-1 = 1-0
     */
    private float reverseInput(float input){        
        if(input <= 0.5)
            return input*2;
        else
            return Math.abs(input-1)*2;        
    }
}
1 голос
/ 24 марта 2013

Вы можете заставить код запоминать исходную позицию и конечную позицию. И пусть ваш код динамически получает эти значения при запуске анимации.

0 голосов
/ 22 марта 2019

Самое простое решение, которое я придумал

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android" android:interpolator="@android:anim/linear_interpolator">
    <alpha
        android:duration="2000"
        android:fromAlpha="0.1"
        android:repeatCount="infinite"
        android:repeatMode="reverse"
        android:toAlpha="1.0">
    </alpha>
</set>
0 голосов
/ 07 сентября 2018

это сработало для меня

 ObjectAnimator anim = ObjectAnimator.ofFloat(imageViewUpb, "rotation", rotationAngle, rotationAngle + 180);

            if (linearLayoutb.getVisibility()==GONE){

                linearLayoutb.setVisibility(VISIBLE);
                anim.setDuration(500);
                anim.start();
                rotationAngle += 180;
                rotationAngle = rotationAngle%360;
        imageViewUpb.animate().rotation(rotationAngle).setDuration(500).start();

            }else{

                linearLayoutb.setVisibility(GONE);
                anim.setDuration(500);
                anim.start();
                rotationAngle += 180;
                rotationAngle = rotationAngle%180;
imageViewUpDownb.animate().rotation(rotationAngle).setDuration(500).start();

            }

linearlayoutb - это представление, которое расширяется, когда imageviewUpb направлен вверх

make int rotationAngle = 0; global parameter

0 голосов
/ 29 декабря 2017

Если вы используете анимацию из xml, то простой способ - сделать точно такую ​​же обратную анимацию к оригинальной анимации.Добавьте Animation.AnimationListener к исходной анимации и в методе onAnimationEnd запустите обратную анимацию.

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