Android Lollipop:ImageView忽略fitsSystemWindows属性(透明状态栏)

时间:2015-01-27 18:18:34

标签: android android-layout imageview android-5.0-lollipop

我目前正在开发一款我希望启用透明状态栏的应用。我希望ImageView(我需要scaleType属性)覆盖整个屏幕,以便图像显示在状态栏下方。这是我的布局:

<android.support.v4.widget.DrawerLayout 
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:fitsSystemWindows="true">
    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:fitsSystemWindows="true">
        <ImageView
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:adjustViewBounds="true"
            android:fitsSystemWindows="true"
            android:scaleType="centerCrop"
            android:src="@drawable/picture" />

        <android.support.v7.widget.Toolbar
            (...toolbar stuff...)
        />

        (...some other stuff...)

    </RelativeLayout>

    <include layout="@layout/drawer" />
</android.support.v4.widget.DrawerLayout>

如你所见,它是一个普通的DrawerLayout。请注意,DrawerLayoutRelativeLayoutImageView都将fitsSystemWindows属性设置为true。

我的问题是:如果我将背景资源(如颜色或图片)设置为上述代码中的DrawerLayoutRelativeLayout,我可以看到该颜色或图片&#34;下面&#34;状态栏,完全按照我的意愿,但ImageView&#39; src&#39; drawable始终显示在其下方,就好像它完全忽略fitsSystemWindows属性一样。

我的主题中有以下属性:

<item name="android:windowDrawsSystemBarBackgrounds">true</item>
<item name="android:statusBarColor">@color/primary_dark</item>

由于primary_dark是半透明的黑色(无论如何这都不重要,因为正如我所说,这似乎是我的ImageView独有的问题。透明状态栏适用于{{{ 1}}或DrawerLayout

4 个答案:

答案 0 :(得分:1)

这对我来说很完美

每个viewGroup参数中都有android:fitsSystemWindows="true"。 尝试在ImageView中只留下一个。

或完全删除所有这些。

答案 1 :(得分:0)

fitSystemWindows

在RelativeLayout中不起作用。使用FrameLayout或ViewGroup扩展FrameLayout

答案 2 :(得分:0)

fitSystemWindows不会扩展视图以“适合系统窗口”,而是为视图提供了以所需方式处理它的机会。与DrawerLayout或CoordinatorLayout相比,默认情况下ImageView不接受此优惠。您需要教ImageView使用系统窗口区域。尝试在onCreate()方法中添加类似内容:

imageView.setOnApplyWindowInsetsListener((view, windowInsets) -> {
    view.setPaddingRelative(
            view.getPaddingStart(),
            windowInsets.getStableInsetTop(),
            view.getPaddingEnd(),
            view.getPaddingBottom()
    );
    return windowInsets;
});

您可能需要返回更改后的windowInsets对象,以使带有'fitsSystemWindows'的其他视图完全正常工作。

答案 3 :(得分:-1)

由于void USM(cv::Mat &O, int d, int amp, int threshold) { cv::Mat GB; cv::Mat O_GB; cv::subtract(O, GB, O_GB); cv::Mat invGB = cv::Scalar(255) - GB; cv::add(O, invGB, invGB); invGB = cv::Scalar(255) - invGB; for (int i = 0; i < O.rows; i++) { for (int j = 0; j < O.cols; j++) { unsigned char o_rgb = O.at<unsigned char>(i, j); unsigned char d_rgb = O_GB.at<unsigned char>(i, j); unsigned char inv_rgb = invGB.at<unsigned char>(i, j); int newVal = o_rgb; if (d_rgb >= threshold) { newVal = o_rgb + (d_rgb - inv_rgb) * amp; if (newVal < 0) newVal = 0; if (newVal > 255) newVal = 255; } O.at<unsigned char>(i, j) = unsigned char(newVal); } } } 会向android:fitsSystemWindows="true"添加填充,因此src位于状态栏下方。填充大小是插图(状态栏高度)。 您可以使用FitsSystemWindowsFrameLayout来解决此问题。