[英]Animate change width of android RelativeLayout
I need to change the width of a RelativeLayout from 0 to 600px programmatically, in an animated way.我需要以动画方式以编程方式将 RelativeLayout 的宽度从 0 更改为 600px。 I'm using the following code:
我正在使用以下代码:
Animation a = new Animation() {
@Override
protected void applyTransformation(float interpolatedTime, Transformation t) {
RelativeLayout.LayoutParams drawerParams = (LayoutParams) drawer.getLayoutParams();
drawerParams.width = 600;
drawer.setLayoutParams(drawerParams);
}
};
a.setDuration(1000); //Animate for 1s
layout.startAnimation(a);
However, for some reason this isn't working.但是,由于某种原因,这不起作用。 Can anyone point me in the right direction?
任何人都可以指出我正确的方向吗?
I just typed this up and works perfect here我刚刚输入了这个并且在这里工作得很好
Animation动画片
public class ResizeWidthAnimation extends Animation {
private int mWidth;
private int mStartWidth;
private View mView;
public ResizeWidthAnimation(View view, int width) {
mView = view;
mWidth = width;
mStartWidth = view.getWidth();
}
@Override
protected void applyTransformation(float interpolatedTime, Transformation t) {
int newWidth = mStartWidth + (int) ((mWidth - mStartWidth) * interpolatedTime);
mView.getLayoutParams().width = newWidth;
mView.requestLayout();
}
@Override
public void initialize(int width, int height, int parentWidth, int parentHeight) {
super.initialize(width, height, parentWidth, parentHeight);
}
@Override
public boolean willChangeBounds() {
return true;
}
}
usage用法
if (animate) {
ResizeWidthAnimation anim = new ResizeWidthAnimation(leftFrame, leftFragmentWidthPx);
anim.setDuration(500);
leftFrame.startAnimation(anim);
} else {
this.leftFragmentWidthPx = leftFragmentWidthPx;
LayoutParams lp = (LayoutParams) leftFrame.getLayoutParams();
lp.width = leftFragmentWidthPx;
leftFrame.setLayoutParams(lp);
}
UPDATE: Kotlin Version更新:Kotlin 版本
class ResizeWidthAnimation(private val mView: View, private val mWidth: Int) : Animation() {
private val mStartWidth: Int = mView.width
override fun applyTransformation(interpolatedTime: Float, t: Transformation) {
mView.layoutParams.width = mStartWidth + ((mWidth - mStartWidth) * interpolatedTime).toInt()
mView.requestLayout()
}
override fun willChangeBounds(): Boolean {
return true
}
}
A lot of times the easiest way to animate layout changes in Android is to set the animateLayoutChanges
attribute to true
in the layout xml.很多时候,在 Android 中为布局更改设置动画的最简单方法是在布局 xml
animateLayoutChanges
属性设置为true
。 For more details, see http://developer.android.com/training/animation/layout.html .有关更多详细信息,请参阅http://developer.android.com/training/animation/layout.html 。
在宽度更改后调用requestLayout()
而不是setLayoutParams()
。
This is what worked for me:这对我有用:
public class CloseImageFromRightToLeft extends Animation {
private final int newWidth;
private final int newHeight;
private final int originalWidth;
private ImageView mView;
public CloseImageFromRightToLeft(ImageView v, int[] widthAndHeight) {
mView = v;
this.newWidth = widthAndHeight[0] / 3;
this.originalWidth = widthAndHeight[0];
this.newHeight = widthAndHeight[1];
}
@Override
public void initialize(int width, int height, int parentWidth, int parentHeight) {
super.initialize(width, height, parentWidth, parentHeight);
}
@Override
public boolean willChangeBounds() {
return true;
}
@Override
public void applyTransformation(float interpolatedTime, Transformation t) {
int newWidth = originalWidth + (int) ((this.newWidth - originalWidth) * interpolatedTime);
LinearLayout.LayoutParams parms = new LinearLayout.LayoutParams(newWidth, this.newHeight);
mView.setLayoutParams(parms);
mView.requestLayout();
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.