Изменение размера анимации android RelativeLayout
Мне нужно изменить ширину RelativeLayout от 0 до 600 пикселей программно, анимированным способом. Я использую следующий код:
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);
Однако по какой-то причине это не работает. Может ли кто-нибудь указать мне в правильном направлении?
Ответы
Ответ 1
Я просто набрал это и отлично работает здесь
Анимация
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;
}
}
Использование
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);
}
Ответ 2
Много раз самый простой способ анимации изменений макета в Android - установить атрибут animateLayoutChanges
в true
в макете xml. Для получения дополнительной информации см. http://developer.android.com/training/animation/layout.html.
Ответ 3
Вместо setLayoutParams()
вызовите requestLayout()
после изменения ширины.
Ответ 4
Это то, что сработало для меня:
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();
}
}