Только что нашел ответ здесь!
https://stackoverflow.com/a/8697806/327402
Очень полезный пост!
Действительно, есть ограничение платформы, хотя это не то, что вы могли бы подумать. Проблема в том, что в pre-API11 RotateDrawable
был какой-то грубый код, требующий, чтобы анимация вращалась по часовой стрелке, проверяя, было ли toDegrees
больше fromDegrees
; если нет, то оба были вынуждены сравняться друг с другом. Если вы изменили свой пример, чтобы второй элемент двигался в прямом направлении (от 0 до 720 или даже от -720 до 0), оба изображения будут хорошо анимироваться на всех платформах; хотя я понимаю, что это побеждает цель того, к чему ты стремишься.
Взгляните на кэшированную версию Google Codesearch с RotateDrawable.inflate()
, которая является версией 2.3 метода, используемого для превращения XML в объект, и вы поймете, что я имею в виду.
RotateDrawable.java ... код ошибки в строке 235 ...
float fromDegrees = a.getFloat(
com.android.internal.R.styleable.RotateDrawable_fromDegrees, 0.0f);
float toDegrees = a.getFloat(
com.android.internal.R.styleable.RotateDrawable_toDegrees, 360.0f);
toDegrees = Math.max(fromDegrees, toDegrees); //<--There's the culprit
Это берет блок XML, подобный второму имеющемуся у вас элементу, и превращает его в RotateDrawable
, заканчивающийся тем же значением для fromDegrees
и toDegrees
(в вашем случае, 720), вызывая изображение просто стоять на месте. Вы можете проверить это, установив начальное значение на некоторое значение, не кратное 360 (например, 765). Вы увидите, что изображение по-прежнему не анимируется, но поворачивается к начальной координате.
Эта неловкая проверка была удалена в источниках Honeycomb / ICS, поэтому вы можете выполнять вращение в обратном направлении на этих платформах. Кроме того, не похоже, что есть способ установить эти значения из кода Java, так что пользовательский RotateDrawableCompat
может быть в вашем будущем:)
НТН