24

いくつかのボタンのコンテナとして使用するLinearLayoutと、ユーザーが「表示」ボタンを押したときにレイアウトが下にスライドするような印象を与えるために高さをアニメーション化するテキストビューがあります。

xmlでLinearLayoutをlayout_height="0dp"およびvisibility="gone"に設定しました。次に、コンテンツをラップするために必要な高さで表示されるように設定します。現時点では、アニメーション化すら問題が発生しています。ラップコンテンツの高さは気にしないでください。

アニメーション化するための私の方法は次のとおりです。

private void toggle(final LinearLayout v) {
    v.setVisibility(View.VISIBLE);
    ValueAnimator va = ValueAnimator.ofInt(0, 300);
    va.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
        public void onAnimationUpdate(ValueAnimator animation) {
            Integer value = (Integer) animation.getAnimatedValue();
            v.getLayoutParams().height = value.intValue();
            v.invalidate();

        }
    });

    va.start();
}

おそらく問題は、LinearLayoutの高さをどのように設定するかです。それとも、ValueAnimatorの機能を誤解していますか?Chet Haaseによるブログ投稿を見回しましたが、特定の高さのアニメーションの例は含まれていません。また、3.0以降のAPIを使用して高さのアニメーションを操作する方法の良い例を見つけることもできませんでした。これについての助けが欲しいです、ありがとう!

4

1 に答える 1

61

このブログ投稿を見てください: http: //tech.chitgoks.com/2011/10/29/android-animation-to-expand-collapse-view-its-children/view.invalidate()はレイアウトを持つために使用すべきではないことがわかりました再描画。を使用する必要がありますview.requestLayout()

したがって、コードは次のようになります。

ValueAnimator va = ValueAnimator.ofInt(0, height);
    va.setDuration(700);
    va.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
        public void onAnimationUpdate(ValueAnimator animation) {
            Integer value = (Integer) animation.getAnimatedValue();
            v.getLayoutParams().height = value.intValue();
            v.requestLayout();
        }
    });

アニメーションを動的にするために、LinearLayoutの高さも取得する方法についてのメモを追加したかっただけです。高さを取得するには、最初にすべてのビューを描画する必要があります。そのため、描画が完了したことを通知するイベントをリッスンする必要があります。これは、次のようなonResume()メソッドから実行できます(私のxmlでは、コンテナーを高さのwrap_contentに宣言し、それも表示されます。最初から非表示にしたいので、測定後に実行します)。

@Override
    public void onResume() {
        super.onResume();
        final ViewTreeObserver vto = filterContainer.getViewTreeObserver();
        vto.addOnGlobalLayoutListener(new OnGlobalLayoutListener() {
            @Override
            public void onGlobalLayout() {
                height = filterContainer.getHeight();
                filterContainer.setVisibility(View.GONE);
                filterContainer.getLayoutParams().height = 0;
                filterContainer.requestLayout();
                ViewTreeObserver obs = filterContainer.getViewTreeObserver();
                obs.removeGlobalOnLayoutListener(this);
            }
        });
    }
于 2012-08-13T13:52:05.087 に答える