簡體   English   中英

在CameraPreview Android Camera2 API的SurfaceView上繪圖時出錯?

[英]Error in drawing on surfaceview on camerapreview android camera2 api?

我正在嘗試在相機預覽的surfaceview上繪制一個矩形。 我有一個自定義視圖類,該類擴展了SurfaceView類並實現了surfaceholder回調。 現在的問題是,當我運行我的應用程序時,我看到一個黑色背景,而沒有看到相機預覽。 可能是什么問題呢。 這是我到目前為止嘗試過的。

public class OverlayTextureView extends SurfaceView implements SurfaceHolder.Callback {

        private final Paint paint;
        private final SurfaceHolder mHolder;
        private final Context context;

        public OverlayTextureView(Context context) {
            this(context,null);
            setWillNotDraw(false);
        }
        public OverlayTextureView(Context context, AttributeSet attrs) {
            this(context, attrs, 0);
        }

        public OverlayTextureView(Context context, AttributeSet attrs, int defStyle) {
            super(context, attrs, defStyle);

            mHolder = getHolder();
            mHolder.setFormat(PixelFormat.TRANSPARENT);
            this.context = context;
            paint = new Paint(Paint.ANTI_ALIAS_FLAG);
            paint.setColor(Color.WHITE);
            paint.setStyle(Paint.Style.STROKE);
        }

        @Override
        protected void onDraw(Canvas canvas) {
           drawMyStuff(canvas);


        }
        private void tryDrawing(SurfaceHolder holder) {
            Log.i("Sv", "Trying to draw...");

            Canvas canvas = holder.lockCanvas();
            if (canvas == null) {
                Log.e("Sv", "Cannot draw onto the canvas as it's null");
            } else {
                drawMyStuff(canvas);
                holder.unlockCanvasAndPost(canvas);
            }
        }

        private void drawMyStuff(final Canvas canvas) {

            int x = canvas.getWidth();
            int y = canvas.getHeight();


            paint.setColor(Color.GREEN);
            paint.setStyle(Paint.Style.STROKE);
            Rect rect = new Rect(50, 50, x - 300, y - 300);
            canvas.drawRect(rect, paint);
        }

        @Override
        public void surfaceCreated(SurfaceHolder surfaceHolder) {
            tryDrawing(surfaceHolder);

        }

        @Override
        public void surfaceChanged(SurfaceHolder surfaceHolder, int i, int i1, int i2) {
             tryDrawing(surfaceHolder);
        }

        @Override
        public void surfaceDestroyed(SurfaceHolder surfaceHolder) {

        }

    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:id="@+id/rlv"
        >

        <RelativeLayout
            android:id="@+id/vwMainContainer"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:background="#ffffff">

            <TextView
                android:id="@+id/putstuffs"
                android:layout_width="match_parent"
                android:layout_height="20dp"
                android:layout_alignParentStart="true"
                android:layout_marginBottom="14dp"
                android:text="Timer"
                android:textColor="#ff0000" />



            <com.example.OverlayTextureView
                android:id="@+id/overlay"
                android:layout_height="fill_parent"
                android:layout_width="fill_parent"
                >
            </com.example.OverlayTextureView>

            <TextureView
                android:id="@+id/texture"
                android:layout_width="480dp"
                android:layout_height="640dp"
                android:layout_alignParentStart="true">
            </TextureView>

        </RelativeLayout>

        <Button
            android:id="@+id/picture"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentBottom="true"
            android:layout_centerHorizontal="true"
            android:text="@string/picture" />

    </RelativeLayout>

片段類

 RelativeLayout mVwMainContainer;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {

        View view =inflater.inflate(R.layout.fragment_camera2_basic, container, false);
        mVwMainContainer = (RelativeLayout) view.findViewById(R.id.vwMainContainer);


          mVwMainContainer.addView(new OverlayTextureView(getActivity()));
        return view;
    }

    @Override
    public void onViewCreated(final View view, Bundle savedInstanceState) {
        view.findViewById(R.id.picture).setOnClickListener(this);
        mSurfaceView = (TextureView) view.findViewById(R.id.texture);
        appendinstructions = (TextView) view.findViewById(R.id.putstuffs);

        mOverlay =  view.findViewById(R.id.overlay);

        holder = mOverlay.getHolder();

    }]

在此處輸入圖片說明

我過去使用的解決方案要簡單得多:

  • SufraceView相機SufraceView
  • 在其頂部添加一個透明視圖,在其上重寫onDraw(Canvas)

因此,例如:

public class RectangleDrawerView extends View {

    private Paint mPaint;

    public RectangleDrawerView(Context context, AttributeSet attrs) {
        super(context, attrs);

        // Set up the pen: 10pt, no fill
        mPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
        mPaint.setStrokeCap(Paint.Cap.ROUND);
        mPaint.setStrokeWidth(10.0f);
        mPaint.setStyle(Paint.Style.STROKE);
    }

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);

        canvas.drawRect(10, 10, 20, 20, mPaint);
    }

}

然后在布局中,例如:

<SurfaceView
    android:id="@+id/preview"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_gravity="center_vertical"/>

<com.me.myapp.RectangleDrawerView
    android:id="@+id/overlayView"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:clickable="false"
    android:focusable="false"
    android:hapticFeedbackEnabled="false"
    android:longClickable="false"
    android:scrollbarAlwaysDrawHorizontalTrack="false"
    android:scrollbarAlwaysDrawVerticalTrack="false"
    android:soundEffectsEnabled="false" />

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM