12

在我的主布局文件中,我有一个 RelativeLayout,其权重为 1(基本上是为了显示地图)在一个权重为 2 的 LinearLayout 之上,这样声明:

<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/5 而不是 1/3。

我设法通过更改 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 回答