Как я могу нарисовать любую линию на поверхности, которая уже отображает предварительный просмотр камеры? - PullRequest
0 голосов
/ 06 декабря 2018

Когда я пытаюсь выполнить приведенное ниже утверждение в SurfaceChanged методе переопределения, я получаю исключение.

Canvas canvas = holder.lockCanvas();

Исключение - IllegalStateException

Мое требование: Мне нужно сделатьиспользуя 1 SurfaceView, а не SurfaceView в других макетах.Моя цель - предварительный просмотр в реальном времени SurfaceView с линией, нарисованной на нем с помощью canvas.

1 Ответ

0 голосов
/ 06 декабря 2018

добавьте вид поверхности в один из родительских макетов

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

    <SurfaceView
        android:id="@+id/surface"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />


</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));
...