Ошибка setBackground View после анимации
Я создаю CustomView
продолжается View
, Создать некоторые CustomView
и используя анимацию, чтобы перемещать и вращать их. После изменения backgroundResource
и ошибка произошла, новый фон не заполнить все CustomView
, Пожалуйста, смотрите код:
clearAnimation();
AnimationSet animation = new AnimationSet(true);
TranslateAnimation translateAnimation = new TranslateAnimation(0, destX - srcX, 0, destY - srcY);
translateAnimation.setInterpolator(new LinearInterpolator());
translateAnimation.setDuration((long) MGConstant.ANIMATE_DURATION);
animation.addAnimation(translateAnimation);
final float finalX = destX;
final float finalY = destY;
animation.setAnimationListener(new AnimationListener() {
public void onAnimationEnd(Animation arg0) {
clearAnimation();
setX(finalX);
setY(finalY);
RotateAnimation rotateAnimation = new RotateAnimation(0, degrees, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f);
rotateAnimation.setInterpolator(new LinearInterpolator());
rotateAnimation.setDuration((long) MGConstant.ANIMATE_DURATION);
rotateAnimation.setFillAfter(true);
startAnimation(rotateAnimation);
resetLayout();
mMoveStatus = false;
degree = degrees;
}
public void onAnimationRepeat(Animation arg0) {
}
public void onAnimationStart(Animation arg0) {
}
});
startAnimation(animation);
и сбросить Lauyout:
lp = (LayoutParams) getLayoutParams();
if (lp == null) {
Log.d(TAG, "FIRST");
lp = new LayoutParams((int) cardW, (int) cardH);
lp.leftMargin = (int) mX;
lp.topMargin = (int) mY;
} else {
Log.d(TAG, "LAST");
lp.leftMargin = (int) mX;
lp.topMargin = (int) mY;
}
setLayoutParams(lp);
пожалуйста, помогите мне
3 ответа
Использование ObjectAnimator
для анимации представлений, в соответствии с вашими требованиями, это поддерживает представление после завершения анимации, вы не хотите изменять LayoutParams
и т.п.
ObjectAnimator objectAnimator = ObjectAnimator.ofFloat(customView,
"translation", 0, destX - srcX, 0, destY - srcY);
objectAnimator.setDuration((long) MGConstantANIMATE_DURATION);
ObjectAnimator rotation = ObjectAnimator.ofFloat(customView,
"rotation", 0, degree);
rotation .setDuration((long) MGConstantANIMATE_DURATION);
AnimatorSet animatorSet = new AnimatorSet();
animatorSet.setDuration((long) MGConstantANIMATE_DURATION);
animatorSet.play(objectAnimator).after(rotation);
customView.setBackgroundResource(R.drawable.your_image);
Изменить свойства вашего виджета с помощью обработчика имеет ниже
public void onAnimationEnd(Animation arg0) {
new Handler.post(new Runnable(){
clearAnimation();
setX(finalX);
setY(finalY);
RotateAnimation rotateAnimation = new RotateAnimation(0, degrees, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f);
rotateAnimation.setInterpolator(new LinearInterpolator());
rotateAnimation.setDuration((long) MGConstant.ANIMATE_DURATION);
rotateAnimation.setFillAfter(true);
startAnimation(rotateAnimation);
resetLayout();
mMoveStatus = false;
degree = degrees;
});
}
Это решит вашу проблему.
Когда вы меняете такие вещи, как параметры макета, убедитесь, что вы также вызываете View.requestLayout(). Я не думаю, что вам нужно здесь, хотя. Все, что вам нужно, это следующее:
AnimationSet animation = new AnimationSet(true);
animation.setFillAfter(true);
TranslateAnimation translateAnimation = new TranslateAnimation(0, destX - srcX, 0, destY - srcY);
translateAnimation.setInterpolator(new LinearInterpolator());
translateAnimation.setDuration((long) MGConstant.ANIMATE_DURATION);
animation.addAnimation(translateAnimation);
RotateAnimation rotateAnimation = new RotateAnimation(0, degrees, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f);
rotateAnimation.setInterpolator(new LinearInterpolator());
rotateAnimation.setDuration((long) MGConstant.ANIMATE_DURATION);
rotateAnimation.setStartOffset((long) MGConstant.ANIMATE_DURATION);
animation.addAnimation(rotateAnimation);
startAnimation(animation);