Starasz się rozwiązać ten problem za pomocą hierarchii widok jak to:
Problem jest w tym położeniu, InverterView
nie ma kontroli nad jak narysowany jest ListView
. Ale czy wiesz, kto ma kontrolę nad sposobem rysowania ListView
? Macierzowy układ ListView
. Innymi słowy, co naprawdę chcesz to hierarchia tak:
Teraz InverterLayout
jest odpowiedzialny za opracowanie ListView
, można zastosować efekty do niego.
class InverterLayout extends FrameLayout
{
// structure to hold our color filter
private Paint paint = new Paint();
// the color filter itself
private ColorFilter cf;
// the rectangle we want to invert
private Rect inversion_rect = new Rect(100, 100, 300, 300);
public InverterLayout(Context context)
{
super(context);
// construct the inversion color matrix
float[] mat = new float[]
{
-1, 0, 0, 0, 255,
0, -1, 0, 0, 255,
0, 0, -1, 0, 255,
0, 0, 0, 1, 0
};
cf = new ColorMatrixColorFilter(new ColorMatrix(mat));
}
@Override protected void dispatchDraw(Canvas c)
{
// create a temporary bitmap to draw the child views
Bitmap b = Bitmap.createBitmap(getWidth(), getHeight(), Config.ARGB_8888);
Canvas cc = new Canvas(b);
// draw them to that temporary bitmap
super.dispatchDraw(cc);
// copy the temporary bitmap to screen without the inversion filter
paint.setColorFilter(null);
c.drawBitmap(b, 0, 0, paint);
// copy the inverted rectangle
paint.setColorFilter(cf);
c.drawBitmap(b, inversion_rect, inversion_rect, paint);
}
}
Przy zastosowaniu tego zapewnić Pana zdaniem dziecko ma swoje własne tło. Jeśli widok jest przezroczysty i widać tło okna, to tło okna nie zostanie odwrócone, ponieważ InverterLayout
nie ma kontroli nad sposobem rysowania okna.