21

線形レイアウトに 2 つのビューがあり、プログラムでそれらの layout_weight プロパティを変更します。この重量の変化をアニメーション化して、重量が変更されたときにビューが新しいサイズに向かってスライドする方法はありますか?

4

5 に答える 5

34

ObjectAnimator を簡単に使用できます。

ObjectAnimator anim = ObjectAnimator.ofFloat(
                viewToAnimate,
                "weight",
                startValue,
                endValue);
        anim.setDuration(2500);
        anim.start();

1 つの問題は、View クラスに setWeight() メソッド (ObjectAnimator で必要) がないことです。これに対処するために、ビューのウェイト アニメーションをアーカイブするのに役立つシンプルなラッパーを作成しました。

public class ViewWeightAnimationWrapper {
    private View view;

    public ViewWeightAnimationWrapper(View view) {
        if (view.getLayoutParams() instanceof LinearLayout.LayoutParams) {
            this.view = view;
        } else {
            throw new IllegalArgumentException("The view should have LinearLayout as parent");
        }
    }

    public void setWeight(float weight) {
        LinearLayout.LayoutParams params = (LinearLayout.LayoutParams) view.getLayoutParams();
        params.weight = weight;
        view.getParent().requestLayout();
    }

    public float getWeight() {
        return ((LinearLayout.LayoutParams) view.getLayoutParams()).weight;
    }
}

次のように使用します。

    ViewWeightAnimationWrapper animationWrapper = new ViewWeightAnimationWrapper(view);
    ObjectAnimator anim = ObjectAnimator.ofFloat(animationWrapper,
                    "weight",
                    animationWrapper.getWeight(),
                    weight);
            anim.setDuration(2500);
            anim.start();
于 2015-12-04T13:59:18.833 に答える
4

私もこれを見てきました。最終的に、親の weightsum プロパティをアニメーション化することで解決しました。これは、LinearLayout に 2 つのビューがある場合に非常にうまく機能します。

参照: ObjectAnimator を使用した weightSum プロパティのアニメーション化

以下の例では、weightSum を 1.0 から 2.0 にアニメーション化すると、画面 2 が適切にアニメーション化されて表示されます。

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/dual_pane"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="horizontal"
    android:weightSum="1.0">

<!-- Screen 1 -->
<LinearLayout
    android:layout_width="0dp"
    android:layout_height="match_parent"
    android:background="#ff0000"
    android:layout_weight="1">
</LinearLayout>

<!-- Screen 2 -->
<LinearLayout
    android:layout_width="0dp"
    android:layout_height="match_parent"
    android:background="#ff6600"
    android:layout_weight="1">
</LinearLayout>
</LinearLayout>
于 2012-07-25T16:28:38.450 に答える
0

上記のすべての回答は私にとってはうまくいきませんでした (それらは単に「スナップ」され、アニメーション化されません) が、親レイアウトに weight_sum="1" を追加した後、機能し始めました。他の誰かが同じ問題を思いついた場合に備えて。

于 2018-11-02T11:11:30.917 に答える