【问题标题】:Android multiple surface views - clipping issueAndroid 多个表面视图 - 剪切问题
【发布时间】:2016-02-26 02:01:23
【问题描述】:

我目前在处理多个表面视图和剪切其中一个视图以使其显示为圆形时遇到问题。最好用图片来描述:

所以在这个视图中我有 2 个表面视图,全屏视图显示相机的预览,然后顶部显示使用 MediaPlayer 播放文件。我已经通过以下行将顶部放在预览上方:

surfaceView.setZOrderMediaOverlay(true);

现在如您所见,我尝试使用以下代码将其屏蔽为一个圆圈:

@Override
protected void dispatchDraw(Canvas canvas) {

    Path clipPath = new Path();
    clipPath.addCircle(getWidth() / 2, getHeight() / 2, getWidth() / 2, Path.Direction.CCW);

    canvas.clipPath(clipPath);
    super.dispatchDraw(canvas);
}

但它似乎并没有完全解决。我最初认为这是我的掩码代码的问题,但事实证明,如果我删除预览表面视图,如下图所示,掩码工作正常

任何人对为什么会发生这种情况或如何解决它有任何想法:S?

感谢您的帮助

【问题讨论】:

    标签: android android-canvas surfaceview clip-path


    【解决方案1】:

    请记住,SurfaceView 有两部分,Surface 和 View,并且 Android 图形系统使用多个层。

    您的所有视图都位于单个层上,通常简称为“视图 UI 层”。视图可以上下放置,因为它们都被渲染到同一个像素缓冲区中。

    表面出现在它们自己的图层上。默认情况下,SurfaceView 的 Surface 位于 View UI 层的下方(后面)。 SurfaceView 的 View 部分只是 View 系统用于布局的透明矩形。如果您在该视图上绘制(通过继承 SurfaceView 并覆盖绘制方法),您将渲染与 Surface 重叠的像素,使它们不透明。这是一种掩盖 Surface 的简单方法。

    您的迷你播放器 Surface 使用 setZOrderOnTop(),它将 SurfaceView 的 Surface 的层设置在 View UI 的顶部(前面)。如果您的 Surface 是部分透明的,这很方便,因为它可以让您看到它背后的视图。但是,您在 SurfaceView 的 View 上绘制的任何内容也会出现在它的后面,因此它不再用作遮罩。

    您正在尝试做的问题是您希望通过角落处的上表面可以看到下表面。您不能简单地用另一层屏蔽这些像素——您需要使它们在视频播放层本身上透明。这有点棘手,因为您需要将视频输入 GLES 纹理然后渲染它。

    另请参阅graphics architecture doc

    【讨论】:

    • 非常感谢我怀疑这种情况,我在另一个遇到类似问题的帖子上阅读了您的另一个答案
    • 你见过在 GLSurfaceView 中播放和屏蔽视频的好例子吗?
    • 我没有什么特别要推荐的。 Grafika (github.com/google/grafika) 中的“来自相机的纹理”活动演示了使用 GLES 渲染实时相机馈送,但它不会尝试掩盖图像。最好的方法可能是从它开始并使用片段着色器来渲染某个半径之外的透明度,然后继续渲染到一个矩形,尽管绘制一个带纹理的圆(用三角形扇形近似)也可以。 (Grafika 的相机滤镜演示包含关键要素,但您需要稍微玩一下 GLSL。)
    猜你喜欢
    • 2011-12-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多