简体   繁体   English

位图的Surfaceview返回黑色或Null

[英]surfaceview to bitmap return black or Null

Im struggling to capture a surfaceview and save it to bitmap so I can convert it later to pdf, I tested many approaches but none of them seems to work all what I get is an empty bitmap or black one, I have tried : surfaceView.getDrawingCache(); and surfaceView.getBackground(); 我正在努力捕获一个Surfaceview并将其保存为位图,以便稍后可以将其转换为pdf,我测试了许多方法,但是它们似乎都无法正常工作,我得到的只是一个空位图或黑色位图,我已经尝试过: surfaceView.getDrawingCache(); and surfaceView.getBackground(); surfaceView.getDrawingCache(); and surfaceView.getBackground(); and even replace it with textureview and do textureview.getbitmap() but no different result, 甚至将其替换为textureview并执行textureview.getbitmap()但没有不同的结果,

//************************************ // ****************************************

private void initPaint(){
    paint.setAntiAlias(true);
    paint.setStyle(Paint.Style.STROKE);
    paint.setColor(Color.BLACK);
    paint.setStrokeWidth(5);
}

private void initSurfaceView() {
    touchHelper = TouchHelper.create(surfaceView, callback);

    surfaceView.addOnLayoutChangeListener(new View.OnLayoutChangeListener() {
        @Override
        public void onLayoutChange(View v, int left, int top, int right, int bottom, int oldLeft, int oldTop, int
                oldRight, int oldBottom) {
            if (cleanSurfaceView()){
                surfaceView.removeOnLayoutChangeListener(this);
            }
            List<Rect> exclude = new ArrayList<>();
            exclude.add(getRelativeRect(surfaceView, buttonEraser));
            exclude.add(getRelativeRect(surfaceView, buttonPen));
            exclude.add(getRelativeRect(surfaceView, cbRender));

            Rect limit = new Rect();
            surfaceView.getLocalVisibleRect(limit);
            touchHelper.setStrokeWidth(3.0f)
                    .setLimitRect(limit, exclude)
                    .openRawDrawing();
        }
    });

}

//************************ // ************************

public Rect getRelativeRect(final View parentView, final View childView) {
    int [] parent = new int[2];
    int [] child = new int[2];
    parentView.getLocationOnScreen(parent);
    childView.getLocationOnScreen(child);
    Rect rect = new Rect();
    childView.getLocalVisibleRect(rect);
    rect.offset(child[0] - parent[0], child[1] - parent[1]);
    return rect;
}

private boolean cleanSurfaceView() {
    if (surfaceView.getHolder() == null) {
        return false;
    }
    Canvas canvas = surfaceView.getHolder().lockCanvas();
    if (canvas == null) {
        return false;
    }
    canvas.drawColor(Color.WHITE);
    surfaceView.getHolder().unlockCanvasAndPost(canvas);
    return true;
}

//***************************** // *********************************

private void drawRect(TouchPoint endPoint){

    Canvas canvas = surfaceView.getHolder().lockCanvas();
    if (canvas == null ) {
        return;
    }

    if (startPoint == null || endPoint == null) {
        surfaceView.getHolder().unlockCanvasAndPost(canvas);
        return;
    }

    canvas.drawColor(Color.WHITE);
    canvas.drawRect(startPoint.getX(), startPoint.getY(), endPoint.getX(), endPoint.getY(), paint);

    Log.d(TAG,"drawRect ");
    surfaceView.getHolder().unlockCanvasAndPost(canvas);
}

private RawInputCallback callback = new RawInputCallback() {

    @Override
    public void onBeginRawDrawing(boolean b, TouchPoint touchPoint) {
        Log.d(TAG, "onBeginRawDrawing");
        startPoint = touchPoint;
        Log.d(TAG,touchPoint.getX() +", " +touchPoint.getY());
        countRec = 0;

    }

    @Override
    public void onEndRawDrawing(boolean b, TouchPoint touchPoint) {
        Log.d(TAG, "onEndRawDrawing");
        if (!cbRender.isChecked()){
            drawRect(touchPoint);
        }
        Log.d(TAG,touchPoint.getX() +", " +touchPoint.getY());
        build();
    }

    @Override
    public void onRawDrawingTouchPointMoveReceived(TouchPoint touchPoint) {
        Log.d(TAG, "onRawDrawingTouchPointMoveReceived");
        Log.d(TAG,touchPoint.getX() +", " +touchPoint.getY());
        countRec++;
        countRec = countRec % INTERVAL;
        if (!cbRender.isChecked() && countRec == INTERVAL - 1 ){
            drawRect(touchPoint);
        }
        Log.d(TAG,"countRec = " + countRec);

    }

I guess the display data for the SurfaceView isn't even accessible to the app processor, it may be the output of a hardware video pipeline that is composited with the display output of the app processor through a dedicated overlay. 我猜想SurfaceView的显示数据甚至无法被应用处理器访问,它可能是硬件视频管道的输出,该管道通过专用覆盖层与应用处理器的显示输出复合在一起。

Solve It, i added a another canvas and from the touchHelper i get the raw data then draw the strokes in the new canvas 解决它,我添加了另一个画布,并从touchHelper中获取了原始数据,然后在新画布中绘制了笔触

 @Override
    public void onBeginRawDrawing(boolean b, TouchPoint touchPoint) {
        Log.d(TAG, "onBeginRawDrawing");
        startPoint = touchPoint;
        Log.d(TAG,touchPoint.getX() +", " +touchPoint.getY());
        countRec = 0; 
        if (baseBitmap == null) {
            baseBitmap = Bitmap.createBitmap(iv_canvas.getWidth(),
                    iv_canvas.getHeight(), Bitmap.Config.ARGB_8888);
            canva = new Canvas(baseBitmap);
            canva.drawColor(Color.WHITE);
            iv_canvas.setImageBitmap(baseBitmap);

        }
    }

//*********************** // ***********************

 @Override
    public void onRawDrawingTouchPointMoveReceived(TouchPoint touchPoint) {
        Log.d(TAG, "onRawDrawingTouchPointMoveReceived");
        Log.d(TAG,touchPoint.getX() +", " +touchPoint.getY());
        countRec++;
        countRec = countRec % INTERVAL;
        if (!cbRender.isChecked() && countRec == INTERVAL - 1 ){
            drawRect(touchPoint);
        }
        Log.d(TAG,"countRec = " + countRec);

        canva.drawLine(startPoint.x, startPoint.y, touchPoint.x, touchPoint.y, paint);
        startPoint=touchPoint;
    }

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM