366

可視性を変更するたびにレイアウトを上下にプッシュする でLinearLayout表示または非表示にしたい があります。Animation

いくつかのサンプルを見てきましたが、私のニーズに合うものはありませんでした。

アニメーション用に 2 つの xml ファイルを作成しましたが、LinearLayout.

4

19 に答える 19

707

Android 3.0 (Honeycomb) で導入された新しいアニメーション API を使用すると、このようなアニメーションを非常に簡単に作成できます。

距離だけ下にスライドするView:

view.animate().translationY(distance);

次のように、後でView元の位置に戻すことができます。

view.animate().translationY(0);

複数のアニメーションを簡単に組み合わせることもできます。次のアニメーションは、高さだけ下にスライドViewし、同時にフェード インします。

// Prepare the View for the animation
view.setVisibility(View.VISIBLE);
view.setAlpha(0.0f);

// Start the animation
view.animate()
    .translationY(view.getHeight())
    .alpha(1.0f)
    .setListener(null);

View次に、バックをフェードアウトして、スライドさせて元の位置に戻すことができます。また、アニメーションが終了したら背面AnimatorListenerの可視性を に設定できるように を設定します。ViewGONE

view.animate()
    .translationY(0)
    .alpha(0.0f)
    .setListener(new AnimatorListenerAdapter() {
        @Override
        public void onAnimationEnd(Animator animation) {
            super.onAnimationEnd(animation);
            view.setVisibility(View.GONE);
        }
    });
于 2013-11-04T10:44:40.163 に答える
12

の新しいサブクラスを作成しAnimation、オーバーライドして. 次のようなことを考えてみましょう:LinearLayoutLinearLayoutsetVisibility()Animations

public class SimpleViewAnimator extends LinearLayout
{
    private Animation inAnimation;
    private Animation outAnimation;

    public SimpleViewAnimator(Context context)
    {
        super(context);
    }

    public void setInAnimation(Animation inAnimation)
    {
        this.inAnimation = inAnimation;
    }

    public void setOutAnimation(Animation outAnimation)
    {
        this.outAnimation = outAnimation;
    }

    @Override
    public void setVisibility(int visibility)
    {
        if (getVisibility() != visibility)
        {
            if (visibility == VISIBLE)
            {
                if (inAnimation != null) startAnimation(inAnimation);
            }
            else if ((visibility == INVISIBLE) || (visibility == GONE))
            {
                if (outAnimation != null) startAnimation(outAnimation);
            }
        }

        super.setVisibility(visibility);
    }
}
于 2013-11-04T10:50:26.563 に答える
9
if (filter_section.getVisibility() == View.GONE) {
    filter_section.animate()
            .translationY(filter_section.getHeight()).alpha(1.0f)
            .setListener(new AnimatorListenerAdapter() {
                @Override
                public void onAnimationStart(Animator animation) {
                    super.onAnimationStart(animation);
                    filter_section.setVisibility(View.VISIBLE);
                    filter_section.setAlpha(0.0f);
                }
            });
} else {
    filter_section.animate()
            .translationY(0).alpha(0.0f)
            .setListener(new AnimatorListenerAdapter() {
                @Override
                public void onAnimationEnd(Animator animation) {
                    super.onAnimationEnd(animation);
                    filter_section.setVisibility(View.GONE);
                }
            });
}
于 2015-04-01T06:10:42.973 に答える
6

Androidアプリで次のコードを使用して、ビューまたはレイアウトを上下にスライドできます

boolean isClicked = false;
LinearLayout mLayoutTab = (LinearLayout) findViewById(R.id.linearlayout);

if(isClicked) {
    isClicked = false;
    mLayoutTab.animate()
        .translationYBy(120)
        .translationY(0)     
        .setDuration(getResources().getInteger(android.R.integer.config_mediumAnimTime));
} else {
    isClicked = true;
    mLayoutTab.animate()
         .translationYBy(0)
         .translationY(120)
         .setDuration(getResources().getInteger(android.R.integer.config_mediumAnimTime));
}
于 2015-08-28T06:46:21.283 に答える
1

これが私の解決策です。ビューへの参照を取得して、このメソッドを呼び出すだけです。

public static void animateViewFromBottomToTop(final View view){

    view.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {

        @Override
        public void onGlobalLayout() {

            view.getViewTreeObserver().removeOnGlobalLayoutListener(this);

            final int TRANSLATION_Y = view.getHeight();
            view.setTranslationY(TRANSLATION_Y);
            view.setVisibility(View.GONE);
            view.animate()
                .translationYBy(-TRANSLATION_Y)
                .setDuration(500)
                .setStartDelay(200)
                .setListener(new AnimatorListenerAdapter() {

                    @Override
                    public void onAnimationStart(final Animator animation) {

                        view.setVisibility(View.VISIBLE);
                    }
                })
                .start();
        }
    });
}

他に何もする必要はありません =)

于 2016-06-17T01:27:15.010 に答える