Próbuję zbudować LayerDrawable w formacie xml, gdzie górne warstwy będą od czasu do czasu całkowicie zasłaniały niższe warstwy. Aby zmniejszyć dolne warstwy, używam InsetDrawable do owijania kolejnej operacji przeciągania, aby był mniejszy niż pełny rozmiar widoku. Jednakże niespodziewanie stwierdzam, że każda warstwa umieszczona na wierzchu warstwy zawierającej wkładkę ma również nałożoną na nią wkładkę. Nie mogę znaleźć dokumentacji wspierającej to zachowanie i jestem zdezorientowany, dlaczego tak się stało.Nieoczekiwane zachowanie LayerDrawable podczas rysowania warstw zawierających InsetDrawable's
W poniższym przykładzie wykonuję LayerDrawable z 3 warstwami. Dolna i górna warstwa zawiera rysunki w kształcie owalnym, które mają zająć cały widok. Środkowa warstwa to prostokąt do narysowania wewnątrz InsetDrawable. Kod jest poniżej:
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android" >
<item>
<shape android:shape="oval" >
<solid android:color="#00ff00" />
</shape>
</item>
<item>
<inset
android:insetBottom="4dp"
android:insetLeft="4dp"
android:insetRight="4dp"
android:insetTop="4dp" >
<shape android:shape="rectangle" >
<solid android:color="#ff0000" />
</shape>
</inset>
</item>
<item>
<shape android:shape="oval" >
<solid android:color="#0000ff" />
</shape>
</item>
</layer-list>
Wywołanie setBackgroundDrawable(getResources().getDrawable(drawableId));
moim zdaniem daje zielony owal, który wypełnia cały widok, jak oczekiwano, z czerwonym prostokątem wstawka 4DP zgodnie z oczekiwaniami, ale niebieski owal na górnej warstwy jest również wstawka 4DP i narysowany całkowicie w granicach czerwonego prostokąta.
Oczekuję, że niebieski owal całkowicie zasłoni zielony owal i większość czerwonego prostokąta, ale zamiast tego jest wstawiony wewnątrz czerwonego prostokąta. Czy jest jakikolwiek sposób, aby niebieskie kółko wypełniło widok, a jednocześnie trzymało go na wierzchu?
Zgadzam się. Wydaje się sprzeczne z intuicją, że wciągany pojemnik w taki sposób może wpływać na przeciąganie pojemnika. Dziękuję za Twoją odpowiedź. – happydude
Wygląda na to, że właściwość 'paddingMode' została dodana w celu rozwiązania tego problemu. Ale jak możemy zachować zgodność na starszych platformach? – 500865
Jeszcze gorzej w selektorze, gdzie wydaje się wpływać nawet na różne stany! – JohnyTex