2011-03-26 1 views
2

J'ai le code suivant à mon avis personnalisé qui étend EditText:Comment définir drawable sur l'arrière-plan de View? 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); 
      } 

Pourquoi est-il rien sur backgroind de ce point de vue?

Répondre

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

Je suis content que vous ayez résolu le problème. – Michael

3

Je pense que vous essayez de faire quelque chose qui peut être fait plus facilement. Cependant, votre code ne fonctionne pas parce que:

  1. Vous ne définissez pas Bitmap pour votre objet Canvas.
  2. Je pense que vous voulez déplacer le contenu du Canvas vers le Drawable mais en fait votre code effectue une action inverse. En fait, vous dessinez le Drawable sur l'objet Canvas. Essayez ceci:
 
    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

Merci beaucoup, mais maintenant j'ai 2 problèmes: 1. Sa couleur noire de ce bitmap. 2. android: padding agit sur ce fond (.Je veux juste mettre le padding gauche pour le texte dans cette vue - http://i.imgur.com/1doN8.png – Divers

+0

Utilisez 'Canvas.drawColor()' pour changer la couleur de 'Bitmap'. Pouvez-vous décrire votre objectif en détail? – Michael

+0

Je fais un edittext personnalisé avec linenumbering, mais le problème est que le texte de l'utilisateur est superposé sur le dessus dessinez le texte, comme vous pouvez le voir sur l'image – Divers

1

Vous n'avez pas besoin de créer un nouvel objet Canvas. OnDraw en crée un pour vous et le définit dans son propre bitmap. Utilisez simplement le nom du canevas spécifié dans les paramètres (dans ce cas, canvas).

OnDraw est appelée chaque fois que votre vue est créée ou que invalidate() est appelée. Et dans votre méthode onDraw(), vous créez un nouvel objet canvas. Si vous utilisez ce code pour quelque chose de graphiquement intense (comme un jeu) alors vous fuyez la mémoire. Même si vous ne dessinez votre point de vue qu'une seule fois, ce n'est pas la meilleure façon de le faire. Utilisez le canevas fourni dans les paramètres onDraw().

Questions connexes