【问题标题】:How to draw on PreviewView?如何在 PreviewView 上绘图?
【发布时间】:2020-09-23 00:19:40
【问题描述】:

我有一个 PreviewView 实例,我想根据使用 Firebase 和 Image Analyzer 用例的对象标识在其上绘制一个矩形。

但是,与 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);

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

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

顺便说一下,我在 ImageAnanysis 用例中使用了这个

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

【问题讨论】:

    标签: androidx android-camerax


    【解决方案1】:

    要在预览顶部进行绘制,您可以创建一个自定义视图,该视图使用您提供的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

    【讨论】:

    • 感谢 Saurabh。这很有帮助。我对此有点陌生,您能否帮助澄清一下,为什么这有效,而不是通常在画布上绘画的方法本身?
    • PreviewViewViewGroupSurfaceViewView。默认情况下,不调用ViewGrouponDraw()。所以所有的绘图都委托给它的孩子。所以你必须使用像RectOverlay这样的自定义视图来为你绘制它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-08-07
    • 2010-10-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-21
    • 2018-10-16
    相关资源
    最近更新 更多