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>