2009-06-19 4 views
17

J'ai créé un RoundIcon de classe qui étend vue et la classe contient setIconImage() Méthode:Android: Comment redessiner un élément graphique?

public void setIconImage(int imageFromResources) { 
    iconImage = BitmapFactory.decodeResource(getResources(), imageFromResources); 
    iconWidth = iconImage.getWidth(); 
    iconHeight = iconImage.getHeight(); 
    refreshDrawableState(); 
} 

et il existe une méthode onDraw():

@Override 
protected void onDraw(Canvas canvas) { 

    if(px == 0 || py == 0) 
    { 
     px = 50; 
     py = 50; 
    } 


    canvas.drawCircle(px, py, circleRadius, circlePaint); 
    canvas.save(); 

    if(iconImage != null) 
    { 
     int cardinalX = px - iconWidth/2; 
     int cardinalY = py - iconHeight/2; 
     canvas.drawBitmap(iconImage, cardinalX, cardinalY, iconPaint); 
    } 

    canvas.restore(); 
} 

Le problème est que la fonction onDraw() ne s'exécute pas à chaque fois que la méthode setIconImage() est appelée depuis l'activité principale et que par conséquent l'icône ne change pas dans l'interface utilisateur.

Est-ce que quelqu'un sait comment modifier le code afin de redessiner une image à chaque fois que la méthode setIconImage est appelée?

Répondre

42

Essayez d'appeler View.invalidate() au lieu de View.refreshDrawableState()

Invalider racontera l'idée que tous les pixels de la vue ont besoin d'être redessinées, si vous mettez à jour seulement une zone plus petite du regard de vue sur la invalidate (Rect) surcharge pour une amélioration des performances.

7

Appelez définitivement invalidate au lieu de refreshDrawableState(). Vous voudrez peut-être vérifier le fil sur lequel vous vous trouvez et si vous appelez un postInvalidate() en arrière-plan.