You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

React Native启动屏ImageView无限旋转实现遇崩溃问题求助

问题:React Native启动屏ImageView无限旋转导致崩溃的解决方法

我用react-native-splash-screen实现了启动屏,功能正常。现在想给其中一个ImageView加无限旋转效果,试了下面的代码,但启动前应用持续崩溃,求可行的实现方法?


现有代码

res/anim/rotate.xml

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android" android:interpolator="@android:anim/cycle_interpolator">
    <rotate android:fromDegrees="0"
        android:toDegrees="360"
        android:pivotX="50%"
        android:pivotY="50%"
        android:duration="5000" />
</set>

res/layout/launch_screen.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout 
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="#fff">
    <ImageView        
    android:src="@drawable/launch_screen" 
    android:layout_width="fill_parent"
    android:layout_centerVertical="true"
    android:layout_height="140dp" />
    <ImageView
    android:id="@+id/imgvw"
    android:layout_alignParentBottom="true"
    android:layout_marginBottom="175dp"
    android:src="@drawable/loading" 
    android:layout_width="fill_parent"
    android:layout_centerVertical="true"
    android:layout_height="80dp" 
    />
    <ImageView        
    android:layout_alignParentBottom="true"
    android:src="@drawable/copyrights" 
    android:layout_width="fill_parent"
    android:layout_marginBottom="30dp"
    android:layout_height="20dp" />

</RelativeLayout> 

MainActivity.java

...// 其他导入

import android.view.animation.Animation;
import android.view.animation.AnimationUtils;
import android.widget.ImageView;

public class MainActivity extends ReactActivity {
 @Override
  protected ReactActivityDelegate createReactActivityDelegate() {
  SplashScreen.show(this);
    ImageView img = (ImageView)findViewById(R.id.imgvw);
    //Animation aniRotate = AnimationUtils.loadAnimation(getApplicationContext(),R.anim.rotate);
   // img.startAnimation(aniRotate);

   
    return new MainActivityDelegate(this, getMainComponentName());
  }

...// 默认应用代码

}

报错信息

java.lang.NullPointerException: Attempt to invoke virtual method 'android.content.pm.ApplicationInfo android.content.Context.getApplicationInfo()' on a null object

解决方法

崩溃核心原因是视图初始化时机错误:createReactActivityDelegate方法执行时,Activity的视图还未加载完成,调用findViewById会返回null,后续操作自然触发空指针异常。另外你的动画未设置无限重复,即使不崩溃也只会旋转一次。

方案1:调整动画启动时机(Java代码实现)

  1. 先修改旋转动画,添加无限重复属性:
    更新res/anim/rotate.xml,给<rotate>标签加上无限重复配置,同时替换插值器让旋转更流畅:

    <?xml version="1.0" encoding="utf-8"?>
    <set xmlns:android="http://schemas.android.com/apk/res/android">
        <rotate 
            android:fromDegrees="0"
            android:toDegrees="360"
            android:pivotX="50%"
            android:pivotY="50%"
            android:duration="5000"
            android:repeatCount="infinite"
            android:interpolator="@android:anim/linear_interpolator"/>
    </set>
    
  2. 重写Activity的onCreate方法,在正确时机启动动画:
    不要在createReactActivityDelegate里处理视图,移到onCreate中,确保视图已加载:

    ...// 其他导入
    
    import android.view.View;
    import android.view.animation.Animation;
    import android.view.animation.AnimationUtils;
    import android.widget.ImageView;
    
    public class MainActivity extends ReactActivity {
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            // 显示启动屏
            SplashScreen.show(this);
            // 获取启动屏根视图,再查找目标ImageView
            View splashRoot = getWindow().getDecorView().findViewById(android.R.id.content);
            ImageView rotateImg = splashRoot.findViewById(R.id.imgvw);
            if (rotateImg != null) {
                Animation rotateAnim = AnimationUtils.loadAnimation(this, R.anim.rotate);
                rotateImg.startAnimation(rotateAnim);
            }
        }
    
        @Override
        protected ReactActivityDelegate createReactActivityDelegate() {
            return new MainActivityDelegate(this, getMainComponentName());
        }
    
    ...// 默认应用代码
    
    }
    

方案2:布局直接绑定动画(更简单)

不需要编写Java代码,直接在launch_screen.xml的目标ImageView上绑定动画:

<ImageView
    android:id="@+id/imgvw"
    android:layout_alignParentBottom="true"
    android:layout_marginBottom="175dp"
    android:src="@drawable/loading" 
    android:layout_width="fill_parent"
    android:layout_centerVertical="true"
    android:layout_height="80dp"
    android:animation="@anim/rotate" />

系统会在视图加载完成后自动启动动画,无需手动调用。


内容的提问来源于stack exchange,提问作者ripouu

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 16:55:23