How to set canvas as background for layout - android

In my application i have designed a canvas. I want to set the canvas as background Resource for my layout.Can any one help me how to do.
Thanks in advance

Yon need a Bitmap for this purpose. And the you can set the Bitmap as background for your layout.
public Canvas (Bitmap bitmap)
From the doc:
Construct a canvas with the specified bitmap to draw into

Related

Get the background of an ImageButton as a bitmap

I have a canvas and an ImageButton. I am trying to get the background image of my ImageButton and set it as the background image of my canvas. My canvas uses the drawBitmap() function to set it's background, so it takes in a bitmap. However, the getBackground() function for my ImageButton returns a drawable.
How do I get the background of my ImageButton and set it to the background of my canvas?
canvas.setBackground(drawableFromImageButton.getConstantState().newDrawable());
when canvas is view, setBackground method is applicable.
You can get the Bitmap from the Drawable as following way
Drawable drawable = imageButton.getBackground();
Bitmap bitmap = ((BitmapDrawable)drawable).getBitmap();
try like this. it might be helpful.
Drawable drawable = imageButton.getDrawable();
Bitmap bitmap = ((BitmapDrawable)drawable).getBitmap();
after that call
canvas.setBitmap(bitmap);
If you making a custom Canvas you can directly set drawable to set the background.
Follow this-
customCanvas.setBackground(imageview.getBackground());
The documentation says like tbis-
void setBackground(Drawable background)
Set the background to a given Drawable, or remove the background.
The draw is used only to draw on tope of the canvas.
I hope this would help you.

create a bitmap with a bitmap inside

I know - the title may sounds strange. Let me explain:
I created an image to show you, what I'm talking about:
I got an image (Bitmap (1)), that as the size of 150w/200h.
Now I need to make the bitmap bigger ((2) 400w/400h), but the original image must have the same size. So that the image is embedded in white background.
I think one way to solve it is this:
* create a big bitmap
* create a canvas for it
* draw the original bitmap on the canvas
* draw the canvas
* generate a bitmap of the canvas
The problem for me is, that it must be done in a background thread without drawing a view.
I hope you understand me.
You can use the code bellow to achive it. Where smallBitmap is your original image and bigBitmap is the final image:
Bitmap bigBitmap = Bitmap.createBitmap(width, height , Bitmap.Config.ARGB_8888);
canvas = new Canvas(bigBitmap);
canvas.drawBitmap(smallBitmap, left, top, new Paint());
Regards.
This should do the trick.
Create a thread and in that thread object:
Create a new bitmap.
Create a canvas based on that bitmap.
Draw your bitmap to that canvas
and voila!
I hope this helps.

Is it possible to scale text on a canvas?

I would like to draw text on a canvas using the Canvas.drawText call for a game application, and later be able to scale it as if it was a bitmap object. I do not want to dynamically change its font size, but I want to scale it applying an affine transform.
Is it possible? I cannot find an adequate API call in the documentation.
Thank you!
Using Matrix you can scale it and that apply the matrix tranformation to the canvas with Canvas.concat(Matrix m) . Do this before drawing the text onto the canvas.
Once it's on the Canvas, it's not a separate object that you can do anything to. What you can do is use the Canvas as an API for drawing to a bitmap:
Create a Bitmap.
Create a Canvas backed by that Bitmap.
Draw your text into the Canvas.
Hang on to your Bitmap and do whatever you want with it.

Android: BitmapDrawable.Draw(Canvas) Doesn't seem to work

I am trying to tile a 20x20 background onto my Custom View but for some reason I am unable too.
BitmapDrawable background;
background = new BitmapDrawable(BitmapFactory.decodeResource(getResources(), R.drawable.back));
background.setTileModeXY(Shader.TileMode.REPEAT, Shader.TileMode.REPEAT);
background.draw(canvas);
Does anyone have an idea why it isn't working?
You can use BitmapDrawable, but you have to set the bounds first so it knows how much tiling to do:
BitmapDrawable background;
background = new BitmapDrawable(BitmapFactory.decodeResource(getResources(),R.drawable.back));
//in this case, you want to tile the entire view
background.setBounds(0, 0, myView.getWidth(), myView.getHeight());
background.setTileModeXY(Shader.TileMode.REPEAT, Shader.TileMode.REPEAT);
background.draw(canvas);
You are probably getting warnings in your log regarding SKImageDecoder failing. If you are creating the resource via xml you need to retreive it via (BitmapDrawable) getResources().getdrawable(id)
You have it backwards. Instead of passing your View's canvas to the bitmap's draw method, draw your Bitmap to the View's canvas using Canvas.drawBitmap

Tiling a Bitmap on a Canvas

I would like to create a 'graph paper' look to the Bitmap I am drawing via a Canvas, and trying to figure out the best way to do this.
I can't pass a source Bitmap containing the graph paper background to the Canvas constructor, as I am getting the Canvas in a SurfaceView via the .lockCanvas() call.
Some solutions I've tried:
I've tried implementing this solution in my SurfaceView's Thread.run(), but the issue I believe is when the BitmapDrawable is converted to a Bitmap... it loses the tiling properties.
canvas = mSurfaceHolder.lockCanvas(null);
BitmapDrawable TileMe = new BitmapDrawable(BitmapFactory.decodeResource(getResources(), R.drawable.editor_graph));
TileMe.setTileModeX(Shader.TileMode.REPEAT);
TileMe.setTileModeY(Shader.TileMode.REPEAT);
Bitmap b = TileMe.getBitmap();
canvas.drawBitmap(b, 0, 0, null);
If I use the Canvas.drawBitmap method that takes a destination RectF as a parameter, it looks like the bitmap will be tiled to fill the RectF... but how do I declare a RectF reliably that fills the entire view area?
Setting the Activities background to the desired graph paper look also doesn't work, as the bitmap/canvas layout is opaque and blocks that from being seen.
Any ideas how to achieve this?
You have two easy solutions:
Either use a BitmapDrawable, but instead of extracting the Bitmap, just call BitmapDrawable.draw(Canvas). Don't forget to set the drawable's bounds to fill your drawing area.
Create a Paint with a BitmapShader and draw a rectangle with it (this is basically what BitmapDrawable does).
I'm sure there is a way to get a tiled effect using a SurfaceView. Unfortunately, it looks like you can't use the BitmapDrawable with a canvas. So you would probably have to implement you own custom tiling method by creating your own series of Rect's on the Canvas and drawing a scaled bitmap to each one.
It honestly wouldn't be that hard. Just get the width/height of the view, and create an array of Rect's based on this data that you will draw the Bitmap to.
Alternatively, if you don't need to make modifications to the actual tiled background on the fly, just draw it as a background and draw the SurfaceView on top of it. That post you linked provided multiple solutions to tiling a BitmapDrawable that you could implement.

Categories

Resources