6

我今天想检查 iOS 和 Android 的 Lottie lib,我在 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();
    }
}
4

4 回答 4

10

我已将 id 属性更改为 android : id="@+id/animationView" 而不是 id="@+id/animationView" only ,错误消息变为 java.lang.IllegalStateException: Unable to find file indicator.json

正如您正确注意到的那样,首先您应该更改idandroid:id.

其次,从来源setAnimation(String)

从资产目录中的文件设置动画。

显然,您的目录中没有名为“indicator.json”的assets文件。

于 2017-03-31T15:08:17.243 回答
4

您必须创建一个原始资源目录,然后将“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();
    }
}

到:

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" />

到:

<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"/>

这些变化对我有用。

于 2020-07-11T14:30:36.603 回答
1

只需添加此行以编程方式更改动画。

// i have used data binding

binding.animationView.setAnimation(R.raw.paymentsuccess);
于 2021-03-31T07:26:15.670 回答
0

将版本更新为:

implementation 'com.airbnb.android:lottie:3.0.3'
于 2020-06-10T11:50:01.413 回答