【问题标题】:ObjectAnimator generate NotFoundExceptionObjectAnimator 生成 NotFoundException
【发布时间】:2018-11-19 19:00:18
【问题描述】:

我正在编写一个应用程序,该应用程序通过 ObjectAnimator 设置一组可绘制资源 ID 来为各种 ImageView 设置动画。

这是我为突出问题而提取的示例代码:

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 上可绘制集的资源 ID。我不知道这个 ID 是从哪里来的。

奇怪的是,如果我让资源 IDs 数组大于一,它不会抛出异常:

 private final int[] drawableIDs = new int[]{R.drawable.ic_launcher_background, R.drawable.ic_launcher_foreground};

更新:仅当给定的 int 数组只有一个元素时才会抛出。阅读 ObjectAnimator/ValueAnimator 文档,我希望它可以使用一个值,但也许我错了。

有什么想法会导致这种情况吗?

提前致谢

【问题讨论】:

  • 奇怪的是,如果我让资源 IDs 数组大于一,它不会抛出异常: private final int[] drawableIDs = new int[]{R.drawable.ic_launcher_background, R.drawable .ic_launcher_foreground};
  • 更新:仅当给定的 int 数组具有单个元素时才抛出它。阅读 ObjectAnimator/ValueAnimator 文档,我希望它可以使用一个值,但也许我错了。

标签: android objectanimator


【解决方案1】:

这是因为imageView 没有用于 imageResource 的公共 getter。您可以尝试使用 drawable 数组来代替,并使用 drawable 作为动画属性。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-11-07
    • 1970-01-01
    • 2015-12-07
    • 2012-05-26
    • 1970-01-01
    • 2016-07-15
    • 2017-05-12
    相关资源
    最近更新 更多