Question

I have RelativeLayout and I want to convert it to the Bitmap like this:

public static Bitmap getBitmapFromView(View view) {
    if (view != null)
    { Bitmap returnedBitmap = Bitmap.createBitmap(view.getWidth(), view.getHeight(),Bitmap.Config.ARGB_8888);
    Canvas canvas = new Canvas(returnedBitmap);
    Drawable bgDrawable =view.getBackground();
    if (bgDrawable!=null) 
        bgDrawable.draw(canvas);
    else 
        canvas.drawColor(Color.WHITE);
    view.draw(canvas);
    return returnedBitmap;
    }
    else 
        return null;
}

then I create RelativeLayout cView in the onCreate() method dynamically and set it to the ImageView like this:

 dialer = (ImageView) findViewById(R.id.imageView_ring);
 dialer.setImageBitmap(getBitmapFromView(cView));

and get error:

05-20 13:48:27.509: E/AndroidRuntime(28367): 
  java.lang.RuntimeException: Unable to start activity 
 ComponentInfo{ru.biovamp.widget/ru.biovamp.widget.TestCircleAct}:
 java.lang.IllegalArgumentException: width and height must be > 0

I also tried to add bitmap to the ImageView from the onStart() method, but got the same result. What solution can I use?

Was it helpful?

Solution

I've solved my issue like this:

  public  Bitmap getBitmapFromView() {
    this.measure(MeasureSpec.makeMeasureSpec(createNewRelativeLayoutParams().width, MeasureSpec.UNSPECIFIED),
            MeasureSpec.makeMeasureSpec(createNewRelativeLayoutParams().height, MeasureSpec.UNSPECIFIED));
    this.layout(0, 0, this.getMeasuredWidth(), this.getMeasuredHeight());
    Bitmap returnedBitmap = Bitmap.createBitmap(this.getMeasuredWidth(), this.getMeasuredHeight(), Bitmap.Config.ARGB_8888);
    Canvas c = new Canvas(returnedBitmap);
    this.draw(c);
    return returnedBitmap;
}

so solution is that we should to call measure() and layout() methods before drawing it.

oficial explaniton

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top