Ответ 1
Попробуй это
AlphaAnimation animation1 = new AlphaAnimation(0.2f, 1.0f);
animation1.setDuration(1000);
animation1.setStartOffset(5000);
animation1.setFillAfter(true);
iv.startAnimation(animation1);
У меня есть анимация:
<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
умножается на альфа из анимации...
Попробуй это
AlphaAnimation animation1 = new AlphaAnimation(0.2f, 1.0f);
animation1.setDuration(1000);
animation1.setStartOffset(5000);
animation1.setFillAfter(true);
iv.startAnimation(animation1);
Может быть, немного поздно, но нашел прекрасное решение в документации для 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);
}
});
Установка альфа- 1
до начала анимации работала для меня:
AlphaAnimation animation1 = new AlphaAnimation(0.2f, 1.0f);
animation1.setDuration(500);
iv.setAlpha(1f);
iv.startAnimation(animation1);
По крайней мере, на моих тестах нет мерцания из-за настройки альфа до начала анимации. Он просто отлично работает.
Kotlin Version
Просто используйте ViewPropertyAnimator
следующим образом:
iv.alpha = 0.2f
iv.animate().apply {
interpolator = LinearInterpolator()
duration = 500
alpha(1f)
startDelay = 1000
start()
}
" 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);
<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.
Хм...
Дело в том, что это неправильно, и, возможно, в правильной работе анимаций в 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 в методах setFillAfter\setFillBefore.