Изменение размеров макетов программным способом (как анимация)

Я хочу изменить размеры макетов в своей работе.

Вот код основного XML:

<LinearLayout
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:layout_weight="1"
    android:orientation="vertical" >

    <LinearLayout
        android:id="@+id/top"
        android:layout_width="fill_parent"
        android:layout_height="0dip"
        android:layout_weight="1"
        android:background="#3ee3e3" >
    </LinearLayout>

    <LinearLayout
        android:id="@+id/middle"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:layout_weight="1">
    </LinearLayout>

    <LinearLayout
        android:id="@+id/bottom"
        android:layout_width="fill_parent"
        android:layout_height="0dip"
        android:layout_weight="1"
        android:background="#fe51e6" >
    </LinearLayout>
</LinearLayout>

Как вы можете видеть, верхняя и нижняя высота макета равна 0, а средняя макет охватывает все места.

Я хочу программно уменьшить средний размер макета, а также увеличить верхнюю и размеры нижнего макета, пока все макеты не будут иметь одинаковую высоту.

Я хочу, чтобы это выглядело как анимация.

Как мне это сделать?

Спасибо

Ответ 1

Я написал ResizeAnimation для аналогичной цели. Это просто, но дорого.

/**
 * an animation for resizing the view.
 */
public class ResizeAnimation extends Animation {
    private View mView;
    private float mToHeight;
    private float mFromHeight;

    private float mToWidth;
    private float mFromWidth;

    public ResizeAnimation(View v, float fromWidth, float fromHeight, float toWidth, float toHeight) {
        mToHeight = toHeight;
        mToWidth = toWidth;
        mFromHeight = fromHeight;
        mFromWidth = fromWidth;
        mView = v;
        setDuration(300);
    }

    @Override
    protected void applyTransformation(float interpolatedTime, Transformation t) {
        float height =
                (mToHeight - mFromHeight) * interpolatedTime + mFromHeight;
        float width = (mToWidth - mFromWidth) * interpolatedTime + mFromWidth;
        LayoutParams p = mView.getLayoutParams();
        p.height = (int) height;
        p.width = (int) width;
        mView.requestLayout();
    }
}

Ответ 2

В Honeycomb (Android 3.0) есть классы Animator и ObjectAnimator для более плавных анимаций.

Прочтите здесь

Пример о том, как оживить перемещение группы представлений (LinearLayout) с помощью интерполятора отказов.

BounceInterpolator bounceInterpolator = new BounceInterpolator();   
ObjectAnimator anim = ObjectAnimator.ofFloat(myViewGroup, "translationY", 0f, -200 );
anim.setInterpolator(bounceInterpolator);
anim.setDuration(1100).start();

Это вызовет гладкую анимацию с эффектом отскока и действительно переместит представления, не похожие на анимацию, до Honeycomb. Из документов:

Предыдущие анимации изменили внешний вид целевых объектов... но они фактически не изменили сами объекты.