LinearyLayout не будет изменять размер, если его высота равна 0.

Получилась странная. Мне удалось привести ее к очень простому примеру. На самом деле не могу понять.

Я получил LinearLayout внутри LinearLayout. Я хочу изменить размер дочернего элемента, используя анимацию (иногда работающую с удовольствием). Вот мой макет XML.

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent" android:layout_height="fill_parent"
    android:orientation="vertical" >

    <LinearLayout android:layout_width="fill_parent" android:layout_height="wrap_content" android:orientation="vertical">
        <!-- Lots more controls will appear above -->
        <LinearLayout android:layout_width="fill_parent" android:layout_height="0dp" android:id="@+id/animation_subject">
            <TextView
                android:layout_width="fill_parent"
                android:layout_height="wrap_content"
                android:text="@string/hello"
                android:gravity="center" />
        </LinearLayout> 
        <!-- Lots more controls will appear below -->
    </LinearLayout>

    <Button android:text="Slide it Down!" android:layout_width="fill_parent" android:layout_height="wrap_content" android:onClick="btnDoAnimDown_OnClick" />

</LinearLayout>

Теперь, как вы видите, есть кнопка, и вот — это код этой кнопки.

public void btnDoAnimDown_OnClick(View v)
{
    View pnlSlider = findViewById(R.id.animation_subject);
    pnlSlider.measure(1000, 1000);
    DropDownAnim anim = new DropDownAnim(pnlSlider, pnlSlider.getMeasuredHeight(), true);
    anim.setDuration(2000);
    pnlSlider.startAnimation(anim);

    return;     
}

Если бы вы запустили ее сейчас, она бы не соскользнула вниз. Вовсе. Однако, если бы вы переместили кнопку в LinearLayout, которую я назвал «Обзор» и поместил ее после Дочерний LinearLayout, это работает! Вот так...

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent" android:layout_height="fill_parent"
    android:orientation="vertical" >

    <LinearLayout android:layout_width="fill_parent" android:layout_height="wrap_content" android:orientation="vertical">
        <!-- Lots more controls will appear above -->
        <LinearLayout android:layout_width="fill_parent" android:layout_height="0dp" android:id="@+id/animation_subject">
            <TextView
                android:layout_width="fill_parent"
                android:layout_height="wrap_content"
                android:text="@string/hello"
                android:gravity="center" />
        </LinearLayout> 
        <!-- Lots more controls will appear below -->
        <Button android:text="Slide it Down!" android:layout_width="fill_parent" android:layout_height="wrap_content" android:onClick="btnDoAnimDown_OnClick" />
    </LinearLayout>

</LinearLayout>

Теперь он скользит вниз, как и ожидалось. Очевидно, что-то происходит с родительским макетом... Поскольку getMeasuredHeight() возвращает правильное значение, это просто анимация на самом деле не запускается!

Это класс анимации, я что-то пропустил? Наверное, да!

import android.util.Log;
import android.view.View;
import android.view.animation.Animation;
import android.view.animation.Transformation;

public class DropDownAnim extends Animation {
    int targetHeight;
    View view;
    boolean down;

    public DropDownAnim(View view, int targetHeight, boolean down) {
        this.view = view;
        this.targetHeight = targetHeight;
        this.down = down;
    }

    @Override
    protected void applyTransformation(float interpolatedTime, Transformation t) {
        int newHeight;
        if (down) {
            newHeight = (int) (targetHeight * interpolatedTime);
        } else {
            newHeight = (int) (targetHeight * (1 - interpolatedTime));
        }
        Log.d("new height", String.valueOf(newHeight));
        view.getLayoutParams().height = newHeight;
        view.requestLayout();
    }

    @Override
    public void initialize(int width, int height, int parentWidth,
            int parentHeight) {
        super.initialize(width, height, ((View)view.getParent()).getWidth(), parentHeight);
    }

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

Любая помощь была бы фантастической!

7
задан Till 20 May 2012 в 20:24
поделиться