React Native学习

RN 安卓启动图告别白屏

2020-06-06  本文已影响0人  星星编程

目录
一、前言
二、添加启动图
三、启动图属性
四、启动图布局
五、核心代码
六、 MainActivity
七、结束语

一、前言

最近流行摆地摊,同事半开玩笑地说,疫情下IT行业不景气,咱们一起摆地摊卖编程葵花宝典去吧,肯定大赚一笔。说实在的现在各行各业都不太好,倒闭的公司好多,这个时候我们只有不断地提高自己的技术水平,让自己成为IT行业的佼佼者。闲话不多说了,接下来给安卓小白带来启动页的适配,ReactNative和安卓原生都适用。

二、添加启动图

在res->mipmap下添加适配各种手机的启动图,图片名字叫launch。

三、启动图属性

在res->values->styles.xml中添加如下代码。

<resources>
    <!-- Base application theme. -->
    <style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
        <!-- Customize your theme here. -->
        <item name="android:windowIsTranslucent">true</item>
        <item name="android:textColor">#000000</item>
    </style>
 
    <style name="SplashScreen_SplashAnimation">
        <item name="android:windowExitAnimation">@android:anim/fade_out</item>
    </style>

    <style name="SplashScreen_SplashTheme" parent="Theme.AppCompat.NoActionBar">
        <item name="android:windowAnimationStyle">@style/SplashScreen_SplashAnimation</item>
    </style>
    <style name="SplashScreen_Fullscreen" parent="SplashScreen_SplashTheme">
        <item name="android:windowFullscreen">true</item>
    </style>
</resources>

四、启动图布局

在res->layout->launch_screen.xml中添加如下代码。

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical" android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@mipmap/launch">
</LinearLayout>

五、核心代码

由于RN默认启动的页面是MainActivity,如果修改启动Activity会出现无法启动的错误。这里利用Dialog在MainActivity弹出,5秒后再关闭实现的启动图效果。如果有更好的方法,欢迎留言,谢谢。

package com.wisdomanyun;
import android.app.Activity;
import android.app.Dialog;
import android.os.Build;
import java.lang.ref.WeakReference;
 
/**
 * 启动屏
 */
public class SplashScreen {
    private static Dialog mSplashDialog;
    private static WeakReference<Activity> mActivity;
    /**
     * 打开启动屏
     */
    public static void show(final Activity activity, final int themeResId) {
        if (activity == null) return;
        mActivity = new WeakReference<Activity>(activity);
        activity.runOnUiThread(new Runnable() {
            @Override
            public void run() {
                if (!activity.isFinishing()) {
                    mSplashDialog = new Dialog(activity, themeResId);
                    mSplashDialog.setContentView(R.layout.launch_screen);
                    mSplashDialog.setCancelable(false);
                    if (!mSplashDialog.isShowing()) {
                        mSplashDialog.show();
                    }
                }
            }
        });
    }

    /**
     * 打开启动屏
     */
    public static void show(final Activity activity, final boolean fullScreen) {
        int resourceId = fullScreen ? R.style.SplashScreen_Fullscreen : R.style.SplashScreen_SplashTheme;
        show(activity, resourceId);
    }

    /**
     * 打开启动屏
     */
    public static void show(final Activity activity) {
        show(activity, false);
    }

    /**
     * 关闭启动屏
     */
    public static void hide(Activity activity) {
        if (activity == null) {
            if (mActivity == null) {
                return;
            }
            activity = mActivity.get();
        }

        if (activity == null) return;
        final Activity _activity = activity;
        _activity.runOnUiThread(new Runnable() {
            @Override
            public void run() {
                if (mSplashDialog != null && mSplashDialog.isShowing()) {
                    boolean isDestroyed = false;
                    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
                        isDestroyed = _activity.isDestroyed();
                    }
                    if (!_activity.isFinishing() && !isDestroyed) {
                        mSplashDialog.dismiss();
                    }
                    mSplashDialog = null;
                }
            }
        });
    }
}

六、 MainActivity

package com.wisdomanyun;
import android.app.Activity;
import android.os.Bundle;
import com.facebook.react.ReactActivity;

public class MainActivity extends ReactActivity {
  /**
   * Returns the name of the main component registered from JavaScript. This is used to schedule
   * rendering of the component.
   */
  @Override
  protected String getMainComponentName() {
    return "WisdomAnYun";
  }

  @Override
  protected void onCreate(Bundle savedInstanceState) {
    SplashScreen.show(this);  // 打开启动图
    final Activity activity = this;
    Thread myThread = new Thread() {//创建子线程
      @Override
      public void run() {
        try {
          sleep(5000);//使程序休眠五秒
          SplashScreen.hide(activity);//关闭启动图
        } catch (Exception e) {
          e.printStackTrace();
        }
      }
    };
    myThread.start();//启动线程
    super.onCreate(savedInstanceState);
  }
}

七、 结束语

做iOS开发已经快5年了,一直在小厂前线战斗,都是打一些局部战争,整体布局和架构什么的都是使用大厂的,一直困于业务逻辑的实现, 想挣脱出来,却越陷越深,我自己都没有想到自己学习RN开发后,竟然会搞起安卓来。建议大家还是去大厂比较好,可以搞一下架构,或者研究某一块东西,这样会比较深入,就不会一直停留在应用层面,出现个问题,除了百度还可以阅读源码,知道问题真正出现哪里,最终把bug都消灭掉,这才是我们技术员该追求的。

关注公众号,查看更多内容.jpg
上一篇下一篇

猜你喜欢

热点阅读