2009-06-19 13 views
17

que han creado una RoundIcon clase que se extiende Vista y la clase contiene setIconImage método():Android: ¿Cómo volver a dibujar un elemento gráfico?

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

y existe un método 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(); 
} 

El problema es que la función onDraw() no se ejecuta cada vez que se llama al método setIconImage() desde la actividad principal y, por lo tanto, el icono no cambia en la interfaz de usuario.

¿Alguien sabe cómo modificar el código para volver a dibujar una imagen cada vez que se llama al método setIconImage?

Respuesta

42

intentar llamar a View.invalidate() en lugar de View.refreshDrawableState()

Invalidate le dirá la opinión de que todos los píxeles de la vista que tenga que volver a dibujar, si sólo se está actualizando un área más pequeña de la vista mirada hacia el invalidate (Rect) sobrecarga para un aumento de rendimiento.

7

Definitivamente llamada invalidar en lugar de refreshDrawableState(). Es posible que desee comprobar qué hilo tiene activado y si está en segundo plano, llame a postInvalidate().

Cuestiones relacionadas