Страницы

Поиск по вопросам

пятница, 13 марта 2020 г.

Android ObjectAnimator with radius

#java #android #android_animation


Никак не могу разобраться с ObjectAnimator. Мне нужно изменить позицию объекта по
окружности, где радиус 100:


ObjectAnimator animator = ObjectAnimator.ofFloat(ball, "radius", 100F, 100F);
            AnimatorSet set = new AnimatorSet();
            set.play(animator);
            set.setDuration(3000);
            set.start();


"radius" - такого свойства нету, есть только стандартные - "rotation","translationX"...
Как мне создать такое свойство? Или скиньте ссылку, где об этом рассказывается.
    


Ответы

Ответ 1



Решил эту проблему с помощью класса ValueAnimator и математического уравнения x^2+y^2=r^2 В ValueAnimator есть метод addUpdateListene, где я могу как получить координаты, так и засетить. Для траектории анимации нужно получать y, для этого нужен радиус, который я знаю и х, который могу брать методом getAnimatedValue(). Потом пришлось играться с вычислением х, так как центр у меня был не в т.(0,0), а в т. (100,0). Поставил проверку, если х <= r и r < x && x <= r*2 private float x = 0f; private float y = 0f; private float radius = 100f; ValueAnimator animator = ValueAnimator.ofFloat(0F, 2 * radius); animator2.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { @Override public void onAnimationUpdate(ValueAnimator animation) { x = (Float) animation.getAnimatedValue(); Log.d("coordinate", "x = " + x); float newX = 0; if (x <= radius) { newX = radius - x; Log.d("coordinate", "newX = " + newX); } else if (radius < x && x <= radius * 2) { newX = x - radius; Log.d("coordinate", "newX = " + newX); } y = (float) Math.sqrt(radius * radius - newX * newX); Log.d("coordinate", "y = " + y); ViewCompat.setTranslationX(ball, x); ViewCompat.setTranslationY(ball, y); } }); AnimatorSet set = new AnimatorSet(); set.play(animator); set.setDuration(3000); set.start();

Комментариев нет:

Отправить комментарий