使用动画将视图的可见性从消失变为可见
Animate visibility of a view from gone to visible with animation
我的视图默认为 invisible
(第一次)。
现在我需要使用 animation
:
将可见性切换到 VISIBLE
if (myView.getVisibility() == View.INVISIBLE) {
myView.setVisibility(View.VISIBLE);
myView.animate().translationY(0);
}
(喜欢SnackBar默认动画)
但这不起作用。它将通过默认动画变为可见
有什么简单的方法可以做到这一点吗?
备注
我正在动画化我的视图以消除,如下所示:
myView.animate().translationY(myView.getHeight());
您可以使用 XML
动画来做到这一点。
使用 set
和 alpha
创建一个 slide-up
动画 XML
并将此 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);
}
希望对你有所帮助~
基于答案:
使用此方法,我可以将视图的 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);
}
使用ConstraintLayout添加动画
只需在可见性已更新的视图上方添加以下代码:
TransitionManager.beginDelayedTransition(constraintLayout)
Note:
- ConstraintLayout will only perform animation on its direct children since it only knows when you change layout parameters and constraints on the children that it handles.
- ConstraintLayout only animates layout related changes.
有关更多信息,请参阅此 post https://robinhood.engineering/beautiful-animations-using-android-constraintlayout-eee5b72ecae3
这是 动画 视图 可见性 的最佳方式:
private void viewGoneAnimator(final View view) {
view.animate()
.alpha(0f)
.setDuration(500)
.setListener(new AnimatorListenerAdapter() {
@Override
public void onAnimationEnd(Animator animation) {
view.setVisibility(View.GONE);
}
});
}
private void viewVisibleAnimator(final View view) {
view.animate()
.alpha(1f)
.setDuration(500)
.setListener(new AnimatorListenerAdapter() {
@Override
public void onAnimationEnd(Animator animation) {
view.setVisibility(View.VISIBLE);
}
});
}
然后在任何你想创建视图 visible 或 gone 的地方调用此方法,并将预期的视图作为参数提供给方法.
只是您需要将 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>
我的视图默认为 invisible
(第一次)。
现在我需要使用 animation
:
VISIBLE
if (myView.getVisibility() == View.INVISIBLE) {
myView.setVisibility(View.VISIBLE);
myView.animate().translationY(0);
}
(喜欢SnackBar默认动画)
但这不起作用。它将通过默认动画变为可见
有什么简单的方法可以做到这一点吗?
备注
我正在动画化我的视图以消除,如下所示:
myView.animate().translationY(myView.getHeight());
您可以使用 XML
动画来做到这一点。
使用 set
和 alpha
创建一个 slide-up
动画 XML
并将此 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);
}
希望对你有所帮助~
基于
使用此方法,我可以将视图的 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);
}
使用ConstraintLayout添加动画
只需在可见性已更新的视图上方添加以下代码:
TransitionManager.beginDelayedTransition(constraintLayout)
Note:
- ConstraintLayout will only perform animation on its direct children since it only knows when you change layout parameters and constraints on the children that it handles.
- ConstraintLayout only animates layout related changes.
有关更多信息,请参阅此 post https://robinhood.engineering/beautiful-animations-using-android-constraintlayout-eee5b72ecae3
这是 动画 视图 可见性 的最佳方式:
private void viewGoneAnimator(final View view) {
view.animate()
.alpha(0f)
.setDuration(500)
.setListener(new AnimatorListenerAdapter() {
@Override
public void onAnimationEnd(Animator animation) {
view.setVisibility(View.GONE);
}
});
}
private void viewVisibleAnimator(final View view) {
view.animate()
.alpha(1f)
.setDuration(500)
.setListener(new AnimatorListenerAdapter() {
@Override
public void onAnimationEnd(Animator animation) {
view.setVisibility(View.VISIBLE);
}
});
}
然后在任何你想创建视图 visible 或 gone 的地方调用此方法,并将预期的视图作为参数提供给方法.
只是您需要将 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>