V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
idonttellyou
V2EX  ›  Android

如何让 ViewPager 中每个 Fragment 中都显示摄像头预览画面?

  •  
  •   idonttellyou · 10 天前 · 1051 次点击
    各位大佬,如题所示,如何实现?

    我尝试使用了 github 中的 CameraView ,实现效果不行,每次滑动到新的 fragment 中,会关闭并重新打开摄像头,会有 3 秒左右的黑屏无画面。

    我有一个想法是:在 ViewPager 页面打开摄像头,然后获取到预览画面数据,在分发给 fragment 页面进行绘制显示,但是如果将获取到的预览画面 byte[]转换成 bitmap 在分发显示会不会设备吃不消而造成卡顿或者溢出?

    求教各位大佬!
    11 条回复    2025-06-11 10:39:08 +08:00
    cjh1095358798
        1
    cjh1095358798  
       10 天前
    不是很理解这样的需求
    okakuyang
        2
    okakuyang  
       10 天前
    同时显示多个 CameraView, 即使在不可见区域的 CameraView 页预先显示。
    hahabird
        3
    hahabird  
       10 天前
    复用同一个 CameraView ??
    MozzieW
        4
    MozzieW  
       10 天前
    Camera 属于非常“重”的组件,不应该频繁重开关。你应该把 Camera 或者 CameraView 提升到 Activity ,每个 Fragment 只放一个 Container ,Fragment 展示的时候,从 Activity 获取到 Camera 相关组件
    xmai
        5
    xmai  
       10 天前   ❤️ 1
    摄像头只打开一次,页面切换时只切换预览输出的 Surface ,不重新初始化摄像头硬件。

    1.创建一个全局的摄像头管理器,让所有 Fragment 共享同一个摄像头实例
    2. Activity 级别管理摄像头开关
    3. Fragment 只管理 Surface 的 绑定/解绑
    4. 滑动时暂停预览,静止时恢复
    icount
        6
    icount  
       10 天前
    #5 正解,将摄像头拿到数据和数据渲染分离开,可以搜索一下如何不预览拿到数据,以及如何自己在 surface ( SurfaceView or GlSurfaceView )上渲染 yuv.
    idonttellyou
        7
    idonttellyou  
    OP
       10 天前
    @cjh1095358798 娱乐设备,用户可以在页面中左右滑动选择预设好的模板,这些模板上会有对应的摄像头画面位置。
    idonttellyou
        8
    idonttellyou  
    OP
       10 天前
    @xmai
    @icount 我也是这样想的,但是我目前没搜索到合适的绑定的办法,我在研究研究,谢谢各位大佬
    xmai
        9
    xmai  
       10 天前
    idonttellyou
        10
    idonttellyou  
    OP
       10 天前
    @xmai 大佬,没研究明白怎么绑定预览画面数据,之前没怎么接触过摄像头这块,太难了
    ck19920702
        11
    ck19920702  
       5 天前
    把 5 楼的回答,贴到 AI
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2681 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 19ms · UTC 15:11 · PVG 23:11 · LAX 08:11 · JFK 11:11
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.