Android-анимация Alpha

У меня есть анимация:

<set xmlns:android="http://schemas.android.com/apk/res/android"  
   android:interpolator="@android:anim/linear_interpolator">  
   <alpha  
       android:fromAlpha="0.2"  
       android:toAlpha="1.0"  
       android:duration="500"/>  
</set>

и ImageView:

<ImageView
    android:id="@+id/listViewIcon"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:src="@drawable/settings" 
    android:alpha="0.2"/>  

и код:

final Animation anim = AnimationUtils.loadAnimation(this, R.anim.alpha);
final ImageView iv = (ImageView) findViewById(R.id.listViewIcon);
anim .setFillAfter(true);
iv.startAnimation(anim);

Итак, в начале у меня есть ImageView с альфа 0.2, а в конце я хочу иметь ImageView с альфа 1. Но это не работает так: когда анимация начинается, добавляется больше альфы, а анимация заканчивается альфа 0.2

Что мне нужно изменить, чтобы оживить мое изображение с 0.2 до 1?

Я проверил с различными настройками - я установил android:alpha="1.0", fromAlpa="1.0", toAlpha="0.2" он работает, как я ожидал - от альфа 1 до 0.2. Похоже, что альфа из ImageView умножается на альфа из анимации...

Ответ 1

Попробуй это

AlphaAnimation animation1 = new AlphaAnimation(0.2f, 1.0f);
animation1.setDuration(1000);
animation1.setStartOffset(5000);
animation1.setFillAfter(true);
iv.startAnimation(animation1);

Ответ 2

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

//In transition: (alpha from 0 to 0.5)
view.setAlpha(0f);
view.setVisibility(View.VISIBLE);
view.animate()
   .alpha(0.5f)
   .setDuration(400)
   .setListener(null);

//Out transition: (alpha from 0.5 to 0)
view.setAlpha(0.5f)
view.animate()
   .alpha(0f)
   .setDuration(400)
   .setListener(new AnimatorListenerAdapter() {
           @Override
           public void onAnimationEnd(Animator animation) {
           view.setVisibility(View.GONE);
         }
    });

Ответ 3

Установка альфа- 1 до начала анимации работала для меня:

AlphaAnimation animation1 = new AlphaAnimation(0.2f, 1.0f);
animation1.setDuration(500);
iv.setAlpha(1f);
iv.startAnimation(animation1);

По крайней мере, на моих тестах нет мерцания из-за настройки альфа до начала анимации. Он просто отлично работает.

Ответ 4

Kotlin Version

Просто используйте ViewPropertyAnimator следующим образом:

iv.alpha = 0.2f
iv.animate().apply {
    interpolator = LinearInterpolator()
    duration = 500
    alpha(1f)
    startDelay = 1000
    start()
}

Ответ 5

" setStartOffset " должен быть меньше, иначе анимация начинается с представления alpha 0.xf и ждет начала смещения перед анимацией до 1f. Надеюсь, что следующий код поможет.

AlphaAnimation animation1 = new AlphaAnimation(0.1f, 1f);

animation1.setDuration(1000);
animation1.setStartOffset(50);

animation1.setFillAfter(true);

view.setVisibility(View.VISIBLE);

view.startAnimation(animation1);

Ответ 6

<ImageView
    android:id="@+id/listViewIcon"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:src="@drawable/settings"/>  

Удалите android:alpha=0.2 из XML-> ImageView.

Ответ 7

Хм...

Дело в том, что это неправильно, и, возможно, в правильной работе анимаций в Android API.

Дело в том, что когда вы устанавливаете в своем коде альфа значение 0.2f основано на настройках в файле xml для android, это означает, что:

0.2f = 0.2f of 0.2f (20% from 100%) ie from 0.2f / 5 = 0.04f
1f = 0.2f

Таким образом, ваша анимация фактически работает от 0.04f до 0.2f

flag setFillAfter(true) безусловно, работает, но вам нужно понять, что в конце вашей анимации ImageView будет иметь значение альфа 0.2f вместо одного, потому что вы указываете 0.2f как минимально приемлемое значение в анимации (своего рода максимальный альфа канал).

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

Вы должны понимать, что ваши анимации напрямую зависят от двух вещей:

  • LayoutParams анимированного просмотра
  • Параметры анимации.

Параметры анимации управляют вашими LayoutParams в методах setFillAfter\setFillBefore.