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