Reputation: 9569
I have next code in my custom view that extends EditText:
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
int count = getLineCount();
Canvas cvs= new Canvas();
Drawable dr = this.getBackground();
Rect r = mRect;
Paint paint = mPaint;
mTextPaint.setTextSize(this.getTextSize());
Paint PaintText = mTextPaint;
for (int i = 0; i < count; i++) {
int baseline = getLineBounds(i, r);
cvs.drawText(Integer.toString(i+1), r.left, baseline + 1, PaintText);
cvs.drawLine(r.left, baseline + 1, r.right, baseline + 1, paint);
}
cvs.drawLine(PaintText.measureText(Integer.toString(count)), this.getTop(), PaintText.measureText(Integer.toString(count)), this.getBottom(), paint);
dr.setBounds(0, 0, this.getRight(), this.getBottom());
dr.draw(cvs);
this.setBackgroundDrawable(dr);
}
Why is there nothing on backgroind of this view?
Upvotes: 2
Views: 18693
Reputation: 9569
protected void onDraw(Canvas canvas) {
Bitmap bitmap = Bitmap.createBitmap(this.getWidth(), this.getHeight(), Bitmap.Config.ARGB_8888);
int count = getLineCount();
Canvas cvs= new Canvas(bitmap);
cvs.drawColor(Color.rgb(245, 245, 245));
Rect r = mRect;
Paint paint = mPaint;
mTextPaint.setTextSize(this.getTextSize());
Paint PaintText = mTextPaint;
for (int i = 0; i < count; i++) {
int baseline = getLineBounds(i, r);
cvs.drawText(Integer.toString(i+1), 2, baseline + 1, PaintText);
cvs.drawLine(2, baseline + 1, r.right, baseline + 1, paint);
}
cvs.drawLine(PaintText.measureText(Integer.toString(count))+3, this.getTop(), PaintText.measureText(Integer.toString(count))+3, this.getBottom(), paint);
this.setBackgroundDrawable(new BitmapDrawable(getContext().getResources(), bitmap));
this.setPadding((int) (PaintText.measureText(Integer.toString(count))+7),3,3,3);
super.onDraw(canvas);
}
Upvotes: 5
Reputation: 2660
You do not need to create a new Canvas object. onDraw creates one for you and sets it in its own bitmap. Just use the name of the canvas specified in the parameters (in this case, canvas).
onDraw is called everytime your view is created or invalidate() is called. And in your onDraw() method, you are creating a NEW canvas object. If you are using this code for anything graphically intense (like a game) then you are leaking memory. Even if you only draw your view once, this is not the best way to do so. Use the canvas provided in the onDraw() parameters.
Upvotes: 1
Reputation: 54705
I think you're trying to do something that can be done easier. However, your code doesn't work because:
Bitmap
for your Canvas
object.Canvas
to the Drawable
but in fact your code performs an opposite action. Actually, you draw the Drawable
on the Canvas
object. Try this: Bitmap bitmap = Bitmap.createBitmap(this.getWidth(), this.getHeight(), Bitmap.Config.ARGB_8888); Canvas cvs = new Canvas(bitmap); // Your drawing stuff without dr.setBounds() and dr.draw() this.setBackgroundDrawable( new BitmapDrawable(getContext().getResources(), bitmap));
Upvotes: 3