12

私のメイン レイアウト ファイルでは、重み 2 の LinearLayout の上に重み 1 (基本的に地図を表示するため) の RelativeLayout があり、次のように宣言されています。

<LinearLayout
    android:id="@+id/GlobalLayout"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <RelativeLayout
        android:id="@+id/UpLayout"
        android:layout_width="match_parent"
        android:layout_height="0px"
        android:layout_weight="1" >
    </RelativeLayout>

    <LinearLayout
        android:id="@+id/DownLayout"
        android:layout_width="match_parent"
        android:layout_height="0px"
        android:layout_weight="2"
        android:orientation="vertical" >
    </LinearLayout>

</LinearLayout>

DownLayout には項目のリストが含まれています。項目をクリックすると、DownLayout の重みを 4 に変更したいので、上部のレイアウト (マップ) は画面の 1/3 ではなく 1/5 しか占有しません。

私は LayoutParams を変更することでそれを行うことができました:

    LinearLayout linearLayout = (LinearLayout) mActivity.findViewById(R.id.DownLayout);
    LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(
            LayoutParams.WRAP_CONTENT, LayoutParams.MATCH_PARENT);
    params.weight = 4.0f;
    linearLayout.setLayoutParams(params);

それは機能しますが、私は満足していません。変化が速すぎます。スムーズにしたいのですが、移行はありません。そのためにアニメーションを使用する方法はありますか?

ObjectAnimator を使用して weightSum を変更する例をいくつか見つけましたが、必要ありません (このプロパティのみを変更すると、ダウン レイアウトの下に空きスペースができます)。

        float ws = mLinearLayout.getWeightSum();
        ObjectAnimator anim = ObjectAnimator.ofFloat(mLinearLayout, "weightSum", ws, 5.0f);
        anim.setDuration(3000);
        anim.addUpdateListener(this);
        anim.start();

それを行うために ObjectAnimator (または何か他のもの) を使用する方法はありますか?

ありがとう !

4

1 に答える 1

26

最近、同様の問題に遭遇し、標準のアニメーションを使用して解決しました(API 10をターゲットにする必要があるため、ObjectAnimatorを使用できませんでした)。ここでの回答と、身長ではなく体重を考慮に入れるためのわずかな変更を組み合わせて使用​​しました。

私のカスタムアニメーションクラスは次のようになります...

private class ExpandAnimation extends Animation {

    private final float mStartWeight;
    private final float mDeltaWeight;

    public ExpandAnimation(float startWeight, float endWeight) {
        mStartWeight = startWeight;
        mDeltaWeight = endWeight - startWeight;
    }

    @Override
    protected void applyTransformation(float interpolatedTime, Transformation t) {
        LinearLayout.LayoutParams lp = (LinearLayout.LayoutParams) mContent.getLayoutParams();
        lp.weight = (mStartWeight + (mDeltaWeight * interpolatedTime));
        mContent.setLayoutParams(lp);
    }

    @Override
    public boolean willChangeBounds() {
        return true;
    }
}

そして、このメソッドによって呼び出されます...

public void toggle() {
    Animation a;
    if (mExpanded) {
        a = new ExpandAnimation(mExpandedWeight, mCollapsedWeight);
        mListener.onCollapse(mContent);
    } else {
        a = new ExpandAnimation(mCollapsedWeight, mExpandedWeight);
        mListener.onExpand(mContent);
    }

    a.setDuration(mAnimationDuration);
    mContent.startAnimation(a);
    mExpanded = !mExpanded;
}

詳細が必要な場合、または何かについて質問がある場合は、お知らせください。

于 2013-12-02T17:46:19.653 に答える