我如何在 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 上绘制叠加层?