Я использую RotateAnimation
для поворота изображения, которое я использую как пользовательский циклический спиннер в Android. Вот мой rotate_indefinitely.xml
файл, который я поместил вres/anim/
:
<?xml version="1.0" encoding="UTF-8"?>
<rotate
xmlns:android="http://schemas.android.com/apk/res/android"
android:fromDegrees="0"
android:toDegrees="360"
android:pivotX="50%"
android:pivotY="50%"
android:repeatCount="infinite"
android:duration="1200" />
Когда я применяю это к своему ImageView
использованию AndroidUtils.loadAnimation()
, это прекрасно работает!
spinner.startAnimation(
AnimationUtils.loadAnimation(activity, R.anim.rotate_indefinitely) );
Единственная проблема заключается в том, что вращение изображения, кажется, останавливается в верхней части каждого цикла.
Другими словами, изображение поворачивается на 360 градусов, кратковременно останавливается, затем снова поворачивается на 360 градусов и т. Д.
Я подозреваю, что проблема в том, что анимация использует интерполятор по умолчанию, такой как android:iterpolator="@android:anim/accelerate_interpolator"
( AccelerateInterpolator
), но я не знаю, как сказать ему не интерполировать анимацию.
Как я могу отключить интерполяцию (если это действительно проблема), чтобы сделать цикл анимации плавным?
У меня тоже была эта проблема, и я безуспешно пытался установить линейный интерполятор в xml. Решение, которое работало для меня, состояло в том, чтобы создать анимацию в виде RotateAnimation в коде.
источник
rotate.setFillAfter(true);
rotate.setRepeatCount(Animation.INFINITE);
Это отлично работает
Чтобы повернуть назад:
источник
Может быть, что-то вроде этого поможет:
Кстати, вы можете вращаться более чем на 360, как:
источник
Попробуйте использовать,
toDegrees="359"
так как 360 ° и 0 ° одинаковы.источник
Попробуй это.
источник
Вращение объекта программно.
// вращение по часовой стрелке:
// вращение против часовой стрелки:
Посмотреть - это объект вашего ImageView или других виджетов.
rotate.setRepeatCount (10);используйте, чтобы повторить ваше вращение.
500 - ваша продолжительность анимации.
источник
Обрезка
<set>
-элемент, который обернул<rotate>
-элементом, решает проблему!Спасибо Шалафи!
Так что ваш Rotation_ccw.xml должен выглядеть примерно так:
источник
Независимо от того, что я пытался, я не мог заставить это работать правильно, используя код (и setRotation) для плавной анимации вращения. То, что я закончил, делало изменения степени настолько маленькими, что маленькие паузы незаметны. Если вам не нужно делать слишком много поворотов, время выполнения этого цикла незначительно. Эффект плавного вращения:
источник
Как уже упоминал Ханри, подкладка лайнера iterpolator вполне подойдет. Но если вращение находится внутри набора, вы должны поставить android: shareInterpolator = "false", чтобы сделать его плавным.
Если Sharedinterpolator не равен false, приведенный выше код дает глюки.
источник
Если вы используете набор анимации, как я, вы должны добавить интерполяцию внутри тега набора:
Это сработало для меня.
источник
В Котлине:
источник
Возможно ли, что с 0 до 360 вы потратите немного больше времени на 0/360, чем ожидаете? Возможно, установите в градусы 359 или 358.
источник
Попробуйте использовать более 360, чтобы избежать перезапуска.
Я использую 3600 insted из 360, и это прекрасно работает для меня:
источник
В Android, если вы хотите анимировать объект и заставить его переместить объект из location1 в location2, API-интерфейс анимации определяет промежуточные местоположения (анимацию движения), а затем помещает в основной поток соответствующие операции перемещения в подходящее время с использованием таймера. , Это прекрасно работает, за исключением того, что основной поток обычно используется для многих других вещей - рисования, открытия файлов, ответа на пользовательский ввод и т. Д. Таймер в очереди часто может быть отложен. Хорошо написанные программы всегда будут пытаться выполнить как можно больше операций в фоновых (не основных) потоках, однако вы не всегда можете избежать использования основного потока. Операции, которые требуют, чтобы вы работали с объектом пользовательского интерфейса, всегда должны выполняться в основном потоке. Кроме того, многие API будут направлять операции обратно в основной поток как форму безопасности потока.
Все представления отображаются в одном потоке графического интерфейса, который также используется для всех действий пользователя.
Поэтому, если вам нужно быстро обновить графический интерфейс или если рендеринг занимает слишком много времени и влияет на работу пользователя, используйте SurfaceView.
Пример поворота изображения:
деятельность:
источник
источник