How to make any view to draw to canvas? How to make any view to draw to canvas? android android

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);    }}