Как установить рисование на фоне View?Android - PullRequest
2 голосов
/ 26 марта 2011

У меня есть следующий код в моем пользовательском представлении, который расширяет 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);
            }

Почему на заднем плане этого представления ничего нет?

Ответы [ 3 ]

5 голосов
/ 27 марта 2011
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);
}
3 голосов
/ 26 марта 2011

Я думаю, вы пытаетесь сделать что-то, что можно сделать проще. Однако ваш код не работает, потому что:

  1. Вы не установили Bitmap для вашего Canvas объекта.
  2. Я думаю, что вы хотите переместить содержимое Canvas в Drawable, но на самом деле ваш код выполняет противоположное действие. На самом деле, вы рисуете Drawable на Canvas объекте. Попробуйте это:
    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));
1 голос
/ 28 марта 2011

Вам не нужно создавать новый объект Canvas.OnDraw создает один для вас и устанавливает его в своем собственном растровом изображении.Просто используйте имя холста, указанное в параметрах (в данном случае, canvas).

onDraw вызывается каждый раз, когда создается ваше представление или вызывается invalidate ().И в вашем методе onDraw () вы создаете НОВЫЙ объект canvas.Если вы используете этот код для чего-то графически насыщенного (например, для игры), значит, вы теряете память.Даже если вы рисуете только один раз, это не лучший способ сделать это.Используйте холст, предоставленный в параметрах onDraw ().

...