我目前正在开发一款我希望启用透明状态栏的应用。我希望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
。请注意,DrawerLayout
,RelativeLayout
和ImageView
都将fitsSystemWindows
属性设置为true。
我的问题是:如果我将背景资源(如颜色或图片)设置为上述代码中的DrawerLayout
或RelativeLayout
,我可以看到该颜色或图片&#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
。
答案 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来解决此问题。