Android - изменение левого поля с помощью анимации
Я изменяю левый край изображения следующим образом:
ViewGroup.MarginLayoutParams layoutParams = (MarginLayoutParams) image.getLayoutParams ();
layoutParams.leftMargin = VALUE;
image.setLayoutParams ( layoutParams );
Я бы хотел, чтобы изменение маржи применялось с анимацией. Любые подсказки?
Что я пробовал:
ObjectAnimator objectAnimator = ObjectAnimator.ofFloat ( image , "x" , VALUE);
objectAnimator.start();
Это прекрасно работает, так как изображение перемещается в указанное значение X с анимацией, ОДНАКО значение layoutParams.leftMargin остается неизменным!! Поэтому я не могу использовать этот метод, потому что, если я попытаюсь изменить значение layoutParams.leftMargin на 100 после использования objectAnimator со значением 100, применяемое значение неверно (200 применяется вместо 100, эффект, если objectAnimator остается, хотя я устанавливаю левое поле следующим образом:
layoutParams.leftMargin = 100;
Ответы
Ответ 1
Используйте класс анимации, а не ObjectAnimator.
final int newLeftMargin = <some value>;
Animation a = new Animation() {
@Override
protected void applyTransformation(float interpolatedTime, Transformation t) {
LayoutParams params = yourView.getLayoutParams();
params.leftMargin = (int)(newLeftMargin * interpolatedTime);
yourView.setLayoutParams(params);
}
};
a.setDuration(500); // in ms
yourView.startAnimation(a);
Обратите внимание, что вы должны использовать правильный класс LayoutParams, т.е. если ваш вид является потомком LinearLayout, тогда параметры должны быть LinearLayout.LayoutParams
Ответ 2
Я пришел к этому вопросу, но я не мог использовать его, потому что я хочу оживить маржу от отрицательного значения до 0, поэтому я использовал базу valueAnimater для user1991679 answer:
final View animatedView = view.findViewById(R.id.animatedView);
final LinearLayout.LayoutParams params = (LinearLayout.LayoutParams) animatedView.getLayoutParams();
ValueAnimator animator = ValueAnimator.ofInt(params.bottomMargin, 0);
animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator valueAnimator)
{
params.bottomMargin = (Integer) valueAnimator.getAnimatedValue();
animatedView.requestLayout();
}
});
animator.setDuration(300);
animator.start();
Вы должны изменить LinearLayout.LayoutParams в соответствии с контейнером animatedView.
Кроме того, вы можете использовать девятидюжины для более старой версии, не имеющие ValueAnimator.
Ответ 3
Вы можете использовать следующие
image.animate().setDuration(durationIn).translationXBy(offsetFloat).start();
Вы также можете добавить .setInterpolator(new BounceInterpolator())
, чтобы изменить внешний вид анимации.