Android多表面视图 - 剪辑问题

时间:2016-02-26 02:01:23

标签: android android-canvas surfaceview clip-path

我目前遇到多个表面视图和其中一个视图的剪裁问题,以使其显示为圆形。最好在图像中描述:

所以在这个视图中我有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?

感谢您的帮助

1 个答案:

答案 0 :(得分:2)

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

所有观看次数都存在于单个图层上,通常简称为" View UI图层"。视图可以放在彼此的顶部或下方,因为它们都被渲染到相同的像素缓冲区中。

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

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

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

另请参阅graphics architecture doc