Я пишу приложение, которое анимирует различные ImageViews, устанавливая для него массив идентификаторов ресурсов Drawable с помощью ObjectAnimator.
Вот пример кода, который я извлек, чтобы выделить проблему:
public class MainActivity extends AppCompatActivity {
private final int[] drawableIDs = new int[]
{R.drawable.ic_launcher_background};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
public void startNow(View view) {
ImageView iView = findViewById(R.id.image);
Animator animator = ObjectAnimator.ofInt(iView, "imageResource", drawableIDs);
animator.start();
}
И макет:
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/main_layout"
tools:context=".MainActivity">
<TextView
android:id="@+id/txt"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Hello World!"
android:layout_centerInParent="true"
/>
<ImageView
android:id="@+id/image"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@id/txt"
android:src="@android:drawable/btn_radio"/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Go!"
android:id="@+id/btn_go"
android:layout_alignParentBottom="true"
android:layout_centerHorizontal="true"
android:onClick="startNow"/>
</RelativeLayout>
И я получаю следующее исключение.
W/PropertyValuesHolder: Method getImageResource() with type null not found on target class class android.support.v7.widget.AppCompatImageView
I/Choreographer: Skipped 1207 frames! The application may be doing too much work on its main thread.
W/ResourceType: Failure getting entry for 0x01d5540e (t=212 e=21518) (error -2147483647)
D/AndroidRuntime: Shutting down VM
E/AndroidRuntime: FATAL EXCEPTION: main
Process: org.spoofer.animatortest, PID: 25686
**android.content.res.Resources$NotFoundException: Resource ID #0x1d5540e**
at android.content.res.ResourcesImpl.getValue(ResourcesImpl.java:204)
at android.content.res.Resources.getValue(Resources.java:1315)
at android.support.v7.widget.AppCompatDrawableManager.createDrawableIfNeeded(AppCompatDrawableManager.java:235)
at android.support.v7.widget.AppCompatDrawableManager.getDrawable(AppCompatDrawableManager.java:200)
at android.support.v7.widget.AppCompatDrawableManager.getDrawable(AppCompatDrawableManager.java:191)
at android.support.v7.content.res.AppCompatResources.getDrawable(AppCompatResources.java:102)
at android.support.v7.widget.AppCompatImageHelper.setImageResource(AppCompatImageHelper.java:86)
at android.support.v7.widget.AppCompatImageView.setImageResource(AppCompatImageView.java:94)
at android.animation.PropertyValuesHolder.nCallIntMethod(Native Method)
at android.animation.PropertyValuesHolder.-wrap7(Unknown Source:0)
at android.animation.PropertyValuesHolder$IntPropertyValuesHolder.setAnimatedValue(PropertyValuesHolder.java:1240)
at android.animation.ObjectAnimator.animateValue(ObjectAnimator.java:990)
at android.animation.ValueAnimator.animateBasedOnTime(ValueAnimator.java:1316)
at android.animation.ValueAnimator.doAnimationFrame(ValueAnimator.java:1446)
at android.animation.AnimationHandler.doAnimationFrame(AnimationHandler.java:146)
at android.animation.AnimationHandler.-wrap2(Unknown Source:0)
at android.animation.AnimationHandler$1.doFrame(AnimationHandler.java:54)
at android.view.Choreographer$CallbackRecord.run(Choreographer.java:964)
at android.view.Choreographer.doCallbacks(Choreographer.java:778)
at android.view.Choreographer.doFrame(Choreographer.java:710)
at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:952)
at android.os.Handler.handleCallback(Handler.java:789)
at android.os.Handler.dispatchMessage(Handler.java:98)
at android.os.Looper.loop(Looper.java:164)
at android.app.ActivityThread.main(ActivityThread.java:6798)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:767)
D/OSTracker: OS Event: crash
Disconnected from the target VM, address: 'localhost:8601', transport: 'socket'
Ресурс "# 0x1d5540e", который он не может найти, НЕ является идентификатором ресурса для рисованного набора в ObjectAnimator. Я понятия не имею, откуда этот идентификатор.
Странно, если я сделаю массив идентификаторов ресурсов больше единицы, он не выдаст исключение:
private final int[] drawableIDs = new int[]{R.drawable.ic_launcher_background, R.drawable.ic_launcher_foreground};
Обновление: Выдается только тогда, когда данный массив int имеет единственный элемент. Читая документы ObjectAnimator / ValueAnimator, я ожидаю, что он будет работать с одним значением, но, возможно, я ошибаюсь.
Есть идеи, что вызвало бы это?
Заранее спасибо