有一个奇怪的.我把它归结为一个非常简单的例子.真的想不出来.
我在LinearLayout中有一个LinearLayout.我想使用动画来调整孩子的大小(有时候我会使用动画片).这是我的布局XML.
android:layout_width="fill_parent" android:layout_height="fill_parent"
android:orientation="vertical" >
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/hello"
android:gravity="center" />
现在,正如您所看到的,有一个按钮,这是该按钮的代码.
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;
}
如果你现在运行它,它不会滑下来.完全没有.但是,如果您要将Button移动到我已命名为Overview的LinearLayout并将其放在Child LinearLayout之后,那么它就可以了!像这样…
android:layout_width="fill_parent" android:layout_height="fill_parent"
android:orientation="vertical" >
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/hello"
android:gravity="center" />
它现在滑下来,正如预期的那样.显然,父布局会发生一些事情…因为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;
}
}
任何帮助都会很棒!