
kivy/kivymd 应用在 pc 上显示正常,但打包为 android apk 后所有控件偏移至屏幕左下角、触摸响应区域错位——这通常由硬编码窗口尺寸或未适配 android 窗口管理机制导致。
kivy/kivymd 应用在 pc 上显示正常,但打包为 android apk 后所有控件偏移至屏幕左下角、触摸响应区域错位——这通常由硬编码窗口尺寸或未适配 android 窗口管理机制导致。
在 Kivy 开发中,一个常见但极易被忽视的陷阱是:在代码中显式调用 Window.size 设置固定窗口尺寸(如 Window.size = (480, 800))。该操作在桌面环境(如 PyCharm 运行时)可临时生效,但在 Android 平台上会严重干扰 Kivy 的原生窗口初始化流程——Android 的 SurfaceView 和 GLSurfaceView 在启动时会动态分配真实屏幕尺寸,而人为设置 Window.size 会导致坐标系基准错乱,最终表现为所有 UI 元素“坍缩”到左下角,且触摸热区与视觉位置严重偏移(即“能点中但看不见”)。
✅ 正确做法是:彻底移除所有对 kivy.core.window.Window 的尺寸硬编码操作,包括:
# ❌ 错误示例:绝对禁止在 Android 构建中使用 from kivy.core.window import Window Window.size = (480, 800) # 导致 APK UI 偏移 Window.fullscreen = 'auto' # 可能干扰 Android 全屏逻辑 Window.clearcolor = (0.1, 0.1, 0.1, 1)
✅ 替代方案(推荐):
- 完全依赖 Kivy 的自适应布局系统:使用 BoxLayout、GridLayout、FloatLayout 配合 size_hint、pos_hint;
- 使用 dp() / sp() 进行密度无关缩放(你已正确使用,值得肯定);
- 如需设置初始窗口行为(仅限桌面调试),应加平台判断:
# ✅ 安全写法:仅在桌面端生效
from kivy.utils import platform
if platform not in ('android', 'ios'):
from kivy.core.window import Window
Window.size = (480, 800)⚠️ 注意事项:
- Buildozer 本身不修改你的 Python 逻辑,问题 100% 出在代码中;
- 即使使用 KivyMD,其 MDApp 仍基于 Kivy 核心窗口系统,同样受此影响;
- 检查第三方库(如某些自定义弹窗组件)是否内部调用了 Window.size;
- 清理 Buildozer 缓存后重试:buildozer android clean && buildozer android debug,避免旧构建残留干扰。
总结:Android APK 中 UI 偏移的本质是坐标系基准被错误重置。删除所有 Window.size 相关代码,回归 Kivy 原生响应式布局范式,即可彻底解决该问题。调试时善用 print(Window.size, Window.system_size) 对比 PC 与 Android 日志,可快速定位异常干预点。

















