我如何在 Surfaceview 上绘制任何已经渲染相机预览的线?

Posted

技术标签:

【中文标题】我如何在 Surfaceview 上绘制任何已经渲染相机预览的线?【英文标题】:How can i draw any line on surfaceview which is already rendering Camera Preview? 【发布时间】:2019-05-07 19:13:12 【问题描述】:

当我在 SurfaceChanged 覆盖方法中尝试以下语句时,我得到一个异常。

Canvas canvas = holder.lockCanvas();

异常 - IllegalStateException

我的要求:我需要使用 1 SurfaceView 来执行此操作,而不是在其他布局中使用 SurfaceView。我的目的是直播SurfaceView 预览,并使用画布在其上绘制一条线。

【问题讨论】:

在其他布局中添加表面视图,然后在该父布局中绘制画布。 @MilanPansuriya 谢谢,但我的要求是这样的 - 我需要使用 1 个表面视图来执行此操作,而不是在其他布局中采用表面视图。我的目的是使用画布在其上绘制线条来直播表面视图预览。 如果在表面视图上添加画布,则必须添加父布局,而不是每次都会更新 @MilanPansuriya 你能分享我的布局结构吗?所以我可以清楚地知道你的意思。谢谢 @Parmit 检查我的答案它会起作用,因为我在表面视图方面遇到了同样的问题 【参考方案1】:

在任一父布局中添加您的表面视图

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/control"
    android:layout_
    android:layout_>

    <SurfaceView
        android:id="@+id/surface"
        android:layout_
        android:layout_ />


</RelativeLayout>

我创建了一个框来覆盖相机

public class Box extends View 
    private Paint paint = new Paint();

    Box(Context context) 
        super(context);
    

    @Override
    protected void onDraw(Canvas canvas)  // Override the onDraw() Method
        super.onDraw(canvas);

        paint.setStyle(Paint.Style.STROKE);
        paint.setColor(Color.GREEN);
        paint.setStrokeWidth(2);

        //center
        int x0 = canvas.getWidth() / 2;
        int y0 = canvas.getHeight() / 2;
        int dx = (int) (canvas.getWidth() / 2.5);
        int dy = (int) (canvas.getHeight() / 2.9);
        //draw guide box
        canvas.drawRect(x0 - dx, y0 - dy, x0 + dx, y0 + dy, paint);
    

现在将此框添加到父布局中,因此它不会更新我的表面

        Box box = new Box(this);
        relativeLayout = findViewById(R.id.control);
        relativeLayout.addView(box, new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.MATCH_PARENT, RelativeLayout.LayoutParams.MATCH_PARENT));

【讨论】:

在上面的 sn-p 中,如果我从表面视图录制视频或流式传输视频,它不会显示绘制的框,因为两个视图是分开的。使用 Wowza GoCoder 进行实时流式传输,它使用 Surfaceholder 流式传输或广播实时预览。所以我需要相机和盒子在同一个表面视图中,这样两者都可以直播。 我刚刚在这里给出了例子,你可以添加你的逻辑

以上是关于我如何在 Surfaceview 上绘制任何已经渲染相机预览的线?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Android 上的 Camera 使用的 SurfaceView 上绘制叠加层?

Android:如何在已经显示 Camara 预览的 Surfaceview 上绘图

在 Android 中绘制到 SurfaceView

在没有任何布局的情况下向活动添加按钮

如何在 SurfaceView 上显示相机预览?

安卓surfaceview动画