デフォルトでinvisible
であるビューを持っています(初めてです)。
次に、このVISIBLE
で可視性をanimation
に切り替える必要があります。
if (myView.getVisibility() == View.INVISIBLE) {
myView.setVisibility(View.VISIBLE);
myView.animate().translationY(0);
}
(SnackBarのデフォルトアニメーションのように)
しかし、これは機能していません。デフォルトのアニメーションで表示されます
これを達成できる簡単な方法はありますか?
注
このように、私は却下するために私の見解をアニメーション化しています:
myView.animate().translationY(myView.getHeight());
XML
アニメーションを使用してこれを行うことができます。
XML
とset
を使用して_slide-up
_アニメーション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>
_
SE:
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);
}
_
これが役立つことを願っています〜
ConstraintLayoutを使用してアニメーションを追加する
可視性が更新されるビューの上に以下のコードを追加するだけです:
TransitionManager.beginDelayedTransition(constraintLayout)
注意:
- ConstraintLayoutは、直接の子でのみアニメーションを実行します。これは、処理する子のレイアウトパラメーターと制約をいつ変更するかだけを知っているからです。
- ConstraintLayoutは、レイアウト関連の変更のみをアニメーション化します。
詳細については、この投稿を参照してください https://robinhood.engineering/beautiful-animations-using-Android-constraintlayout-eee5b72ecae
これがanimate views visibilityへの最良の方法です:
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);
}
});
}
そして、ビューを作成したいところならどこでもこのメソッドを呼び出してくださいvisibleまたはgoneそして、目的のビューをパラメーターとしてメソッドに与えます。
this answerに基づく:
このメソッドでは、ビューの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);
}
レイアウトに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>