如何创建带圆角的surfaceview

时间:2015-03-12 10:37:06

标签: android stream surfaceview

我很难绕过surfaceview的角落。我正在使用MjpegView (从surfaceview继承的自定义视图。 我已尝试过这个解决方案:      1)使用带圆角的自定义绘图设置背景      2)阅读本文http://androidtutorialsandtips.blogspot.co.il/2012/01/overriding-ondraw-method-in-surfaceview.html后         我不确定如何实现圆角,因为我已经实现了一个锁定画布的线程。

while (mRun)
        {
            if (surfaceDone)
            {
                try
                {
                    c = mSurfaceHolder.lockCanvas();
                    synchronized (mSurfaceHolder)
                    {
                        try
                        {
                            if (mIn != null)
                            {
                                Bitmap bm = mIn.readMjpegFrame();
                                destRect = destRect(bm.getWidth(), bm.getHeight());

                                if (streamHeight == -1 && streamWidth == -1)
                                {
                                    streamWidth = bm.getWidth();
                                    streamHeight = bm.getHeight();
                                }
                                c.drawColor(Color.BLACK);
                                c.drawBitmap(bm, null, destRect, p);
                                if (showFps)
                                {
                                    p.setXfermode(mode);
                                    if (ovl != null)
                                    {
                                        height = ((ovlPos & 1) == 1) ? destRect.top : destRect.bottom - ovl.getHeight();
                                        width = ((ovlPos & 8) == 8) ? destRect.left : destRect.right - ovl.getWidth();
                                        c.drawBitmap(ovl, width, height, null);
                                    }
                                    p.setXfermode(null);
                                    frameCounter++;
                                    if ((System.currentTimeMillis() - start) >= 1000)
                                    {
                                        fps = String.valueOf(frameCounter) + "fps";
                                        frameCounter = 0;
                                        start = System.currentTimeMillis();
                                        ovl = makeFpsOverlay(overlayPaint, fps);
                                    }
                                }
                            }
                        }
                        catch (IOException e)
                        {
                        }
                    }
                }
                finally
                {
                    if (c != null) mSurfaceHolder.unlockCanvasAndPost(c);
                }
            }
        }

2 个答案:

答案 0 :(得分:1)

如果我理解你的问题:

  1. 创建一个包含2个子项的<FrameLayout ...>:表面视图和其上方的部分透明覆盖层。 (FrameLayout将其子女一个接一个地吸引。)

  2. 在封面图层上绘制圆角。

  3. 也就是说,SurfaceView上面会有一个不透明层,而不透明层的中心会有一个带圆角的透明孔。

    这是一个示例,我用一个50%透明黑色图层(默认情况下 visibility =“不可见”)和里面带按钮的RelativeLayout覆盖SurfaceView。

    <FrameLayout
        android:layout_width="fill_parent"
        android:layout_height="fill_parent" >
    
        <SurfaceView
            android:id="@+id/camera_preview"
            android:layout_width="fill_parent"
            android:layout_height="fill_parent"
            android:layout_centerInParent="true" />
        <View
            android:id="@+id/transparency"
            android:layout_width="fill_parent"
            android:layout_height="fill_parent"
            android:background="#80000000"
            android:visibility="invisible"
            />
        <RelativeLayout
            android:id="@+id/xxxxx"
            android:layout_width="fill_parent"
            android:layout_height="fill_parent"
            >
            ...
    

答案 1 :(得分:0)

要实现您的要求,这很容易做到。您只需要使用下一个XML:

<androidx.cardview.widget.CardView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        app:cardCornerRadius="12dp">
        <SurfaceView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center" />
    </androidx.cardview.widget.CardView>

要使用此CardView,请在您的 build.gradle 应用上添加此依赖项:

implementation 'androidx.cardview:cardview:1.0.0'