簡體   English   中英

位圖的Surfaceview返回黑色或Null

[英]surfaceview to bitmap return black or Null

我正在努力捕獲一個Surfaceview並將其保存為位圖,以便稍后可以將其轉換為pdf,我測試了許多方法,但是它們似乎都無法正常工作,我得到的只是一個空位圖或黑色位圖,我已經嘗試過: surfaceView.getDrawingCache(); and surfaceView.getBackground(); surfaceView.getDrawingCache(); and surfaceView.getBackground(); 甚至將其替換為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);

    }

我猜想SurfaceView的顯示數據甚至無法被應用處理器訪問,它可能是硬件視頻管道的輸出,該管道通過專用覆蓋層與應用處理器的顯示輸出復合在一起。

解決它,我添加了另一個畫布,並從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