Как сделать плавную анимацию кадров в андроиде?

Я сделал анимацию кадра. Но переход между изображениями выглядит плохо. Как я могу применить к нему эффект перекрестного затухания?

При использовании TransitionDrawable я получаю правильный результат, но он останавливается после одного выполнения.

У кого-нибудь есть идея, как это решить?

public void startAnimation() {
    if (logoAnimation != null) {
        if (logoAnimation.isRunning()) {
            logoAnimation.stop();
        }
        logoAnimation.start();
    }
}

private int setLogoAnimation(int animationID, int targetID) {
    imageView = (ImageView) window.findViewById(targetID);
    imageView.setImageResource(animationID);
    logoAnimation = (AnimationDrawable) imageView.getDrawable();

    if (imageView != null && logoAnimation != null) {
        return 1;
    } else {
        return 0;
    }
}

Затем я просто запускаю его с помощью object.startAnimation(); У меня работает, но анимация некрасивая и мне нужно, чтобы она была плавной.


person Olek    schedule 04.05.2011    source источник


Ответы (2)


Если вы хотите плавно переходить между двумя изображениями, почему бы не использовать AlphaAnimation, который изменит прозрачность двух изображений и создаст нужный вам эффект.

Создайте две анимации:

res/anim/fadeout.xml

<?xml version="1.0" encoding="utf-8"?>
<alpha xmlns:android="http://schemas.android.com/apk/res/android"
    android:interpolator="@android:anim/accelerate_interpolator"
    android:fromAlpha="1.0" android:toAlpha="0.0"
    android:duration="@android:integer/config_mediumAnimTime" />

рез/аним/fadein.xml

<?xml version="1.0" encoding="utf-8"?>
<alpha xmlns:android="http://schemas.android.com/apk/res/android"
    android:interpolator="@android:anim/accelerate_interpolator"
    android:fromAlpha="0.0" android:toAlpha="1.0"
    android:duration="@android:integer/config_mediumAnimTime" />

а затем переопределить переход по умолчанию между действиями:

startActivity( new Intent( this, SecondActivity.class ) );
overridePendingTransition( R.anim.fadeout, R.anim.fadein );

или вы можете применить анимацию к определенным виджетам:

Animation animation = AnimationUtils.loadAnimation( this, R.anim.fadeout );
image1.startAnimation( animation );

В настоящее время я нахожусь в середине серии статей об анимации в моем блоге, который может дать вам дополнительную информацию. .

person Mark Allison    schedule 04.05.2011
comment
Это не то. У меня есть основное действие с некоторыми кнопками. Я сделал собственный заголовок, где должна работать анимация. В этой строке заголовка есть ImageView, который должен анимироваться на протяжении всего процесса. Мне удалось анимировать его с помощью покадровой анимации. Теперь я хочу добавить эффект перекрестного затухания. Как мне этого добиться? - person Olek; 04.05.2011
comment
Посмотрите еще раз на мой ответ, я объясняю, как применять анимацию к определенным виджетам, а также к переходам между действиями. - person Mark Allison; 04.05.2011
comment
Я не уверен, знаю ли я, что именно вы имеете в виду. Я не хочу менять переход между действиями, потому что они в порядке. Я хочу изменить эффект перехода в анимации ImageView. Наличие «imageView.startAnimation(alphaAnimation)» не работает, когда установлена ​​анимация кадра. - person Olek; 04.05.2011
comment
Как я уже говорил три раза: вы можете применять анимацию к определенным виджетам (т. е. к двум экземплярам ImageView), вызывая startAnimation для этих виджетов. - person Mark Allison; 04.05.2011
comment
Хорошо, спасибо, теперь я все понял. Я столкнулся с другой проблемой, я пишу приложение для Android 1.6, и оно не переопределяет PendindTransition. Любая идея, как это решить? - person Olek; 04.05.2011
comment
Я все еще в мертвой точке. Анимация не работает как надо. Кто-нибудь может помочь? - person Olek; 09.05.2011

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

При использовании анимации движения вы можете использовать линейный интерполятор. Например, для вращения

<?xml version="1.0" encoding="UTF-8"?>  
<rotate  
    xmlns:android="http://schemas.android.com/apk/res/android"  
    android:fromDegrees="0"  
    android:toDegrees="359"  
    android:pivotX="50%"  
    android:pivotY="50%"  
    android:repeatCount="infinite"  
    android:duration="1000"  
    android:interpolator="@anim/linear_interpolator" />  

И вы интерполируете содержимое файла здесь

<?xml version="1.0" encoding="utf-8"?>
<linearInterpolator xmlns:android="http://schemas.android.com/apk/res/android" />

Это для ротации, вы можете увидеть полный список здесь.

http://developer.android.com/guide/topics/resources/animation-resource.html

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

http://yekmer.posterous.com/how-to-make-a-loading-animator-in-android

person Yekmer Simsek    schedule 04.05.2011
comment
дело в том что у меня всего две картинки и я хочу и эффект как в TranistionDrawable. Таким образом, элементы пересекаются друг с другом. - person Olek; 04.05.2011
comment
Вы можете использовать метод setOneShot(boolean oneShot) класса AnimationDrawable, чтобы получить непрерывную анимацию. - person Yekmer Simsek; 04.05.2011
comment
спасибо, но это не проблема. У меня есть ImageView, где я хочу анимировать 2 изображения. Эти две картинки должны плавно переходить друг в друга. - person Olek; 04.05.2011