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?
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
Prova a chiamare destroyDrawingCache() e quindi a buildDrawingCache() ogni volta che cambi un bambino. –
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