SetAnimation + setVisibility не работает на Android 4?

Animation animation= AnimationUtils.loadAnimation(this, R.anim.bottom_in);
animation.setDuration(200);
buttonsBar.setAnimation(animation);
buttonsBar.setVisibility(View.VISIBLE);


R.anim.bottom_in:
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android" >
    <translate
            android:duration="300"
            android:fromYDelta="100%p"
            android:toYDelta="0%p" />
</set>



buttonsBar это RelativeLayout, изначально у него android:visibility=«gone»


В итоге в андроиде 2 версии бар показывается, на андроиде 4 версии — нет, но если тапнуть в то место, где он находится — бар покажется, как буд-то он не прорисовывается при анимации.


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


Подскажите, как быть?
  • Вопрос задан
  • 4687 просмотров
Пригласить эксперта
Ответы на вопрос 3
palmut
@palmut
Может стоит в animation установить Animation.AnimationListener и перенести buttonsBar.setVisibility(View.VISIBLE); в onAnimationEnd?
Ответ написан
VYakushev
@VYakushev
Разработчик Android в Nowtaxi
Судя по XML-файлу анимации вы изменяете размер по Y-оси со 100% до 0% по отношению к родителю buttonsBar. То есть в анимации вы buttonsBar скрываете, а в свойствах устанавливаете видимость. Вот он у вас вроде бы и видим, но скрыт анимацией.
Ответ написан
@alexblokh
СЕО ninja-copy.com; CTO lambda.direct
День добрый!

Попробуйте так:

buttonsBar.setVisibility(View.VISIBLE);
buttonsBar.startAnimation(this,AnimationUtils.loadAnimation(R.anim.bottom_in));

setAnimation - устанавливает анимацию для данного View. Лучше используйте для запуска анимации метод .startAnimation(Context context,Animation anim);
Если вам надо запустить бесконечную анимацию, а затем ее остановить, например для анимации загрузки, то:

if(needAnimate)
 view.startAnimation(context,AnimationUtils.loadAnimation(R.anim.download_animation));
else
 view.clearAnimation();

На будущее:
<rotate
        android:fillAfter="true"
        android:fromDegrees="0"
        android:interpolator="@android:anim/accelerate_decelerate_interpolator"
        android:pivotX="0.5"
        android:pivotY="0.5"
        android:toDegrees="180" />


100%p - означает, что анимация будет осуществляться относительно родителя, то есть ViewParent. Если хотите анимировать относительно данного View, то пишите 100%.

fillAfter - позволит по завершению анимации оставить View в конечном положении. В примере - поворот на 180 градусов.

interpolator - математическая функция, которая разбивает вашу анимацию на интервалы. На этих интервалах ваша анимация проходит с разной скоростью. decelerate_interpolator позволит вашему бару выезжать на экран более естественно, замедляя ход.

Пакет @android:anim - предоставляет базовый набор интерполяторов. Если не ошибаюсь, то по умолчанию к анимации применяется acelerete_decelerate интерполирование.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы