Анимация видимости вида из видимого с анимацией
У меня есть представление, которое 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>