【问题标题】:Mask and Clip GLSurfaceView蒙版和剪辑 GLSurfaceView
【发布时间】:2015-05-04 00:36:40
【问题描述】:

我使用通过回调提供矩形 glsurfaceview 的 SDK。

我希望能够以圆形布局呈现此视图。 (即)我想在圆形视图上显示视图

我尝试过使用遮罩布局,例如使用可遮罩布局 https://github.com/christophesmet/android_maskable_layout(非常适合图像,而不是视频)

如何剪裁并将其渲染为圆形?

(背景是不断变化的,所以我不能在这个视频视图上覆盖一个透明视图。目的是有一个矩形 glsurface 视图,其顶部有一个圆形 glsurface 视图)

**用户界面目标:**

【问题讨论】:

  • 我不完全确定您希望布局是什么样子,或者您的应用程序的结构如何。您可以使用第二个 SurfaceView 创建遮罩层;您只需要为遮罩层设置更接近的 Z 深度。如果您可以访问视频源,则可以将其定向到 SurfaceTexture,然后使用自定义着色器来修改渲染(例如,对于每个片段,计算与中心的距离,如果它在圆外,则渲染为透明黑色)。有关各种示例,请参见 Grafika (github.com/google/grafika)。
  • @fadden 编辑帖子以添加 UI 外观的图像。不会有可能表面观点是一个问题吗?我无权访问视频源 - 它是一个连续的实时视频流。感谢您的领导,我会检查 grafika。
  • @lavi 你得到解决方案了吗?

标签: android android-layout opengl-es mask glsurfaceview


【解决方案1】:

我现在对一个项目有几乎相同的要求,这涉及屏蔽PexKit 提供的 GLSurfaceView。对我有用的解决方案是创建 FrameLayout(或任何其他 ViewGroup)的子类并将 GLSurfaceView 放在其中。

然后在FrameLayout子类中使用canvas.clipPath:

private Path clippingPath;

@Override
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
    if (w != oldw || h != oldh) {
        int radius = Math.min(w, h)/2;
        clippingPath = new Path();
        clippingPath.addCircle(w/2, h/2, radius, Path.Direction.CW);
    }
}

@Override
protected void dispatchDraw(Canvas canvas) {
    int count = canvas.save();
    canvas.clipPath(clippingPath);
    super.dispatchDraw(canvas);
    canvas.restoreToCount(count);
}

【讨论】:

    猜你喜欢
    • 2012-12-11
    • 1970-01-01
    • 2016-11-01
    • 1970-01-01
    • 2016-02-14
    • 2013-09-01
    • 2010-12-17
    • 1970-01-01
    • 2011-06-23
    相关资源
    最近更新 更多