适用版本(因为一些方法被高版本弃用或淘汰,可能效果不太好,以下版本验证可用):
android {
compileSdkVersion 28
buildToolsVersion '28.0.0'
defaultConfig {
applicationId "cn.ch**g.di***enge.livew***per"
minSdkVersion 16
targetSdkVersion 28
versionCode 1
versionName "1.0"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
}
一、先看加载页如下图(图片加了个黑框,方便看清效果)
二、AndroidManifest.xml清单文件中配置如下,改成首先进入加载页
<activity android:name=".activity.LoadActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity android:name=".activity.MainActivity">
</activity>
三、AndroidManifest.xml清单文件主题样式改成如下,(去除标题栏)
android:theme="@style/AppTheme"对应的样式文件
<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
<item name="android:windowNoTitle">true</item>
</style>
四、activity_load.xml布局文件如下,图片src改成你的
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center"
android:background="@mipmap/gradient_back"
tools:context="cn.cheng.dierrenge.livewallpaper.activity.LoadActivity">
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:adjustViewBounds="true"
android:scaleType="centerInside"
android:maxWidth="300dp"
android:src="@mipmap/load"
/>
</LinearLayout>
五、系统窗口UI工具类如下
import android.app.Activity;
import android.graphics.Color;
import android.os.Build;
import android.support.annotation.RequiresApi;
import android.view.View;
import android.view.Window;
import android.view.WindowManager;
/**
* Created by SecondPersonality on 2021/9/6.
*
* 系统UI工具类
*/
public class SysWindowUi {
/**
* noStateBarAndNavigationBar 为true时,隐藏系统状态栏和导航栏用于加载页,
* noStateBarAndNavigationBar 为false时,透明沉浸式系统状态栏和导航栏用于其他页面
* @param activity
* @param noStateBarAndNavigationBar
*/
@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP) // 跳过低版本没有此api的编译报错
public static void hideStatusNavigationBar(Activity activity, Boolean noStateBarAndNavigationBar) {
if (Build.VERSION.SDK_INT < 16) {
activity.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
WindowManager.LayoutParams.FLAG_FULLSCREEN);
} else {
if (Build.VERSION.SDK_INT >= 28) {
// 设置窗口占用刘海区
WindowManager.LayoutParams lp = activity.getWindow().getAttributes();
lp.layoutInDisplayCutoutMode = WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES;
activity.getWindow().setAttributes(lp);
}
int uiFlags =
// 稳定布局(当StatusBar和NavigationBar动态显示和隐藏时,系统为fitSystemWindow=true的view设置的padding大小都不会变化,所以view的内容的位置也不会发生移动。)
View.SYSTEM_UI_FLAG_LAYOUT_STABLE
// 主体内容占用系统导航栏的空间
| View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
// 沉浸式(避免某些用户交互造成系统自动清除全屏状态。)
| View.SYSTEM_UI_FLAG_IMMERSIVE;
if (!noStateBarAndNavigationBar) {
uiFlags = uiFlags
// 在不隐藏StatusBar状态栏的情况下,将view所在window的显示范围扩展到StatusBar下面
|View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
// 状态栏字体颜色设置为黑色这个是Android 6.0才出现的属性 默认是白色
| View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR;
} else {
// 隐藏导航栏
uiFlags |= View.SYSTEM_UI_FLAG_HIDE_NAVIGATION;
if (Build.VERSION.SDK_INT >= 28) {
// 隐藏状态栏
uiFlags |= View.SYSTEM_UI_FLAG_FULLSCREEN;
} else {
// 版本小于28不能设置占用刘海区,加载页布局使用白色背景,达到同样的效果
uiFlags = uiFlags
// 状态栏显示处于低能显示状态(low profile模式),状态栏上一些图标显示会被隐藏
|View.SYSTEM_UI_FLAG_LOW_PROFILE
// 在不隐藏StatusBar状态栏的情况下,将view所在window的显示范围扩展到StatusBar下面
|View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN;
}
}
activity.getWindow().getDecorView().setSystemUiVisibility(uiFlags);
//需要设置这个 flag 才能调用 setStatusBarColor 来设置状态栏颜色
activity.getWindow().addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
//将导航栏设置成透明色
activity.getWindow().setNavigationBarColor(Color.TRANSPARENT);
//将状态栏设置成透明色
activity.getWindow().setStatusBarColor(Color.TRANSPARENT);
}
}
}
六、LoadActivity.class加载页activity如下
import android.content.Intent;
import android.os.Build;
import android.os.Handler;
import android.support.annotation.RequiresApi;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import cn.cheng.dierrenge.livewallpaper.R;
import cn.cheng.dierrenge.livewallpaper.util.SysWindowUi;
/**
* Created by YanGeCheng on 2021/9/6.
*
* 加载页activity
*/
public class LoadActivity extends AppCompatActivity {
@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// 设置隐藏状态栏和导航栏
SysWindowUi.hideStatusNavigationBar(this, true);
setContentView(R.layout.activity_load);
//加载后跳转
new Handler().postDelayed(() -> {
jump();
},3000);
}
private void jump() {
Intent intent = new Intent();
intent.setClass(LoadActivity.this, MainActivity.class);
startActivity(intent);
this.finish();
}
}
以上就完成了一个完美隐藏系统状态栏和导航栏的加载页,接下来就可以开始愉快的安卓应用之旅!