我有2个LinearLayouts,其中的视图保存在容器LinearLayout中,该容器使用layout_weight来确定它们的大小。当用户使用动画在底部视图中单击时,我试图缩小顶视图。
我用类扩展了动画:
public class ShrinkTopViewAnimation extends Animation {
protected int mOriginalHeight;
protected final LinearLayout mView;
public ShrinkTopViewAnimation(LinearLayout view) {
this.mView = view;
}
@Override
public void initialize(int width, int height, int parentWidth, int parentHeight) {
super.initialize(width, height, parentWidth, parentHeight);
mOriginalHeight = height;
}
@Override
protected void applyTransformation(float interpolatedTime, Transformation transformation
) {
int shrinkAmount = (int)(mOriginalHeight * interpolatedTime);
ViewGroup.LayoutParams layoutParams = mView.getLayoutParams();
layoutParams.height = mOriginalHeight - shrinkAmount;
mView.setLayoutParams(layoutParams);
mView.requestLayout();
}
@Override
public boolean willChangeBounds() {
return true;
}
}
BottomView onClick调用:
ShrinkTopViewAnimation shrinkTopViewAnimation = new ShrinkTopViewAnimation(mTopLinearLayout);
shrinkTopViewAnimation.setDuration(1000);
mTopLinearLayout.startAnimation(shrinkTopViewAnimation);
我对发生的事情感到很困惑。我所看到的是,第一次通过applyTransform时,interpolatedTime为0,因此.height设置为与之前完全相同的数字。但是下一次调用applyTransformation时,对mView的getHeight调用会给出比起始高度更大的数字,并且当interpolatedTime为1时,在视图返回到原始大小时,在变换结束时。视觉效果是顶视图跳得更大,然后缩小回原始大小。
getHeight()和初始化高度都在文档中列为px,而LayoutParams.Height列为px。但似乎dp可能正在进行一些翻译?
有什么想法吗?
答案 0 :(得分:0)
要保留动画效果,请使用Animation.setFillAfter(true)
。
设置为true时,将在动画结束后应用动画转换。
您在此使用的是View Animation
。这种动画只修改渲染变换,因此视图的实际大小不会改变。
如果您需要更改实际尺寸,则必须通过LayoutParams
设置AnimationListener
,或使用Property Animation
。