Подтвердить что ты не робот

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;
4b9b3361

Ответ 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()), чтобы изменить внешний вид анимации.