web-dev-qa-db-ja.com

アニメーションを使用してビューの可視性をアニメーション化

デフォルトでinvisibleであるビューを持っています(初めてです)。

次に、このVISIBLEで可視性をanimationに切り替える必要があります。

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

(SnackBarのデフォルトアニメーションのように)

しかし、これは機能していません。デフォルトのアニメーションで表示されます

これを達成できる簡単な方法はありますか?

このように、私は却下するために私の見解をアニメーション化しています:

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

XMLアニメーションを使用してこれを行うことができます。

XMLsetを使用して_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);
}
_

これが役立つことを願っています〜

29
Ferdous Ahamed

ConstraintLayoutを使用してアニメーションを追加する

可視性が更新されるビューの上に以下のコードを追加するだけです

TransitionManager.beginDelayedTransition(constraintLayout)

注意:

  • ConstraintLayoutは、直接の子でのみアニメーションを実行します。これは、処理する子のレイアウトパラメーターと制約をいつ変更するかだけを知っているからです。
  • ConstraintLayoutは、レイアウト関連の変更のみをアニメーション化します。

詳細については、この投稿を参照してください https://robinhood.engineering/beautiful-animations-using-Android-constraintlayout-eee5b72ecae

8
Rissmon Suresh

これが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そして、目的のビューをパラメーターとしてメソッドに与えます。

2
parsa dadras

this answerに基づく:

このメソッドでは、ビューのvisibilityVISIBLEアニメーション(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);
}
1
DastakWall

レイアウトに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>
1
Mayur Patel