2010-06-15 19 views
15

Explique cómo funciona el caché de dibujo en Android. Estoy implementando una subclase de vista personalizada. Quiero que mi dibujo sea guardado en caché por el sistema. En la vista de constructor, que llamoCaché de dibujo de Android

setDrawingCacheEnabled(true); 

Luego, en el sorteo (lienzo c), que hago:

Bitmap cac = getDrawingCache(); 
    if(cac != null) 
    { 
     c.drawBitmap(cac, 0, 0, new Paint()); 
     return; 
    } 

embargo, la getDrawingCache() vuelve nula para mí. Mi draw() no se llama ni desde setDrawingCacheEnabled(), ni desde getDrawingCache(). Por favor, ¿qué estoy haciendo mal?

+0

duplicado Posible de http://stackoverflow.com/questions/2817166/android-2-1-views-getdrawingcache-method-always-returns-null – Hasturkun

+2

diferente - que uno preocupaciones solicitando una memoria caché para un sistema- siempre vista de niño, esta se trata de construirlo en su propia vista. –

+0

Esto funcionará - http://stackoverflow.com/questions/11560882/call-to-getdrawingcache-fails-on-api-8-everytime – Ronnie

Respuesta

8

Hay un límite estricto en el tamaño del caché de dibujo, disponible a través de la clase ViewConfiguration. Mi vista es más grande que lo permitido para el almacenamiento en caché.

FYI, las fuentes de la clase View están disponibles a través del Administrador de SDK para algunas (no todas) las versiones de Android.

+1

Para evitar que otros se arrastraran a través del código como lo hice, el cheque comienza en línea 6193. –

+0

muchas gracias por esta información. –

+0

El enlace dado de @Seva no funciona ahora y da el error "410". Realmente aprecio si alguien puede editarlo para el enlace correcto. – AnujAroshA

5

Espero que esto lo explique.

public class YourCustomView extends View { 

    private String mSomeProperty; 

    public YourCustomView(Context context) { 
     super(context); 
    } 

    public YourCustomView(Context context, AttributeSet attrs) { 
     super(context, attrs); 
    } 

    public YourCustomView(Context context, AttributeSet attrs, int defStyle) { 
     super(context, attrs, defStyle); 
    } 

    public void setSomeProperty(String value) { 
     mSomeProperty = value; 
     setDrawingCacheEnabled(false); // clear the cache here 
     invalidate(); 
    } 

    @Override 
    protected void onDraw(Canvas canvas) { 
     super.onDraw(canvas); 

     // specific draw logic here 

     setDrawingCacheEnabled(true); // cache 
    } 

    @Override 
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { 
     ... 
    } 

} 

Ejemplo de código explicado.

  1. En la llamada al método setSomeProperty() setDrawingCacheEnabled (falso) para borrar la memoria caché y forzar un redibujo llamando invalida().
  2. Llamar setDrawingCacheEnabled (true) en el método onDraw después de dibujar en el lienzo.
  3. Opcionalmente, coloque una declaración de registro en el método onDraw para confirmar que solo se llame una vez cada vez que llame al método setSomeProperty(). Asegúrese de eliminar la llamada de registro una vez confirmada, ya que esto se convertirá en un problema de rendimiento.
+3

Esto realmente funciona, porque la documentación parece explicarlo de manera diferente: Habilita o deshabilita la memoria caché de dibujo. Cuando la memoria caché de dibujo está habilitada, ** la siguiente llamada a getDrawingCache() o buildDrawingCache() dibujará la vista en un mapa de bits ** Si agrego esas líneas o no, onDraw() solo se llama una vez cada vez que call invalidate() Probado: la memoria caché no se utiliza. – 3c71

+2

Esto está mal. Solo necesita habilitar la memoria caché de dibujo y se completará en cada llamada para dibujar. En realidad, esto no funcionará porque la memoria caché de dibujo no se habilitará en la primera llamada a onDraw. – dcow

Cuestiones relacionadas