2011-09-26 15 views
15

Czy można maskować widoki? Na przykład, jeśli mam projekt, który wymaga, aby widok listy był widoczny w otworze o owalnym kształcie. Czy istnieje sposób na utworzenie maski dla widoku? Czy to się nazywa coś innego? Ponieważ wszystkie odniesienia do maskowania w dokumentach Androida mówią o maskowaniu płótna lub rysowania. Ale nie wydaje mi się, aby tworzenie interaktywnego obiektu, takiego jak widok listy, było dobrym podejściem. Czy na razie jest to tylko ograniczenie?Czy można ukryć widok w systemie Android?

Odpowiedz

30

Tak, to jest - trzeba zastąpić metodę rysowania widoku - tj:

...... 
final Path path = new Path(); 
path.addRoundRect(new RectF(0,0,getWidth(),getHeight()),10,10,Direction.CW); 
...... 
@Override 
protected void dispatchDraw(Canvas canvas){ 
    canvas.clipPath(path); 
    super.dispatchDraw(canvas); 
} 

to wyciągnie swój pogląd tylko w granicach określonych przez ścieżkę.

+1

Można również tworzyć cokolwiek „Maska” efekt chcesz i po prostu umieścić go na swój własny pogląd i umieścić go ontop/przed widzenia w kwestii . Jeśli potrzebujesz tego efektu tylko dla jednego określonego widoku, zaoszczędzisz sobie trudu tworzenia własnych widoków i edycji metod rysowania. – FoamyGuy

+0

To byłoby zupełnie nie w porządku, Tim. Zmniejszysz swoją aplikację, tworząc zupełnie niepotrzebną hierarchię widoków na platformie mobilnej, gdzie wydajność jest kluczowa. – asenovm

+0

Zgadzam się, że spowodowałoby to gorszą wydajność. Twierdzę, że jeśli zastosuje to do 1 widoku wewnątrz 1 działania, różnica w wydajności będzie niezauważalna dla ludzkiego oka na urządzeniach, które są na zewnątrz. A to, że robimy to z osobnymi widokami może wydawać się mniej zniechęcającym niektórym ludziom, niż próbować stworzyć swój własny pogląd, aby mogli nadpisać metody losowania. Wiem, że robienie takich rzeczy staje się trywialne po tym, jak zdobywasz kilka osób za pasem. Ale jeśli nigdy wcześniej tego nie robiłeś, wydaje mi się, że może to być nieco zniechęcające. – FoamyGuy

10

Tak, można nawet zamaskować pełne układy. Shameless selfplug

<com.christophesmet.android.views.maskableframelayout.MaskableFrameLayout 
android:id="@+id/frm_mask_animated" 
android:layout_width="100dp" 
app:porterduffxfermode="DST_IN" 
app:mask="@drawable/animation_mask" 
android:layout_height="100dp"> 

<ImageView android:layout_width="match_parent" 
      android:layout_height="match_parent" 
      android:scaleType="centerCrop" 
      android:src="@drawable/unicorn"/> 

Można go znaleźć here

Powiązane problemy