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代码实现)
先修改旋转动画,添加无限重复属性:
更新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>重写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
相关产品推荐
相关产品推荐

