Android не оживляет альфа, если он изначально нулевым
Я пытаюсь анимировать alpha
представления Android (две анимации, как исчезают, так и исчезают). Все работает отлично, если по умолчанию альфа-версия 1 по умолчанию. Тем не менее, я хочу, чтобы это представление было прозрачным изначально, поэтому я установил альфа для нуля:
indicatorContainer.setAlpha(0);
Теперь анимация не будет работать. Это никогда не станет видимым. Если я прокомментирую эту строку, представление сначала отображается (чего я не хочу), но мои анимации отлично работают, когда я их вызываю. Я, хотя это что-то тривиальное, но, видимо, это не так. Что я делаю не так?
UPDATE: я также пробовал с плавающей точкой 0f
вместо целого числа 0
после чтения некоторых изменений API с setAlpha
метода setAlpha
, считая, что мой вызов может вызвать неправильную перегрузку, но ничего не изменилось.
Ответы
Ответ 1
Попробуйте что-то вроде этого:
mRelativeLayout.setAlpha(0f);
mRelativeLayout.animate().alpha(1f).setDuration(500).setListener(new AnimatorListenerAdapter() {
@Override
public void onAnimationEnd(Animator animation) {
super.onAnimationEnd(animation);
mRelativeLayout.setVisibility(View.VISIBLE);
//OR
mRelativeLayout.setAlpha(1f);
}
});
Ответ 2
Я столкнулся с той же проблемой, где indicatorContainer
- ImageButton
. Ниже код исправляет эту очень, очень неприятную проблему...
// XXX: Does not work if just 0. It calls 'ImageView#setAlpha(int)' deprecated method.
indicatorContainer.setAlpha(0.0f);
ViewCompat.animate(indicatorContainer).alpha(1);
Ответ 3
Можно попробовать следующее: более простой способ:
. View.animate() альфа (1).setDuration(ANIMATION_DURATION);
Ответ 4
Это может быть неуместно для OP, но я думал, что поделюсь им, несмотря на то, что это может помочь кому-то в будущем.
Имейте в виду, что если вы являетесь начальной анимацией, объединяете animate().alpha(0.0f)
с манипуляцией трансляцией View Y или X (например, animate().translationYBy(500)
вам нужно сбросить это свойство до замирания назад (используя animate().alpha(1.0f)
.
Я наткнулся на это сообщение SO, думая, что установка альфа-назад в 1.0f
терпит неудачу, когда на самом деле он все еще работает так, как должен, но анимация происходила за пределами экрана, потому что я не сбросил свой перевод Y-Axis (Гомер Симпсон * дох * момент).
Удобно, чтобы легко решить эту проблему, вы можете добавить AnimatorEndListener
в свою анимацию, когда она закончится (как упоминалось выше @Nikhil Verma), где вы можете добавить одну строку кода для сброса перевода оси X/Y.
В сценарии, с которым я столкнулся, мне хотелось, чтобы анимация плавала вниз и постепенно исчезала, поэтому отрегулировала ось Y & alpha соответственно. После того, как он всплыл и исчез, я установил Listener для сброса перевода оси Y так:
loadingMask.animate().translationYBy(500); //starts animation by moving it down the screen
loadingMask.animate().alpha(0.0f) //fades out
.setDuration(1500) //over 1.5s
.setListener(new AnimatorEndListener() { //when animation completes
@Override
public void onAnimationEnd(Animator animation) {
loadingMask.setTranslationY(0); //reset the y axis translation
}
});
Теперь, когда я хочу, чтобы анимация повторялась снова, я могу установить альфа моего представления в 1.0f
и он работает по назначению.
Ответ 5
Вот как я смог решить эту проблему - не особенно элегантный, но управляемый:
-
Установите представление на начальную альфу, которую вы хотите 0.0f или иначе.
-
Когда событие происходит там, где вам нужно, чтобы представление имело больше (или меньше) видимости/альфа - например, прямо перед началом анимации - в этот момент вы можете обновить альфу, а затем запустить анимацию в представлении
При повторении анимации я все еще чувствую неловкость, но этот подход может работать для сценариев, где анимация не повторяется