You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Kivy中将智能手机屏幕刘海区域填充为菜单颜色?

如何用Kivy填充手机刘海/挖孔区域为菜单颜色

好的,我来帮你搞定这个问题——用Kivy把手机的刘海(或挖孔)区域填充成和菜单一致的颜色,让界面看起来更连贯。核心思路其实很简单:先获取系统提供的屏幕安全区域内边距(也就是刘海占据的空间),然后让菜单的背景延伸到这个区域,或者直接添加一个同色的占位条覆盖刘海。下面是具体的实现步骤和代码示例:

1. 关键前提:让Kivy窗口延伸到刘海区域

默认情况下,Kivy可能会自动避开屏幕的安全区域(包括刘海),所以第一步要确保窗口能完全覆盖整个屏幕:

from kivy.core.window import Window

# 让窗口自适应全屏,延伸到屏幕边缘
Window.fullscreen = 'auto'

如果是Android平台打包,还要在buildozer.spec里设置全屏主题,避免系统状态栏干扰:

android.theme = @android:style/Theme.NoTitleBar.Fullscreen

2. 获取刘海区域的尺寸

Kivy的Window.safe_area属性会返回一个四元组(left, top, right, bottom),分别对应屏幕四个方向的安全区域内边距。其中top值就是刘海(或顶部挖孔)占据的高度。

3. 实现方案:两种方式填充刘海

方案一:添加单独的同色占位条

这种方式适合菜单高度固定的场景,我们在菜单上方加一个和刘海高度一致的条,颜色和菜单完全相同:

from kivy.app import App
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.label import Label
from kivy.core.window import Window
from kivy.graphics import Color, Rectangle

class MainLayout(BoxLayout):
    def __init__(self, **kwargs):
        super().__init__(**kwargs)
        self.orientation = 'vertical'
        
        # 获取刘海高度(安全区域top值)
        self.notch_height = Window.safe_area[1]
        
        # 创建刘海填充条,颜色和菜单一致(这里用蓝色#2196F3为例)
        self.notch_fill = Label(size_hint_y=None, height=self.notch_height)
        with self.notch_fill.canvas.before:
            Color(33/255, 150/255, 243/255, 1)
            self.notch_rect = Rectangle(pos=self.notch_fill.pos, size=self.notch_fill.size)
        # 绑定事件更新矩形位置和大小
        self.notch_fill.bind(pos=self.update_background, size=self.update_background)
        
        # 创建顶部菜单
        self.menu_bar = Label(text="我的应用", size_hint_y=None, height=50, color=(1,1,1,1))
        with self.menu_bar.canvas.before:
            Color(33/255, 150/255, 243/255, 1)
            self.menu_rect = Rectangle(pos=self.menu_bar.pos, size=self.menu_bar.size)
        self.menu_bar.bind(pos=self.update_background, size=self.update_background)
        
        # 添加控件到布局
        self.add_widget(self.notch_fill)
        self.add_widget(self.menu_bar)
        # 主内容区域
        self.add_widget(Label(text="主内容区域", size_hint_y=1))
    
    def update_background(self, instance, value):
        # 更新背景矩形的位置和大小
        if instance == self.notch_fill:
            self.notch_rect.pos = instance.pos
            self.notch_rect.size = instance.size
        elif instance == self.menu_bar:
            self.menu_rect.pos = instance.pos
            self.menu_rect.size = instance.size

class NotchFillApp(App):
    def build(self):
        Window.fullscreen = 'auto'
        return MainLayout()

if __name__ == '__main__':
    NotchFillApp().run()

方案二:让菜单背景直接延伸到刘海

这种方式更简洁,直接调整菜单的高度和位置,让它的背景覆盖刘海区域:

from kivy.app import App
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.label import Label
from kivy.core.window import Window
from kivy.graphics import Color, Rectangle

class MainLayout(BoxLayout):
    def __init__(self, **kwargs):
        super().__init__(**kwargs)
        self.orientation = 'vertical'
        
        self.notch_height = Window.safe_area[1]
        # 菜单高度 = 原菜单高度 + 刘海高度
        menu_total_height = 50 + self.notch_height
        
        # 创建菜单,让它的顶部对齐屏幕最上方(覆盖刘海)
        self.menu_bar = Label(
            text="我的应用",
            size_hint_y=None,
            height=menu_total_height,
            color=(1,1,1,1),
            pos_hint={'top': 1}  # 顶部对齐屏幕顶端
        )
        with self.menu_bar.canvas.before:
            Color(33/255, 150/255, 243/255, 1)
            self.menu_rect = Rectangle(pos=self.menu_bar.pos, size=self.menu_bar.size)
        self.menu_bar.bind(pos=self.update_background, size=self.update_background)
        
        # 添加菜单和主内容
        self.add_widget(self.menu_bar)
        self.add_widget(Label(text="主内容区域", size_hint_y=1))
    
    def update_background(self, instance, value):
        self.menu_rect.pos = instance.pos
        self.menu_rect.size = instance.size

class NotchFillApp(App):
    def build(self):
        Window.fullscreen = 'auto'
        return MainLayout()

if __name__ == '__main__':
    NotchFillApp().run()

4. 注意事项

  • 真实设备测试:模拟器可能无法准确模拟刘海的inset值,建议在带刘海/挖孔的真实手机上测试效果。
  • 跨平台适配:Window.safe_area在iOS和Android上都能正常获取安全区域,所以代码可以跨平台使用。
  • 颜色一致性:确保填充区域的颜色和菜单的RGB值完全一致,避免出现色差。

内容的提问来源于stack exchange,提问作者Ne1zvestnyj

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.07 18:07:47