Android 棒棒糖:在状态栏后面绘制,其颜色设置为透明
我已将我的状态栏颜色设置为透明,仅用于棒棒糖,主题中有以下行:Android 棒棒糖:在状态栏后面绘制,其颜色设置为透明,android,android-ui,android-5.0-lollipop,Android,Android Ui,Android 5.0 Lollipop,我已将我的状态栏颜色设置为透明,仅用于棒棒糖,主题中有以下行: <item name="android:statusBarColor">@android:color/transparent</item> @android:color/transparent 现在我需要在它后面画,但我不能在它后面画任何视图。我知道如何使用windowTranslucentStatus属性,但不想使用此属性,因为它会忽略状态栏设置为透明的颜色。您可以使用ScrimInsetFrameLa
<item name="android:statusBarColor">@android:color/transparent</item>
@android:color/transparent
现在我需要在它后面画,但我不能在它后面画任何视图。我知道如何使用
windowTranslucentStatus
属性,但不想使用此属性,因为它会忽略状态栏设置为透明的颜色。您可以使用ScrimInsetFrameLayout
android:fitsSystemWindows=“true”应设置在scrim布局上 而不是
<item name="android:statusBarColor">@android:color/transparent</item>
@android:color/transparent
使用以下命令:
<item name="android:windowTranslucentStatus">true</item>
true
并确保删除“MainActivity”布局上的顶部填充(默认情况下添加)
请注意,这不会使状态栏完全透明,并且状态栏上仍会有一个“褪色的黑色”覆盖 方法#1:
<?xml version="1.0" encoding="UTF-8" ?>
<resources>
<style name="MyStyle" parent="@style/Theme.AppCompat.Light.NoActionBar">
<item name="android:windowTranslucentStatus">true</item>
</style>
</resources>
<?xml version="1.0" encoding="UTF-8" ?>
<resources>
<style name="MyStyle" parent="@style/Theme.AppCompat.Light.NoActionBar">
<item name="android:statusBarColor">@android:color/transparent</item>
</style>
</resources>
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android" android:versionCode="1" android:versionName="1.0" package="com.agn.test.test">
<uses-sdk android:minSdkVersion="10" />
<application android:allowBackup="true" android:icon="@mipmap/icon" android:label="@string/app_name" android:theme="@style/MyStyle">
</application>
</manifest>
要实现完全透明的状态栏,必须使用仅在API 21及更高版本上可用的statusBarColor
<代码>窗口半透明状态在API 19及更高版本上可用,但它为状态栏添加了着色背景。但是,设置windowTranslucentStatus
确实实现了将statusBarColor
更改为transparent所不能实现的一件事:它设置了SYSTEM\u UI\u FLAG\u LAYOUT\u STABLE
和SYSTEM\u UI\u FLAG\u LAYOUT\u全屏flags。获得相同效果的最简单方法是手动设置这些标志,这将有效地禁用Android布局系统强加的插入,并让您自己负责
在onCreate
方法中调用此行:
getWindow().getDecorView().setSystemUiVisibility(
View.SYSTEM_UI_FLAG_LAYOUT_STABLE
| View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN);
请确保在/res/values-v21/styles.xml中设置透明度:
<item name="android:statusBarColor">@android:color/transparent</item>
这种方法的好的一面是,同样的布局和设计也可以在API 19上使用,方法是将透明状态栏替换为有色半透明状态栏
<item name="android:windowTranslucentStatus">true</item>
true
方法#2:
<?xml version="1.0" encoding="UTF-8" ?>
<resources>
<style name="MyStyle" parent="@style/Theme.AppCompat.Light.NoActionBar">
<item name="android:windowTranslucentStatus">true</item>
</style>
</resources>
<?xml version="1.0" encoding="UTF-8" ?>
<resources>
<style name="MyStyle" parent="@style/Theme.AppCompat.Light.NoActionBar">
<item name="android:statusBarColor">@android:color/transparent</item>
</style>
</resources>
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android" android:versionCode="1" android:versionName="1.0" package="com.agn.test.test">
<uses-sdk android:minSdkVersion="10" />
<application android:allowBackup="true" android:icon="@mipmap/icon" android:label="@string/app_name" android:theme="@style/MyStyle">
</application>
</manifest>
如果只需要在状态栏下绘制背景图像,而不需要在其后面定位视图,只需将活动主题的背景设置为所需的图像并设置状态栏透明度即可,如方法1所示。这是我在几个月前创建的屏幕截图时使用的方法
方法#3:
<?xml version="1.0" encoding="UTF-8" ?>
<resources>
<style name="MyStyle" parent="@style/Theme.AppCompat.Light.NoActionBar">
<item name="android:windowTranslucentStatus">true</item>
</style>
</resources>
<?xml version="1.0" encoding="UTF-8" ?>
<resources>
<style name="MyStyle" parent="@style/Theme.AppCompat.Light.NoActionBar">
<item name="android:statusBarColor">@android:color/transparent</item>
</style>
</resources>
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android" android:versionCode="1" android:versionName="1.0" package="com.agn.test.test">
<uses-sdk android:minSdkVersion="10" />
<application android:allowBackup="true" android:icon="@mipmap/icon" android:label="@string/app_name" android:theme="@style/MyStyle">
</application>
</manifest>
如果您必须忽略某些布局的标准系统插入,而让它们在其他布局中工作,那么唯一可行的方法就是使用经常链接的类。当然,并非所有场景都需要在该类中完成某些操作。例如,如果您不打算使用合成状态栏覆盖,只需注释掉init()
方法中的所有内容,而无需向attrs.xml文件添加任何内容。我已经看到这种方法是有效的,但我想你会发现它带来了一些其他的影响,这可能需要做很多工作才能解决
我还看到您反对包装多个布局。如果将一个布局包装到另一个布局中,其中两个布局的高度和宽度都有match\u parent
,那么性能影响就太微不足道了。无论如何,您可以通过将其扩展的类从FrameLayout
更改为您喜欢的任何其他类型的布局类来完全避免这种情况。它会很好用。这对我的案子很有效
有关使用状态栏的详细信息:
试试这个主题
<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
<!-- Customize your theme here. -->
<item name="windowActionBar">false</item>
<item name="windowNoTitle">true</item>
<item name="colorPrimaryDark">@android:color/transparent</item>
<item name="colorPrimary">@color/md_blue_200</item>
<item name="android:windowDrawsSystemBarBackgrounds">true</item>
<item name="android:statusBarColor">@android:color/transparent</item>
<item name="android:windowTranslucentStatus">true</item>
</style>
在Android Studio 1.4中,带有锅炉板代码的模板项目将在AppbarLayout和/或工具栏上设置Overlay
主题。它们还设置为通过fitSystemWindow
attribute=true在状态栏后面呈现。这将导致仅在状态栏正下方渲染工具栏,其他所有内容都将在工具栏下方渲染。因此,上面提供的解决方案无法单独工作。您必须进行以下更改
- 删除工具栏的覆盖主题或将其更改为非覆盖主题
- 将以下代码放入styles-21.xml文件中
@android:彩色/透明
- 将此主题分配给中包含导航抽屉的活动
AndroidManifest.xml文件
这将使导航抽屉呈现在透明状态栏后面。类似于发布的一些解决方案,但在我的例子中,我使状态栏透明,并用一些负边距固定操作栏的位置
<item name="android:windowTranslucentStatus">true</item>
if (Build.VERSION.SDK_INT >= 21) {
getWindow().setStatusBarColor(Color.TRANSPARENT);
FrameLayout.LayoutParams lp = (FrameLayout.LayoutParams) toolbar.getLayoutParams();
lp.setMargins(0, -getStatusBarHeight(), 0, 0);
}
我在工具栏和根视图中使用了
android:fitsSystemWindows="true"
我也有同样的问题,所以我创建了一个在状态栏API 19后面绘制的ImageView+
在状态栏后面设置自定义图像
publicstaticvoidsettransparent(Activity-Activity,int-imageRes){
if(Build.VERSION.SDK_INT=Build.VERSION\u code.LOLLIPOP){
activity.getWindow().addFlags(WindowManager.LayoutParams.FLAG\u DRAWS\u SYSTEM\u BAR\u BACKGROUNDS);
activity.getWindow().clearFlags(WindowManager.LayoutParams.FLAG_半透明_状态);
activity.getWindow().addFlags(WindowManager.LayoutParams.FLAG\u半透明\u导航);
activity.getWindow().setStatusBarColor(Color.TRANSPARENT);
}否则{
activity.getWindow().addFlags(WindowManager.LayoutParams.FLAG_半透明_状态);
}
//获取系统窗口的根目录
//ViewGroup rootView=(ViewGroup)((ViewGroup)activity.findviewbyd(android.R.id.content)).getChildAt(0);
//setFitsSystemWindows(true);
//setCliptPadding(true);
ViewGroup contentView=(ViewGroup)activity.findviewbyd(android.R.id.content);
if(contentView.getChildCount()>1){
contentView.removeViewAt(1);
}
//获取状态栏高度
内部资源=
android:theme="@style/Theme.AppCompat.Light.NoActionBar"
<style name="AppTheme" parent="@android:style/Theme.NoTitleBar">
<!-- Default Background Screen -->
<item name="android:background">@color/default_blue</item>
<item name="android:windowTranslucentStatus">true</item>
</style>
compile 'com.jaeger.statusbarutil:library:1.4.0'
StatusBarUtil.setTranslucentForImageView(Activity activity, int statusBarAlpha, View viewNeedOffset)
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout 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:background="@color/white"
android:orientation="vertical">
<ImageView
android:layout_alignParentTop="true"
android:layout_width="match_parent"
android:adjustViewBounds="true"
android:layout_height="wrap_content"
android:src="@drawable/toolbar_bg"/>
<android.support.design.widget.CoordinatorLayout
android:id="@+id/view_need_offset"
android:layout_width="match_parent"
android:layout_height="match_parent">
<android.support.v7.widget.Toolbar
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
android:background="@android:color/transparent"
app:popupTheme="@style/ThemeOverlay.AppCompat.Light"
app:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"/>
<!-- Your layout code -->
</android.support.design.widget.CoordinatorLayout>
</RelativeLayout>
if (Build.VERSION.SDK_INT >= 19 && Build.VERSION.SDK_INT < 21) {
setWindowFlag(this, WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS, true)
}
if (Build.VERSION.SDK_INT >= 19) {
window.decorView.systemUiVisibility = View.SYSTEM_UI_FLAG_LAYOUT_STABLE or View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
}
if (Build.VERSION.SDK_INT >= 21) {
setWindowFlag(this, WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS, false)
getWindow().setStatusBarColor(Color.TRANSPARENT)
}
private fun setWindowFlag(activity: Activity, bits: Int, on: Boolean) {
val win: Window = activity.getWindow()
val winParams: WindowManager.LayoutParams = win.getAttributes()
if (on) {
winParams.flags = winParams.flags or bits
} else {
winParams.flags = winParams.flags and bits.inv()
}
win.setAttributes(winParams)
}
android:fitsSystemWindows="false"
<item name="android:windowTranslucentStatus">true</item>
<item name="android:windowTranslucentNavigation">true</item>