Android 棒棒糖上的完全透明状态栏和导航栏
我正在尝试制作一个安卓启动器。我想实现一个完全透明的状态栏和导航栏,这里是我的主题xml文件Android 棒棒糖上的完全透明状态栏和导航栏,android,android-5.0-lollipop,Android,Android 5.0 Lollipop,我正在尝试制作一个安卓启动器。我想实现一个完全透明的状态栏和导航栏,这里是我的主题xml文件 <resources> <style name="Theme" parent="android:Theme.Material.Wallpaper.NoTitleBar"> <item name="android:statusBarColor">@android:color/transparent</item> <
<resources>
<style name="Theme" parent="android:Theme.Material.Wallpaper.NoTitleBar">
<item name="android:statusBarColor">@android:color/transparent</item>
<item name="android:navigationBarColor">@android:color/transparent</item>
<item name="android:windowTranslucentStatus">false</item>
<item name="android:windowTranslucentNavigation">false</item>
</style>
</resources>
@android:彩色/透明
@android:彩色/透明
假的
假的
最后两项不起作用,棒棒糖上还有阴影
这就是它的外观(注意,状态栏和导航栏上实际上有一个阴影):
我想要实现的目标(nova launcher):
如何使状态栏和导航栏“透明”而不是“半透明”?您需要向主题添加
android:windowdrawsystembarbackgrounds
标志
<item name="android:windowDrawsSystemBarBackgrounds">true</item>
更新
通过在窗口
内设置标志(FLAG\u LAYOUT\u NO\u LIMITS
标志),您可以通过编程方式在KitKat及其后实现相同的效果
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
Window w = getWindow(); // in Activity's onCreate() for instance
w.setFlags(WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS, WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS);
}
如果将背景资源(如颜色或图片)设置为布局,您将在状态栏的“下方”看到颜色或图片
<item name="android:windowDrawsSystemBarBackgrounds">true</item>
<item name="android:statusBarColor">@color/primary_dark</item>
此外,透明活动/容器布局需要此属性集:
android:fitsSystemWindows="true"
[来源][1]
[1]: https://stackoverflow.com/a/29311321/1549700以下代码是我在项目中使用的示例: styles.xml
<style name="FadingActionBarTheme" parent="@android:style/Theme.Holo.Light.DarkActionBar">
<item name="android:actionBarStyle">@style/FadingActionBarWidget</item>
</style>
<style name="FadingActionBarWidget.Transparent">
<item name="android:background">@android:color/transparent</item>
</style>
<style name="FadingActionBarTheme.TranslucentActionBar">
<item name="android:icon">@drawable/ic_ab_icon</item>
<item name="android:actionBarStyle">@style/FadingActionBarWidget.Transparent</item>
<item name="android:windowActionBarOverlay">true</item>
<item name="android:windowContentOverlay">@null</item>
</style>
<item name="android:windowTranslucentStatus">true</item>
<item name="android:windowDrawsSystemBarBackgrounds">true</item>
<item name="android:statusBarColor">@color/colorPrimaryDark</item>
<style name="LockScreenStyle" parent="@android:style/Theme.Wallpaper.NoTitleBar">
<item name="android:windowTranslucentStatus" tools:targetApi="kitkat">true</item>
<item name="android:windowTranslucentNavigation" tools:targetApi="kitkat">true</item>
</style>
@style/FadingActionBarWidget
@android:彩色/透明
@可绘图/ic_ab_图标
@style/FadingActionBarWidget.Transparent
真的
@空的
AndroidManifest.xml
<activity
android:name=".MyActivity"
android:label="@string/app_name"
android:theme="@style/FadingActionBarTheme.TranslucentActionBar">
</activity>
我之所以使用它,是因为它保持了状态栏和导航栏的高度
<!-- Base application theme. -->
<style name="theme" parent="android:Theme.Material.Wallpaper.NoTitleBar">
<item name="android:navigationBarColor">#00000000</item>
<item name="android:statusBarColor">#00000000</item>
</style>
#00000000
#00000000
但这确实需要API 21+才能在状态栏下绘制布局: values/styles.xml
<style name="FadingActionBarTheme" parent="@android:style/Theme.Holo.Light.DarkActionBar">
<item name="android:actionBarStyle">@style/FadingActionBarWidget</item>
</style>
<style name="FadingActionBarWidget.Transparent">
<item name="android:background">@android:color/transparent</item>
</style>
<style name="FadingActionBarTheme.TranslucentActionBar">
<item name="android:icon">@drawable/ic_ab_icon</item>
<item name="android:actionBarStyle">@style/FadingActionBarWidget.Transparent</item>
<item name="android:windowActionBarOverlay">true</item>
<item name="android:windowContentOverlay">@null</item>
</style>
<item name="android:windowTranslucentStatus">true</item>
<item name="android:windowDrawsSystemBarBackgrounds">true</item>
<item name="android:statusBarColor">@color/colorPrimaryDark</item>
<style name="LockScreenStyle" parent="@android:style/Theme.Wallpaper.NoTitleBar">
<item name="android:windowTranslucentStatus" tools:targetApi="kitkat">true</item>
<item name="android:windowTranslucentNavigation" tools:targetApi="kitkat">true</item>
</style>
true
values-v21/styles.xml
<style name="FadingActionBarTheme" parent="@android:style/Theme.Holo.Light.DarkActionBar">
<item name="android:actionBarStyle">@style/FadingActionBarWidget</item>
</style>
<style name="FadingActionBarWidget.Transparent">
<item name="android:background">@android:color/transparent</item>
</style>
<style name="FadingActionBarTheme.TranslucentActionBar">
<item name="android:icon">@drawable/ic_ab_icon</item>
<item name="android:actionBarStyle">@style/FadingActionBarWidget.Transparent</item>
<item name="android:windowActionBarOverlay">true</item>
<item name="android:windowContentOverlay">@null</item>
</style>
<item name="android:windowTranslucentStatus">true</item>
<item name="android:windowDrawsSystemBarBackgrounds">true</item>
<item name="android:statusBarColor">@color/colorPrimaryDark</item>
<style name="LockScreenStyle" parent="@android:style/Theme.Wallpaper.NoTitleBar">
<item name="android:windowTranslucentStatus" tools:targetApi="kitkat">true</item>
<item name="android:windowTranslucentNavigation" tools:targetApi="kitkat">true</item>
</style>
true
@颜色/原色暗
使用已处理fitsSystemWindows参数的CoordinatorLayout/DrawerLayout,或创建自己的布局,如下所示:
public class FitsSystemWindowConstraintLayout extends ConstraintLayout {
private Drawable mStatusBarBackground;
private boolean mDrawStatusBarBackground;
private WindowInsetsCompat mLastInsets;
private Map<View, int[]> childsMargins = new HashMap<>();
public FitsSystemWindowConstraintLayout(Context context) {
this(context, null);
}
public FitsSystemWindowConstraintLayout(Context context, AttributeSet attrs) {
this(context, attrs, 0);
}
public FitsSystemWindowConstraintLayout(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
if (ViewCompat.getFitsSystemWindows(this)) {
ViewCompat.setOnApplyWindowInsetsListener(this, new android.support.v4.view.OnApplyWindowInsetsListener() {
@Override
public WindowInsetsCompat onApplyWindowInsets(View view, WindowInsetsCompat insets) {
FitsSystemWindowConstraintLayout layout = (FitsSystemWindowConstraintLayout) view;
layout.setChildInsets(insets, insets.getSystemWindowInsetTop() > 0);
return insets.consumeSystemWindowInsets();
}
});
setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_STABLE
| View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN);
TypedArray typedArray = context.obtainStyledAttributes(new int[]{android.R.attr.colorPrimaryDark});
try {
mStatusBarBackground = typedArray.getDrawable(0);
} finally {
typedArray.recycle();
}
} else {
mStatusBarBackground = null;
}
}
public void setChildInsets(WindowInsetsCompat insets, boolean draw) {
mLastInsets = insets;
mDrawStatusBarBackground = draw;
setWillNotDraw(!draw && getBackground() == null);
for (int i = 0; i < getChildCount(); i++) {
View child = getChildAt(i);
if (child.getVisibility() != GONE) {
if (ViewCompat.getFitsSystemWindows(this)) {
ConstraintLayout.LayoutParams layoutParams = (ConstraintLayout.LayoutParams) child.getLayoutParams();
if (ViewCompat.getFitsSystemWindows(child)) {
ViewCompat.dispatchApplyWindowInsets(child, insets);
} else {
int[] childMargins = childsMargins.get(child);
if (childMargins == null) {
childMargins = new int[]{layoutParams.leftMargin, layoutParams.topMargin, layoutParams.rightMargin, layoutParams.bottomMargin};
childsMargins.put(child, childMargins);
}
if (layoutParams.leftToLeft == LayoutParams.PARENT_ID) {
layoutParams.leftMargin = childMargins[0] + insets.getSystemWindowInsetLeft();
}
if (layoutParams.topToTop == LayoutParams.PARENT_ID) {
layoutParams.topMargin = childMargins[1] + insets.getSystemWindowInsetTop();
}
if (layoutParams.rightToRight == LayoutParams.PARENT_ID) {
layoutParams.rightMargin = childMargins[2] + insets.getSystemWindowInsetRight();
}
if (layoutParams.bottomToBottom == LayoutParams.PARENT_ID) {
layoutParams.bottomMargin = childMargins[3] + insets.getSystemWindowInsetBottom();
}
}
}
}
}
requestLayout();
}
public void setStatusBarBackground(Drawable bg) {
mStatusBarBackground = bg;
invalidate();
}
public Drawable getStatusBarBackgroundDrawable() {
return mStatusBarBackground;
}
public void setStatusBarBackground(int resId) {
mStatusBarBackground = resId != 0 ? ContextCompat.getDrawable(getContext(), resId) : null;
invalidate();
}
public void setStatusBarBackgroundColor(@ColorInt int color) {
mStatusBarBackground = new ColorDrawable(color);
invalidate();
}
@Override
public void onDraw(Canvas canvas) {
super.onDraw(canvas);
if (mDrawStatusBarBackground && mStatusBarBackground != null) {
int inset = mLastInsets != null ? mLastInsets.getSystemWindowInsetTop() : 0;
if (inset > 0) {
mStatusBarBackground.setBounds(0, 0, getWidth(), inset);
mStatusBarBackground.draw(canvas);
}
}
}
}
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:android="http://schemas.android.com/apk/res/android">
<!-- theme to use FOR launch screen-->
<style name="LaunchScreenThemeBase" parent="Theme.AppCompat.Light.NoActionBar">
<item name="toolbarStyle">@style/NativeScriptToolbarStyle</item>
<item name="colorPrimary">@color/ns_primary</item>
<item name="colorPrimaryDark">@color/ns_primaryDark</item>
<item name="colorAccent">@color/ns_accent</item>
<item name="android:windowBackground">@drawable/splash_screen</item>
<item name="android:statusBarColor">@color/transparent</item>
</style>
<style name="LaunchScreenTheme" parent="LaunchScreenThemeBase"></style>
<!-- theme to use AFTER launch screen is loaded-->
<style name="AppThemeBase" parent="Theme.AppCompat.Light.NoActionBar">
<item name="toolbarStyle">@style/NativeScriptToolbarStyle</item>
<item name="colorPrimary">@color/ns_primary</item>
<item name="colorPrimaryDark">@color/ns_primaryDark</item>
<item name="colorAccent">@color/ns_accent</item>
<item name="android:statusBarColor">@color/transparent</item>
<item name="android:navigationBarColor">@color/transparent</item>
<item name="android:windowDrawsSystemBarBackgrounds">true</item>
<item name="android:windowTranslucentNavigation">false</item>
</style>
<style name="AppTheme" parent="AppThemeBase"></style>
<!-- theme for action-bar -->
<style name="NativeScriptToolbarStyleBase" parent="Widget.AppCompat.Toolbar">
<item name="android:background">@color/transparent</item>
<item name="theme">@color/transparent</item>
<item name="popupTheme">@color/transparent</item>
</style>
<style name="NativeScriptToolbarStyle" parent="NativeScriptToolbarStyleBase"></style>
公共类FitsSystemWindowConstraintLayout扩展了ConstraintLayout{
私人可牵引mStatusBarBackground;
私有布尔mDrawStatusBarBackground;
私有WindowInsetCompat mLastInsets;
私有映射childsMargins=newhashmap();
公用设施SystemWindowConstraintLayout(上下文){
这个(上下文,空);
}
公用设施SystemWindowConstraintLayout(上下文、属性集属性){
这(上下文,属性,0);
}
public FitsSystemWindowConstraintLayout(上下文上下文、属性集属性、int defStyleAttr){
super(上下文、attrs、defStyleAttr);
if(ViewCompat.getFitsSystemWindows(此)){
ViewCompat.setOnApplyWindowInsertsListener(这是新的android.support.v4.view.OnApplyWindowInsertsListener(){
@凌驾
公共窗口插图Compat on应用窗口插图(视图视图,窗口插图Compat插图){
FitsSystemWindowConstraintLayout布局=(FitsSystemWindowConstraintLayout)视图;
layout.setChildInsets(insets,insets.getSystemWindowInsetTop()>0);
返回insets.consumerSystemWindowInsets();
}
});
设置系统兼容性(View.SYSTEM\u UI\u FLAG\u LAYOUT\u STABLE
|视图。系统(用户界面、标志、布局、全屏);
TypedArray TypedArray=context.obtainStyledAttributes(新int[]{android.R.attr.colorPrimaryDark});
试一试{
mStatusBarBackground=typedArray.getDrawable(0);
}最后{
typedArray.recycle();
}
}否则{
mStatusBarBackground=null;
}
}
公共void setChildInsets(WindowInsetCompat insets,布尔绘制){
mLastInsets=插入;
mDrawStatusBarBackground=绘制;
setWillNotDraw(!draw&&getBackground()==null);
对于(int i=0;i <activity
android:name="com.MyActivity"
android:configChanges="orientation|keyboardHidden|screenSize"
android:screenOrientation="fullSensor"
android:theme="@style/MyAppTheme" />
window.decorView.systemUiVisibility = View.SYSTEM_UI_FLAG_LAYOUT_STABLE or View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
android:fitsSystemWindows="true"
<style name="Your.Theme">
<item name="android:navigationBarColor">@android:color/transparent</item>
<item name="android:enforceNavigationBarContrast">false</item>
</style>
import { platformNativeScriptDynamic } from "@nativescript/angular";
import { AppModule } from "./app/app.module";
import * as application from "tns-core-modules/application";
import { Color } from "@nativescript/core";
platformNativeScriptDynamic().bootstrapModule(AppModule);
declare var android;
application.android.on(application.AndroidApplication.activityCreatedEvent, (event) => {
const activity = event.activity;
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.LOLLIPOP) {
activity.getWindow().addFlags(android.view.WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
activity.getWindow().clearFlags(android.view.WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
activity.getWindow().addFlags(android.view.WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION);
activity.getWindow().setStatusBarColor(android.graphics.Color.TRANSPARENT);
activity.getWindow().setNavigationBarColor(android.graphics.Color.TRANSPARENT);
} else {
activity.getWindow().addFlags(android.view.WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
activity.getWindow().setNavigationBarColor(android.graphics.Color.TRANSPARENT);
}
const parent = activity.findViewById(android.R.id.content);
for (let i = 0; i < parent.getChildCount(); i++) {
const childView = parent.getChildAt(i);
if (childView instanceof android.view.ViewGroup) {
childView.setFitsSystemWindows(true);
childView.setClipToPadding(true);
}
}
});
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:android="http://schemas.android.com/apk/res/android">
<!-- theme to use FOR launch screen-->
<style name="LaunchScreenThemeBase" parent="Theme.AppCompat.Light.NoActionBar">
<item name="toolbarStyle">@style/NativeScriptToolbarStyle</item>
<item name="colorPrimary">@color/ns_primary</item>
<item name="colorPrimaryDark">@color/ns_primaryDark</item>
<item name="colorAccent">@color/ns_accent</item>
<item name="android:windowBackground">@drawable/splash_screen</item>
<item name="android:statusBarColor">@color/transparent</item>
</style>
<style name="LaunchScreenTheme" parent="LaunchScreenThemeBase"></style>
<!-- theme to use AFTER launch screen is loaded-->
<style name="AppThemeBase" parent="Theme.AppCompat.Light.NoActionBar">
<item name="toolbarStyle">@style/NativeScriptToolbarStyle</item>
<item name="colorPrimary">@color/ns_primary</item>
<item name="colorPrimaryDark">@color/ns_primaryDark</item>
<item name="colorAccent">@color/ns_accent</item>
<item name="android:statusBarColor">@color/transparent</item>
<item name="android:navigationBarColor">@color/transparent</item>
<item name="android:windowDrawsSystemBarBackgrounds">true</item>
<item name="android:windowTranslucentNavigation">false</item>
</style>
<style name="AppTheme" parent="AppThemeBase"></style>
<!-- theme for action-bar -->
<style name="NativeScriptToolbarStyleBase" parent="Widget.AppCompat.Toolbar">
<item name="android:background">@color/transparent</item>
<item name="theme">@color/transparent</item>
<item name="popupTheme">@color/transparent</item>
</style>
<style name="NativeScriptToolbarStyle" parent="NativeScriptToolbarStyleBase"></style>