【问题标题】:Overlay an image (on canvas) on a VideoView?在 VideoView 上叠加图像(在画布上)?
【发布时间】:2014-01-04 13:31:39
【问题描述】:

我正在尝试将画布放在 VideoView 上。在这个画布上,我希望能够绘制图像(或矩形、线条等)。

我的 XML 文件中有以下 sn-p。

<VideoView
   android:id="@+id/videoplayer"
   android:layout_width="fill_parent"
   android:layout_height="wrap_content" />

同样,我的目标是在此 VideoView 上创建一个画布,以便我可以在画布上放置图像。

所以,我最终会在视频上叠加图像。我还希望能够覆盖矩形和其他元素。

任何帮助将不胜感激!这比我想象的要难得多!

【问题讨论】:

  • 我通过创建自己的自定义 VideoView 类然后在其画布上绘图取得了一些成功。现在的问题是原始视频消失了,只剩下图纸!我觉得这无论如何都不是最好的解决方案。任何帮助都会非常棒!
  • 看起来画布被锁定了。你是怎么画出来的?
  • canvas.drawPoint 然后是 surfaceHolder.unlockCanvasAndPost
  • 我实际上已经遵循了这个例子:androidhelpkatariya.blogspot.ca/2012/11/… 但它似乎扼杀了之前的观点。 (VideoView 继承自 SurfaceView)。以某种方式覆盖 GLSurfaceView 是个好主意吗?我还是很迷茫
  • 对我来说正确的方法是如果您可以自定义 VideoView 并覆盖 onDraw(canvas)。但是现在的问题是:当您调用 setAnchorView(videoView); 时,MediaPlayer 可能会锁定画布;所以永远不会调用 onDraw() 并且 invalide() 不起作用。

标签: java android image


【解决方案1】:

我相信你需要的不仅仅是一张图片,对吧?

那么,试试这个:

  1. 使用 GLSurfaceView
  2. 创建纹理
  3. 创建一个 SurfaceTexture
  4. 使用 SurfaceTexture 创建一个 Surface
  5. 将 MediaPlay 输出告诉上面创建的 Surface
  6. 渲染 SurfaceTexture
  7. 渲染其他小部件(按钮进度条等)

【讨论】:

    【解决方案2】:

    我已经编写了一个完全符合您要求的应用程序。不幸的是,我现在没有代码,但我记得我在哪里找到了对我有很大帮助的代码!

    正如您在此 video 和此 one 中所看到的,您很可能在视频流上绘制任何您想要的内容,您只需要确保不要将 FPS 丢弃太多.

    Here你可以找到教程和代码。我所做的是在我了解了它的作用以及我想用什么来改变它之后,我开始取出代码块。它确实加快了我在 PoC 上的工作。

    希望对您有所帮助,如果您需要更多帮助,我很乐意为您提供进一步帮助。

    祝你好运!

    【讨论】:

      【解决方案3】:

      使用相对布局。这是我用来在我的地图视图中叠加图像的方法:

      <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
          android:layout_width="match_parent"
          android:layout_height="match_parent" >        
      
          <fragment
              android:id="@+id/map"
              android:layout_width="match_parent"
              android:layout_height="match_parent"
              class="com.google.android.gms.maps.SupportMapFragment"/>
      
          <ImageView
              android:id="@+id/add_new_poi_icon_overlay"
              android:layout_width="match_parent"
              android:layout_height="match_parent"
              android:contentDescription="@string/add_new_poi_icon_content_description"
              android:scaleType="centerCrop"
              android:src="@drawable/overlay_with_watermark"
              android:visibility="gone" /> 
      </RelativeLayout>
      

      只需将 scaletype 更改为您需要的类型,然后使用这些参数将其放在您想要的位置:

      android:layout_alignParentBottom="true"
      android:layout_alignParentLeft="true"
      android:layout_marginBottom="54dp"
      android:layout_marginLeft="36dp"
      

      【讨论】:

      • 嗨伦茨!非常感谢您的回复。我还想在此叠加层上绘制其他东西,例如矩形和线条。你知道这是否可能吗?
      • 您可能需要为此使用 Canvas 或 SurfaceView:developer.android.com/guide/topics/graphics/2d-graphics.html
      • 是的..我一直在进行大规模的搜索,但我找不到一个在实际中覆盖 Canvas 的可靠示例。
      • 据我所知,您不能将 SurfaceView 与 VideoView 一起使用。
      猜你喜欢
      • 1970-01-01
      • 2022-12-02
      • 2022-01-04
      • 2016-04-29
      • 2013-12-14
      • 1970-01-01
      • 1970-01-01
      • 2023-03-12
      • 2016-11-18
      相关资源
      最近更新 更多