【问题标题】:set RelativeLayout background to match wallpaper image设置 RelativeLayout 背景以匹配壁纸图像
【发布时间】:2025-11-21 15:35:01
【问题描述】:

我在屏幕顶部有一个相对布局(例如,在状态栏顶部),我希望它的背景图像与底层系统壁纸相同。这样做没问题:

public class MainActivity extends Activity 
{
    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);

        WindowManager window_manager=(WindowManager)getSystemService(WINDOW_SERVICE);
        WindowManager.LayoutParams params=new WindowManager.LayoutParams();
        WindowManager.LayoutParams window_manager_layout_params=new WindowManager.LayoutParams(
            params.FILL_PARENT,
            100,
            params.TYPE_SYSTEM_ERROR,
            params.FLAG_WATCH_OUTSIDE_TOUCH|
            params.FLAG_NOT_FOCUSABLE|
            params.FLAG_LAYOUT_IN_SCREEN,
            PixelFormat.TRANSLUCENT);
        window_manager_layout_params.gravity=Gravity.TOP;
        RelativeLayout rl=new RelativeLayout(this);
        WallpaperManager wpm =WallpaperManager.getInstance(this);
        Drawable d=wpm.getDrawable();
        rl.setBackgroundDrawable(d);
        window_manager.addView(rl,window_manager_layout_params);
    }
}

问题是,如何设置相对布局的背景可绘制对象以完全匹配相对布局后面的壁纸部分? (没有拉伸和完全相同的位置)。

注意:要使代码正常工作,您需要在清单中添加警报窗口的权限:

<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />

编辑:更清楚:

它应该看起来像这样:

但实际上它看起来像这样:

【问题讨论】:

  • 如图所示,将 relativeLayout 背景设置为 TRANSPARENT 不会解决问题吗?
  • 不是真的,因为相对布局后面是状态栏,我更新了问题,之前忘了提这个
  • @RafaelCardoso:如果我将背景设置为透明,如果有其他窗口/图标,任何其他位置都不能保证看到壁纸,...在后台
  • 请更清楚你的问题..!!

标签: android android-relativelayout setbackground


【解决方案1】:

您可以尝试将RelativeLayout 和状态栏的背景颜色都设置为透明。然后你可以在RelativeLayout 内有另一个布局,并在与状态栏高度相同的父布局上放置一个paddingTop

【讨论】:

  • 就像我在问题中所说,我希望相对布局将系统壁纸作为背景,在同一位置。未拉伸,未裁剪,未缩放。就像上面的例子一样,相对布局应该像“不可见”一样通过显示壁纸。相对布局后面的任何内容,例如图标或其他窗口,或者在这种情况下,任何状态栏文本都不应可见。我不知道如何精确匹配背景的位置和大小以适合壁纸。背景总是被拉伸
【解决方案2】:

您应该使用Transparent Activity 来实现您的要求,您的theme 应该看起来像这样

<item name="android:windowIsTranslucent">true</item>
<item name="android:windowBackground">@android:color/transparent</item>
<item name="android:windowContentOverlay">@null</item>
<item name="android:windowNoTitle">true</item>
<item name="android:windowIsFloating">true</item>
<item name="android:backgroundDimEnabled">false</item>

然后您可以为顶部栏设置一个纯色背景颜色,如您的图像中所示,然后您应该只看到屏幕的可见部分transparent

另一种选择是在顶部栏height 上裁剪壁纸Bitmap

【讨论】: