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

Вот как я смог решить эту проблему - не особенно элегантный, но управляемый:

  1. Установите представление на начальную альфу, которую вы хотите 0.0f или иначе.

  2. Когда событие происходит там, где вам нужно, чтобы представление имело больше (или меньше) видимости/альфа - например, прямо перед началом анимации - в этот момент вы можете обновить альфу, а затем запустить анимацию в представлении

При повторении анимации я все еще чувствую неловкость, но этот подход может работать для сценариев, где анимация не повторяется