2

I am drawing on custom view.then drawn image is converted into bitmap for further processing but when I do Bitmap bitmap = drawView1.getDrawingCache();the bitmap is null. Why it is null.and how to solve it

public class TrainingActivity extends ActionBarActivity {
    private DrawingView drawView1;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_training);
        drawView1 = (DrawingView) findViewById(R.id.drawing1);
      }

public void submitButtonClicked(View v) {
    Bitmap bitmap = drawView1.getDrawingCache();
}

xml file for custom view is

<persistent.DrawingView
        android:id="@+id/drawing1"
        android:layout_width="fill_parent"
        android:layout_height="0dp"
        android:layout_marginBottom="3dp"
        android:layout_marginLeft="5dp"
        android:layout_marginRight="5dp"
        android:layout_marginTop="3dp"
        android:layout_weight="1"
        android:background="#FFFFFFFF" />

And also my DrawingView class is

public class DrawingView extends View {
    //drawing path
    private Path drawPath;
    //drawing and canvas paint
    private Paint drawPaint, canvasPaint;
    //initial color
    //private int paintColor = 0xFF660000;
    private int paintColor = 0xFF000000;
    //canvas
    private Canvas drawCanvas;
    //canvas bitmap
    private Bitmap canvasBitmap;
    private Context mContext;

    public DrawingView(Context context, AttributeSet attrs) {
        super(context, attrs);
        mContext = context;
        setupDrawing();
    }

    private void setupDrawing() {
//get drawing area setup for interaction
        drawPath = new Path();
        drawPaint = new Paint();
        drawPaint.setColor(paintColor);
        drawPaint.setAntiAlias(true);
        drawPaint.setStrokeWidth(20);
        drawPaint.setStyle(Paint.Style.STROKE);
        drawPaint.setStrokeJoin(Paint.Join.ROUND);
        drawPaint.setStrokeCap(Paint.Cap.ROUND);
        canvasPaint = new Paint(Paint.DITHER_FLAG);
       /* DisplayMetrics metrics = new DisplayMetrics();
        ((Activity) mContext).getWindowManager().getDefaultDisplay().getMetrics(metrics);
        int width = metrics.widthPixels;
        int height = metrics.heightPixels;
        drawCanvas.drawRect(100, height - 100, width - 100, 100, drawPaint);*/


    }

    @TargetApi(Build.VERSION_CODES.KITKAT)
    @Override
    protected void onSizeChanged(int w, int h, int oldw, int oldh) {

//view given size
        super.onSizeChanged(w, h, oldw, oldh);
        canvasBitmap = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888);
        drawCanvas = new Canvas(canvasBitmap);

        int leftx = 70;
        int topy = 70;
        Paint rectPaint=new Paint();
        rectPaint.setColor(Color.BLUE);
        rectPaint.setAntiAlias(true);
        rectPaint.setStrokeWidth(9);
        rectPaint.setStyle(Paint.Style.STROKE);
        rectPaint.setStrokeJoin(Paint.Join.ROUND);
        rectPaint.setStrokeCap(Paint.Cap.ROUND);

        drawCanvas.drawRect(leftx, topy, w-leftx, h-topy, rectPaint);

        Rect r=new Rect(leftx, topy, w-topy, h-topy);
        drawCanvas.clipRect(r);





    }

    @Override
    protected void onDraw(Canvas canvas) {
//draw view
        canvas.drawBitmap(canvasBitmap, 0, 0, canvasPaint);
        canvas.drawPath(drawPath, drawPaint);




    }

    public boolean onTouchEvent(MotionEvent event) {
        //detect user touch
        float touchX = event.getX();
        float touchY = event.getY();
        switch (event.getAction()) {
            case MotionEvent.ACTION_DOWN:
                drawPath.moveTo(touchX, touchY);
                break;
            case MotionEvent.ACTION_MOVE:
                drawPath.lineTo(touchX, touchY);
                break;
            case MotionEvent.ACTION_UP:
                drawCanvas.drawPath(drawPath, drawPaint);
                drawPath.reset();
                break;
            default:
                return false;
        }
        invalidate();
        return true;
    }

    //for erasing purpose this function will be called
    public void setErase(boolean isErase) {
        //set erase true or false
        boolean erase = isErase;
        if (erase) {
            //drawPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.CLEAR));
            drawCanvas.drawColor(0, PorterDuff.Mode.CLEAR);
        } else {
            drawPaint.setXfermode(null);
        }

    }


}
Mirza
  • 97
  • 1
  • 13
  • I think you should enable the [drawing cache](http://developer.android.com/reference/android/view/View.html#setDrawingCacheEnabled%28boolean%29) first. – Gent Ahmeti Jun 30 '15 at 07:41

1 Answers1

3

What I understand was getDrawingCache() method has the limit on the View class's size(width and height). If the View class is too big, getDrawingCache() simply returns null. So, the solution was not to use the method and instead do it like below.

Bitmap bitmap = Bitmap.createBitmap(drawView1.getMeasuredWidth(), drawView1.getMeasuredHeight(), Bitmap.Config.ARGB_8888);
    Canvas bitmapHolder = new Canvas(bitmap);
    drawView1.draw(bitmapHolder);
// bitmap now contains the data we need! Do whatever with it!.

I got this answer by following the comment given by this guy getDrawingCache() returns null

Community
  • 1
  • 1
Mirza
  • 97
  • 1
  • 13