最近在做毕业设计,想要实现沉浸式状态栏,在网上搜索了好多的文章后拼拼凑凑,才实现了这个功能。也算是第一次做Android开发,所以写个文章纪念一下,并且分享给大家。
Android 10 ,Flyme8.0,MEIZU 17 pro。
理论上应该支持所有的Android 6.0 以上的系统。
在color.xml文件中首先设置一个透明的颜色以及你所需要的状态栏颜色。
这样的操作可以方便你以后对状态栏颜色进行修改,就像修改变量一样就可以改变所有的该颜色。
color.xml
<resources>
<color name="flesh">#F1E8D9color>
<color name="flesh_black">#F8E4C2color>
<color name="white">#FFFFFFcolor>
<color name="black">#000000color>
<color name="transparent">#00FFFFFFcolor>
<color name="tea_green">#7CB342color>
<color name="tea_green_black">#43A047color>
<color name="app_bg_color">@color/fleshcolor>
<color name="app_text_color">@color/blackcolor>
<color name="topBar_color">@color/flesh_blackcolor>
<color name="statusBar_color">@color/flesh_blackcolor>
<color name="tab_bg_color">@color/tea_greencolor>
<color name="tab_bg_onclick_color">@color/tea_green_blackcolor>
<color name="tab_text_color">@color/whitecolor>
resources>
首先先让Activity填满屏幕。
在style.xml中的要修改的Activity的主题中添加如下代码。
<item name="android:windowTranslucentStatus">falseitem>
<item name="android:windowTranslucentNavigation">trueitem>
添加后的代码如下:
style.xml
<style name="TabTheme_NoActionBar" parent="Theme.AppCompat.Light.NoActionBar">
- "android:background"
>@color/app_bg_color
- "android:textColor">@color/app_text_color
tools:targetApi="m">true-->
- "android:windowTranslucentStatus">false
- "android:windowTranslucentNavigation">true
style>
效果如下图。我们还需要使状态栏变为透明。
再在style.xml中添加对状态栏透明化的代码,
#00FFFFFF是透明的颜色参数,如果你需要修改为其他的颜色,可以自行修改。
<item name="android:statusBarColor" tools:targetApi="lollipop">#00FFFFFFitem>
style.xml
<style name="TabTheme_NoActionBar" parent="Theme.AppCompat.Light.NoActionBar">
- "android:background"
>@color/app_bg_color
- "android:textColor">@color/app_text_color
- "android:statusBarColor" tools:targetApi="lollipop">#00FFFFFF
- "android:windowTranslucentStatus">false
- "android:windowTranslucentNavigation">true
style>
效果如下图
我们发现还需要调整界面的Padding,使它能将状态栏的位置空出来。
需要在Activity的class文件中。
使用setPadding(int left, int top, int right, int bottom)方法限制Activity的位置。
通过getStatusBarHeight方法获取状态栏的高度,然后对Activity进行限制。
//设置relativeLayout的padding
findViewById(R.id.relativeLayout)
.setPadding(0, getStatusBarHeight(), 0, 0);
//将这段代码添加到class的onCreate方法中
//获取状态栏高度
public int getStatusBarHeight() {
int result = 0;
//获取状态栏高度的资源id
int resourceId = getResources().getIdentifier("status_bar_height", "dimen", "android");
if (resourceId > 0) {
result = getResources().getDimensionPixelSize(resourceId);
}
return result;
}
Activity.class
public class MainActivity extends TabActivity {
//MainActivity初始化方法
@RequiresApi(api = Build.VERSION_CODES.M)
@Override
protected void onCreate(Bundle savedInstanceState) {
//初始化页面
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//设置relativeLayout的padding
findViewById(R.id.relativeLayout)
.setPadding(0, getStatusBarHeight(), 0, 0);
}
//获取状态栏高度
public int getStatusBarHeight() {
int result = 0;
//获取状态栏高度的资源id
int resourceId = getResources().getIdentifier("status_bar_height", "dimen", "android");
if (resourceId > 0) {
result = getResources().getDimensionPixelSize(resourceId);
}
return result;
}
}
效果如下图
如果程序的背景颜色是浅色系,诸如我的程序一样。
你可以再对状态栏文字的颜色进行修改。
以下的代码相当于告诉系统:我的状态栏是浅色的,请把文字改为黑色。
<item name="android:windowLightStatusBar" tools:targetApi="m">trueitem>
修改后的style.xml文件
style.xml
<style name="TabTheme_NoActionBar" parent="Theme.AppCompat.Light.NoActionBar">
- "android:background"
>@color/app_bg_color
- "android:textColor">@color/app_text_color
- "android:statusBarColor" tools:targetApi="lollipop">#00FFFFFF
- "android:windowLightStatusBar" tools:targetApi="m">true
- "android:windowTranslucentStatus">false
- "android:windowTranslucentNavigation">true
style>
效果如下图
这样我们就实现了无填充的透明的状态栏。
如果你的程序不像我一样顶部有其他颜色的部件,那么你的沉浸式状态栏就完成了。
但是这样的界面对我来说还不是满意的。 我还需要将状态状态栏下进行填充来改变上方的颜色。
这个需求我是填充TextView进行实现。
https://blog.csdn.net/sinat_38184748/article/details/96827134 android 在LinearLayout中动态添加View BY YD-10-NG
addView(View child) // child-被添加的View
addView(View child, int index) // index-被添加的View的索引
addView(View child, int width, int height) // width,height被添加的View指定的宽高
addView(View view, ViewGroup.LayoutParams params) // params被添加的View指定的布局参数
addView(View child, int index, LayoutParams params)
首先对TextView类继承,然后将其修改为我们所需要的填充物。
TopBar_TextView.java
//TopBar_TextView.java
import android.annotation.SuppressLint;
import android.content.Context;
import android.graphics.drawable.Drawable;
import android.view.ViewGroup;
public class TopBar_TextView extends androidx.appcompat.widget.AppCompatTextView {
//初始化方法
@SuppressLint({
"ResourceAsColor", "UseCompatLoadingForDrawables"})
public TopBar_TextView(Context context, Drawable drawable) {
super(context);
this.setBackgroundDrawable(drawable);//设置填充物颜色
this.setHeight(getStatusBarHeight());//设置填充物高度,等于状态栏高度
this.setWidth(ViewGroup.LayoutParams.MATCH_PARENT);//设置填充物宽度为状态栏宽度
}
//获取状态栏高度
public int getStatusBarHeight() {
int result = 0;
//获取状态栏高度的资源id
int resourceId = getResources().getIdentifier("status_bar_height", "dimen", "android");
if (resourceId > 0) {
result = getResources().getDimensionPixelSize(resourceId);
}
return result;
}
}
TeaControlActivity.class
import android.annotation.SuppressLint;
import android.app.ActionBar;
import android.app.Activity;
import android.graphics.drawable.Drawable;
import android.os.Bundle;
import android.widget.LinearLayout;
import android.widget.TextView;
import androidx.annotation.Nullable;
public class TeaControlActivity extends Activity {
private LinearLayout linearLayout;
private int top = 0;//置顶
Drawable drawable;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.tea_control);
//状态栏遮挡物的颜色
drawable = getResources().getDrawable(R.color.statusBar_color);
//添加状态栏遮挡
linearLayout = findViewById(R.id.LinearLayout_control);
linearLayout.addView(new TopBar_TextView(TeaControlActivity.this,drawable), top);
}
}
效果如下图
Android开发新手一个。
如有错误请大家指正。
如有疑问,请留言,我会尽力为大家解答。