2012-11-12 13 views
12

Próbuję zastosować efekt wizualny do grupy widoku. Chodzi mi o to, by pobrać bitmapę z grupy view, pomniejszyć ją, powiększyć ją i narysować nad grupą view, aby nadać jej efekt klocków i niskiej jakości.Rysowanie widoku i wszystkich jego dzieci

Mam większość drogi tam przy użyciu tego kodu:

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); 
    } 
} 

po prostu przejść na płótnie rysować i na bitmapy, co musi być skalowane w dół + w górę i to działa dobrze.

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()); 
    } 
} 

Problem, który mam, jest w mojej grupie view. Jeśli uruchomię metodę blokowania w losowaniu grupy, rysuje ona wszystko, ale nie aktualizuje się, gdy zmieniają się widoki podrzędne. Wyszukałem wywołania funkcji za pomocą Logu, a metoda rysowania wydaje się działać, ale nic się nie zmienia.

Próbowałem również wdrożyć to w onDraw. Rysuje bitmapę za wszystkimi widokami podrzędnymi i ponownie nie są one aktualizowane.

Czy ktoś może wyjaśnić, jak to naprawić?

Odpowiedz

34

Spróbuj tego:

@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 
} 

I zadzwonić destroyDrawingCache(), a następnie, buildDrawingCache() każdej zmianie dziecka.

+0

Dzięki za sugestię. Niestety działa to przy rysowaniu nad wszystkimi dziećmi, ale jeśli dzieci są aktualizowane po pierwszym losowaniu, widok nie jest aktualizowany. Na przykład, mam układ liniowy z pojedynczym widokiem tekstowym, który zaczyna się od 1 i wzrasta co sekundę. Widzę, że liczba się liczy, ale Linelayout po prostu rysuje 1, a potem się nie zmienia. – raydowe

+0

Spróbuj wywołać metodę destroyDrawingCache(), a następnie buildDrawingCache() za każdym razem, gdy zmieniasz dziecko. –

+0

Dzięki! Wydaje się, że działa całkiem dobrze. Mam zamiar trochę się z tym bawić, ale czy wiesz, że istnieje sposób na wykrycie zmiany dziecka z widoku rodzica? Chciałbym mieć możliwość, aby rodzic automatycznie obsługiwał wszystkie swoje dzieci, zamiast jawnie powiadamiać nadrzędną grupę przeglądową, aby za każdym razem je robił. – raydowe