如何在 PreviewView 上绘制?

How to draw on PreviewView?

我有一个 PreviewView 实例,我想使用 Firebase 和图像分析器用例根据对象标识在其上绘制一个矩形。

但是,与 Text/SurfaceView 不同,PreviewView 不允许在其上绘制任何 Canvas。

还有什么选择?

进一步编辑:

之前尝试过以下方法:

Canvas objectFrameCanvas = new Canvas();
Paint pen = new Paint();
pen.setColor(Color.RED);
pen.setStrokeWidth(8F);
pen.setStyle(Paint.Style.STROKE);

objectFrameCanvas.drawRect(100,150,200, 250, pen);

TextureView textureView = new TextureView(this);
textureView.draw(objectFrameCanvas);

mPreviewView.addView(textureView);

为视图组创建一个子视图:textureView。 新建canvas objectFrameCanvas,在其上绘制矩形,然后在textureView 上绘制canvas。然后将其添加到视图组 (PreviewView)

仍然没有给我应有的必要结果。

顺便说一句,我在我的 ImageAnanysis 用例中使用它

imageAnalysis.setAnalyzer(executor, new ImageAnalysis.Analyzer() {....}

要在预览的顶部绘制,您可以创建一个自定义视图,用您提供的 RectF 列表绘制一个矩形。这是它的要点:

class RectOverlay constructor(context: Context?, attributeSet: AttributeSet?) :
    View(context, attributeSet) {

    override fun onDraw(canvas: Canvas) {
        super.onDraw(canvas)
        // Pass it a list of RectF (rectBounds)
        rectBounds.forEach { canvas.drawRect(it, paint) }
    }
}

并在您的布局中使用此自定义视图:

<androidx.constraintlayout.widget.ConstraintLayout 
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <androidx.camera.view.PreviewView
        android:id="@+id/preview_view"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

    <com.example.RectOverlay
        android:id="@+id/rect_overlay"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />
</androidx.constraintlayout.widget.ConstraintLayout>

这是一个很好的回购协议,可以检查哪个使用 CameraX 并在检测到的面部上绘制矩形边界:https://github.com/husaynhakeem/android-playground/tree/master/FaceDetectorSample