如何使用Kivy开发移动端应用全屏竖版相机组件并实现点击拍照停止功能
KivyMD相机功能问题修复
你现有代码存在4个核心问题,直接修改即可实现需求:
- KV布局结构错误,MDBoxLayout声明行数为2但只添加了1个Camera组件,Rotate旋转指令未放在正确的画布节点下,相机尺寸绑定失效无法实现全屏
- 拍照按钮创建后未添加到布局中,点击事件完全无法触发
- 相机竖屏适配逻辑不全,仅设置旋转角度无法解决画面拉伸、比例错误问题
- 拍照逻辑时序有问题,停止预览后立即导出图片可能拿到空白帧
修复后完整可运行代码
# 修复后的KV布局 camera_widget = ''' MDBoxLayout: orientation: 'vertical' Camera: id: camera play: True size_hint: 1, 1 resolution: (1080, 1920) # 竖屏分辨率优先选高>宽的参数,适配移动端 canvas.before: PushMatrix Rotate: origin: self.center angle: -90 canvas.after: PopMatrix ''' def menue_arabic_camera(self,*args): self.screen.clear_widgets() return_back = MDFlatButton(text=self.ar_text("العودة للخلف"), pos_hint={'center_x': .5, 'center_y': .02}, on_press=self.selection_load_cam_ar, font_name='DROIDKUFI-REGULAR.TTF') self.screen.add_widget(return_back) self.SHEET = Builder.load_string(camera_widget) self.screen.add_widget(self.SHEET) # 修复:将拍照按钮添加到布局中 CAPTURE = MDFlatButton(text="Capture", pos_hint={'center_x': .5, 'center_y': .05}, on_press=self.capture) self.screen.add_widget(CAPTURE) def capture(self,*args): camera = self.SHEET.ids['camera'] # 先导出图片再停止预览,避免出现空白图 name = "User_sheet" camera.export_to_png("IMG_{}.png".format(name)) self.save_img() camera.play = False
修改说明
- 去掉了MDBoxLayout的rows参数,改为垂直排列,相机设置size_hint为1:1占满父布局实现全屏
- 旋转指令移到canvas.before节点,搭配PushMatrix和PopMatrix避免影响其他组件渲染
- 相机分辨率调整为高大于宽的竖屏参数,适配移动端竖屏显示需求
- 补全了拍照按钮的add_widget逻辑,保证按钮正常显示可点击
- 调整拍照时序,先导出图片再停止预览,避免帧未渲染就停止采集导致的空白图片问题
- 相机默认开启play属性,避免部分设备启动后相机不加载画面的问题
内容的提问来源于stack exchange,提问作者Twfyq Bhyry
相关产品推荐
相关产品推荐

