开发者

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:

  1. You don't set a Bitmap for your Canvas object.
  2. I think that you want to move content of the 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));


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.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜