Lottie动画setAnimation()方法会导致IllegalStateException异常。

7

今天我想要检查Lottie库在iOS和Android上的表现。我在After Effect中制作了一个简单的指示器动画并将其导出为.json文件,但它只能在iOS上正常运行。当我在Android上测试同一文件时,出现了以下错误:

java.lang.RuntimeException: Unable to start activity ComponentInfo{com.test.lottietest/com.test.lottietest.MainActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'void com.airbnb.lottie.LottieAnimationView.setAnimation(java.lang.String)' on a null object reference

这里是我的活动XML

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.mtids.lottietest.MainActivity">

    <view
        class="com.airbnb.lottie.LottieAnimationView"
        id="@+id/animationView"
        android:layout_centerHorizontal="true"
        android:layout_centerVertical="true"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />

    <Button
        android:id="@+id/button2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentStart="true"
        android:layout_alignParentTop="true"
        android:layout_marginStart="133dp"
        android:layout_marginTop="20dp"
        android:onClick="animate"
        android:text="animate" />
    
</RelativeLayout>

活动代码

public class MainActivity extends AppCompatActivity {
    LottieAnimationView anim;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        anim = (LottieAnimationView) findViewById(R.id.animationView);
        anim.setAnimation("indicator.json");
    }

    public void animate(View view) {
        anim.loop(true);
        anim.playAnimation();
    }
}

我相信应该是 View,而不是 view - Tim
我认为问题出在indicator.json文件路径上,如果有人之前使用过这个库,请问应该把.json文件放在哪里? - Mohammed Riyadh
@TimCastelijns,它是<view> - azizbekian
@azizbekian 是的,我的朋友。 - Mohammed Riyadh
这应该不是问题,但是尝试使用<com.airbnb.lottie.LottieAnimationView />而不是<view class="com.airbnb.lottie.LottieAnimationView>。同时尝试导航到LottieAnimationView - azizbekian
显示剩余4条评论
4个回答

10
正如您正确注意到的那样,首先您应该将id更改为android:id
其次,根据setAnimation(String)方法的源代码
设置来自资产目录中文件的动画。
显然,在assets目录中没有名为“indicator.json”的文件。

好的,就像我之前说的那样,问题出在 .json 文件中,它应该在 app/src/main/assets/ 下面,现在它已经可以工作了...谢谢 @azizbekian - Mohammed Riyadh

6

您需要创建一个原始资源目录,然后将“indicator.json”文件粘贴到该目录中。

更改:

public class MainActivity extends AppCompatActivity {
    LottieAnimationView anim;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        anim = (LottieAnimationView) findViewById(R.id.animationView);
        anim.setAnimation("indicator.json");
    }

    public void animate(View view) {
        anim.loop(true);
        anim.playAnimation();
    }
}

To:

public class MainActivity extends AppCompatActivity {
    LottieAnimationView anim;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        anim = (LottieAnimationView) findViewById(R.id.animationView);
        anim.setAnimation(R.raw.indicator);
    }

    public void animate(View view) {
        anim.loop(true);
        anim.playAnimation();
    }
}

在XML文件中:
更改为:
<view
        class="com.airbnb.lottie.LottieAnimationView"
        id="@+id/animationView"
        android:layout_centerHorizontal="true"
        android:layout_centerVertical="true"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />

To:

<com.airbnb.lottie.LottieAnimationView
        android:id="@+id/animationView"
        android:layout_centerHorizontal="true"
        android:layout_centerVertical="true"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"/>

这些变化对我有用。


2

只需添加这一行代码,即可通过程序更改动画效果。

// i have used data binding

binding.animationView.setAnimation(R.raw.paymentsuccess);

0

更新版本至:

implementation 'com.airbnb.android:lottie:3.0.3'

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接