How to set drawable on background of View? Android
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?
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);
}
I think you're trying to do something that can be done easier. However, your code doesn't work because:
- You don't set a
Bitmap
for yourCanvas
object. - I think that you want to move content of the
Canvas
to theDrawable
but in fact your code performs an opposite action. Actually, you draw theDrawable
on theCanvas
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));
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.
精彩评论