Анимация видимости вида из видимого с анимацией

У меня есть представление, которое invisible по умолчанию (только в первый раз).

Теперь мне нужно переключить видимость на VISIBLE с помощью этой animation:

if (myView.getVisibility() == View.INVISIBLE) {
    myView.setVisibility(View.VISIBLE);
    myView.animate().translationY(0);
 }

(Как и анимация по умолчанию SnackBar)

Но это не работает. Он станет видимым с анимацией по умолчанию

Есть ли какой-нибудь простой способ добиться этого?

Заметка

Я оживляю свое мнение об увольнении, например:

myView.animate().translationY(myView.getHeight());

Ответы

Ответ 1

Вы можете сделать это с помощью XML анимации.

Создание slide-up анимации XML с использованием set и alpha и поместить этот XML в свой ресурс anim папку.

slide_up.xml

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android" >

    <translate
        android:duration="500"
        android:fromYDelta="100%"
        android:toYDelta="0" />
</set>

ОБЛАСТЬ ПРИМЕНЕНИЯ:

Используйте AnimationUtils.loadAnimation() для загрузки анимации из XML и установки и запуска анимации с использованием .startAnimation().

Вот пример:

ImageView imageView = (ImageView) findViewById(R.id.imageView);

// slide-up animation
Animation slideUp = AnimationUtils.loadAnimation(this, R.anim.slide_up);

if (imageView.getVisibility() == View.INVISIBLE) {
    imageView.setVisibility(View.VISIBLE);
    imageView.startAnimation(slideUp);
}

Надеюсь, это поможет ~

Ответ 2

Добавить анимацию, используя ConstraintLayout

Просто добавьте код ниже над представлениями, видимость которых обновлена:

TransitionManager.beginDelayedTransition(constraintLayout)

Замечания:

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

Для получения дополнительной информации см. Этот пост https://robinhood.engineering/beautiful-animations-using-android-constraintlayout-eee5b72ecae3

Ответ 3

Это лучший способ оживить видимость просмотров:

private void viewGoneAnimator(View view) {

    view.animate()
            .alpha(0f)
            .setDuration(animationDuration)
            .setListener(new AnimatorListenerAdapter() {
                @Override
                public void onAnimationEnd(Animator animation) {
                    view.setVisibility(View.GONE);
                }
            });

}

private void viewVisibleAnimator(View view) {

    view.animate()
            .alpha(1f)
            .setDuration(animationDuration)
            .setListener(new AnimatorListenerAdapter() {
                @Override
                public void onAnimationEnd(Animator animation) {
                    view.setVisibility(VISIBLE);
                }
            });

}

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

Ответ 4

На основании этого ответа:

с этим методам, я могу установить visibility моего зрения на VISIBLE с slideUp анимации (как snackbar анимации):

int getScreenHeight() {
    DisplayMetrics displaymetrics = new DisplayMetrics();
    activity.getWindowManager().getDefaultDisplay().getMetrics(displaymetrics);
    return displaymetrics.heightPixels;
}

public void animateOnScreen(View view) {
    final int screenHeight = getScreenHeight();
    ObjectAnimator animator = ObjectAnimator.ofFloat(view, "y", screenHeight, (screenHeight * 0.8F));
    animator.setInterpolator(new DecelerateInterpolator());
    animator.start();
}

Тогда я могу использовать это так:

if (myView.getVisibility() == View.INVISIBLE) {
    myView.setVisibility(View.VISIBLE);
    animateOnScreen(myView);
}

Ответ 5

Просто нужно добавить android:animateLayoutChanges="true" в свой макет. Когда я установил видимость в linear_container, linear_bottom будет анимироваться снизу вверх и заменять на "linear_container".

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:animateLayoutChanges="true"
        android:orientation="vertical"
        android:layout_height="match_parent">
       <android.support.design.widget.AppBarLayout
            android:id="@+id/layoutTop"
            android:layout_width="match_parent"
            android:layout_height="wrap_content">
        </android.support.design.widget.AppBarLayout>

       <LinearLayout
            android:id="@+id/linear_container"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
       </LinearLayout>
       <LinearLayout
            android:id="@+id/linear_bottom"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
       </LinearLayout>
</LinearLayout>