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ć?
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
Spróbuj wywołać metodę destroyDrawingCache(), a następnie buildDrawingCache() za każdym razem, gdy zmieniasz dziecko. –
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