2012-11-12 26 views
12

Sto provando ad applicare un effetto visivo a un gruppo di vista. La mia idea è quella di prendere una bitmap del viewgroup, ridurla, estenderla di nuovo e disegnarla sul viewgroup per dargli un effetto di bassa qualità e di blocco.Disegno su una vista e su tutti i suoi bambini

Ho la maggior parte del modo in cui si utilizza questo codice:

public class Blocker { 

    private static final float RESAMPLE_QUALITY = 0.66f; // less than 1, lower = worse quality 


    public static void block(Canvas canvas, Bitmap bitmap_old) { 
     block(canvas, bitmap_old, RESAMPLE_QUALITY); 
    } 


    public static void block(Canvas canvas, Bitmap bitmap_old, float quality) { 
     Bitmap bitmap_new = Bitmap.createScaledBitmap(bitmap_old, Math.round(bitmap_old.getWidth() * RESAMPLE_QUALITY), Math.round(bitmap_old.getHeight() * RESAMPLE_QUALITY), true); 
     Rect from = new Rect(0, 0, bitmap_new.getWidth(), bitmap_new.getHeight()); 
     RectF to = new RectF(0, 0, bitmap_old.getWidth(), bitmap_old.getHeight()); 
     canvas.drawBitmap(bitmap_new, from, to, null); 
    } 
} 

ho semplicemente passare nella tela di attingere e una bitmap di ciò che deve essere ridotta + e funziona bene.

public class BlockedLinearLayout extends LinearLayout { 

    private static final String TAG = BlockedLinearLayout.class.getSimpleName(); 


    public BlockedLinearLayout(Context context, AttributeSet attrs) { 
     super(context, attrs); 
     applyCustomAttributes(context, attrs); 
     setup(); 
    } 


    public BlockedLinearLayout(Context context) { 
     super(context); 
     setup(); 
    } 


    private void setup() { 
     this.setDrawingCacheEnabled(true); 
    } 


    @Override 
    public void draw(Canvas canvas) { 
     super.draw(canvas); 
     // block(canvas); If I call this here, it works but no updates 
    } 


    @Override 
    public void onDraw(Canvas canvas) { 
     // block(canvas); If I call this here, draws behind children, still no updates 
    } 

    private void block(Canvas canvas) { 
     Blocker.block(canvas, this.getDrawingCache()); 
    } 
} 

Il problema riscontrato è nel mio gruppo di vista. Se eseguo il metodo di blocco nell'estrazione del gruppo di vista, disegna tutto ma non si aggiorna mai quando cambiano le viste secondarie. Ho rintracciato le chiamate di funzione con Log e il metodo di estrazione sembra essere in esecuzione, ma non cambia nulla.

Ho anche provato a implementarlo in onDraw. Ciò disegna la bitmap dietro tutte le viste dei bambini, e ancora non si stanno aggiornando.

Qualcuno può spiegare come risolverei questo problema?

risposta

34

Prova questo:

@Override 
protected void dispatchDraw(Canvas canvas) { 
    // call block() here if you want to draw behind children 
    super.dispatchDraw(canvas); 
    // call block() here if you want to draw over children 
} 

E chiama destroyDrawingCache() e poi, buildDrawingCache() ogni volta che si cambia un bambino.

+0

Grazie per il suggerimento. Sfortunatamente questo funziona per disegnare sopra tutti i bambini, ma se i bambini vengono aggiornati dopo l'estrazione iniziale, la vista non viene aggiornata. Ad esempio, ho un layout lineare con una sola textview che inizia da 1 e aumenta ogni secondo. Riesco a vedere il conteggio dei numeri, ma l'allineamento lineare si limita a disegnare con un 1 e quindi non cambia. – raydowe

+0

Prova a chiamare destroyDrawingCache() e quindi a buildDrawingCache() ogni volta che cambi un bambino. –

+0

Grazie! Sembra che funzioni abbastanza bene. Ho intenzione di giocarci un po ', ma sai se c'è un modo per rilevare il cambio di bambino dalla vista genitore? Mi piacerebbe essere in grado di far gestire automaticamente al genitore tutto quello che i bambini stanno cambiando, invece di dire esplicitamente al viewgroup padre di ricodificare ogni volta che faccio qualcosa. – raydowe

Problemi correlati