2011-03-26 66 views
2

我有下面的代碼在擴展的EditText我的自定義視圖:如何在View的背景上設置drawable? Android的

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); 
      } 

爲什麼會出現什麼這種觀點的backgroind?

回答

5
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); 
} 
+1

我很高興你解決了這個問題。 – Michael 2011-03-27 09:23:11

3

我認爲你正在嘗試做一些可以做得更容易的事情。然而,你的代碼不起作用,因爲:

  1. 您沒有設置Bitmap爲您Canvas對象。
  2. 我認爲你想將Canvas的內容移動到Drawable,但實際上你的代碼會執行相反的操作。實際上,您在Canvas對象上繪製Drawable。試試這個:
 
    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)); 
+0

非常感謝,但現在我有2個問題:1.它的黑色位圖。 2. android:padding在這個背景下運行(我只想在這個視圖中爲文本設置左填充 - http://i.imgur.com/1doN8.png – Divers 2011-03-26 21:28:30

+0

使用'Canvas.drawColor()'改變顏色'Bitmap'。你能詳細描述一下你的目標嗎? – Michael 2011-03-26 21:42:06

+0

我使用linenumbering做自定義的edittext,但問題在於用戶的文本疊加在最上面繪製文本,正如你在圖片上看到的那樣 – Divers 2011-03-26 21:49:14

1

你並不需要創建一個新的Canvas對象。 onDraw會爲您創建一個並將其設置在其自己的位圖中。只需使用參數中指定的畫布的名稱(在本例中爲畫布)即可。

每次創建視圖或調用invalidate()時都會調用onDraw。在你的onDraw()方法中,你正在創建一個NEW畫布對象。如果你使用這個代碼來處理任何圖形密集的事情(比如遊戲),那麼你正在泄漏內存。即使你只畫一次,這也不是最好的方式。使用onDraw()參數中提供的畫布。

相關問題