#java #android #xml #animation
#java #Android #xml #Анимация
Вопрос:
У меня есть statelistdrawable для моей кнопки следующим образом:
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_pressed="true">
<rotate
android:fromDegrees="90"
android:toDegrees="90"
android:pivotX="50%"
android:pivotY="50%"
android:drawable="@drawable/spinner"
android:duration="1200"
android:repeatCount="infinite"/>
</item>
<item>
<rotate
android:fromDegrees="90"
android:toDegrees="90"
android:pivotX="50%"
android:pivotY="50%"
android:drawable="@drawable/spinner"
android:duration="1200"
android:repeatCount="infinite"/>
</item>
</selector>
Теперь моя кнопка, которая объявлена в xml, имеет этот файл, установленный в качестве ее drawableTop.
Обычно я бы объявил вращающуюся часть в res / anim, и я могу начать анимацию с
Animation a = AnimationUtils.loadAnimation(getContext(), R.anim.spinner);
view.startAnimation(a);
Но как я могу получить доступ к анимации, если она находится внутри списка состояний, который можно нарисовать, чтобы он запустился? Я пробовал что-то подобное, но теперь я застрял:
StateListDrawable background = (StateListDrawable) mRecommendButton.getBackground();
Drawable drawable = background.getCurrent();
Что дает мне возможность рисования, но не анимацию.
** РЕДАКТИРОВАТЬ **
по-видимому, она возвращает значение RotateDrawable, поэтому я изменил свой код, но он все еще не вращается. Я также использую getCompoundDrawables(), потому что я устанавливаю для своего рисованного xml значение Top. Просто для записи. Он вводит «оператор if».
StateListDrawable background = (StateListDrawable) mRecommendButton.getCompoundDrawables()[1];
Drawable drawable = background.getCurrent();
if (drawable instanceof RotateDrawable) {
((RotateDrawable) drawable).setLevel(500);
}
Комментарии:
1. тег rotate определяет RotateDrawable, а не любую анимацию
2. Спасибо. Так мне начинать ее с setLevel? Потому что он не вращается
3. попробуйте background.setLevel
4. Нет, все еще не работает. Но я нашел другой способ получить RotateDrawable. Отредактировал мой вопрос, но нет ничего похожего на start() для RotateDrawable?
5. поскольку RotateDrawable является Drawable, он просто поворачивает дочерний Drawable на некоторый угол, он никак не анимирует его
Ответ №1:
Исправлено. Теперь я использую анимированный поворот
<animated-rotate xmlns:android="http://schemas.android.com/apk/res/android"
android:drawable="@drawable/spinner_black_48"
android:pivotX="50%"
android:pivotY="50%"
android:fromDegrees="0"
android:toDegrees="1080"
android:interpolator="@android:anim/linear_interpolator"
android:repeatCount="infinite"/>
Java:
mRecommendButton = (Button)v.findViewById(R.id.recommended_button);
StateListDrawable background = (StateListDrawable) mRecommendButton.getCompoundDrawables()[1]; // Drawable set as drawableTop in xml
Drawable drawable = background.getCurrent();
if (drawable instanceof Animatable) {
((Animatable) drawable).start();
}