How to make any view to draw to canvas?
Yeah, you can do this. Keep in mind, since you're not attaching it to a layout, you'll need to lay it out manually before drawing it:
view.layout(0, 0, viewWidth, viewHeight);
And unless you just know exactly what you want for those width and height parameters, you may also want to measure it first:
int widthSpec = MeasureSpec.makeMeasureSpec (ViewGroup.LayoutParams.WRAP_CONTENT, MeasureSpec.UNSPECIFIED;int heightSpec = MeasureSpec.makeMeasureSpec (400, MeasureSpec.UNSPECIFIED;view.measure(widthSpec, heightSpec);view.layout(0, 0, view.getMeasuredWidth(), view.getMeasuredHeight());
EDIT:
If you already know the width and height you need:
//Lay the view out with the known dimensionsview.layout (0, 0, rect.width(), rect.height());//Translate the canvas so the view is drawn at the proper coordinatescanvas.save();canvas.translate(rect.left, rect.top);//Draw the View and clear the translationview.draw(canvas);canvas.restore();
EDIT again:
Yes, tested. You can try this yourself:
public class DrawingActivity extends Activity { public void onCreate (Bundle savedInstanceState) { super.onCreate(savedInstanceState); //Set a Rect for the 200 x 200 px center of a 400 x 400 px area Rect rect = new Rect(); rect.set(100, 100, 300, 300); //Allocate a new Bitmap at 400 x 400 px Bitmap bitmap = Bitmap.createBitmap(400, 400, Bitmap.Config.ARGB_8888); Canvas canvas = new Canvas(bitmap); //Make a new view and lay it out at the desired Rect dimensions TextView view = new TextView(this); view.setText("This is a custom drawn textview"); view.setBackgroundColor(Color.RED); view.setGravity(Gravity.CENTER); //Measure the view at the exact dimensions (otherwise the text won't center correctly) int widthSpec = View.MeasureSpec.makeMeasureSpec(rect.width(), View.MeasureSpec.EXACTLY); int heightSpec = View.MeasureSpec.makeMeasureSpec(rect.height(), View.MeasureSpec.EXACTLY); view.measure(widthSpec, heightSpec); //Lay the view out at the rect width and height view.layout(0, 0, rect.width(), rect.height()); //Translate the Canvas into position and draw it canvas.save(); canvas.translate(rect.left, rect.top); view.draw(canvas); canvas.restore(); //To make sure it works, set the bitmap to an ImageView ImageView imageView = new ImageView(this); imageView.setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT)); setContentView(imageView); imageView.setScaleType(ImageView.ScaleType.CENTER); imageView.setImageBitmap(bitmap); }}