2010-07-26 14 views
32
public class POCII extends Activity { 

    myView mv = new myView(this); 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(mv); 
    } 
} 


class myView extends View { 

    public myView(Context context) { 
     super(context); 
    } 

    @Override 
    public void onDraw(Canvas canvas) { 

     Paint paint = new Paint(); 

     canvas.drawRect(0,0,100,100, paint); 
     canvas.clipRect(0,0,50,50); 
    } 
} 

Moje pytanie brzmi, czy powyższy kod nie powinien narysować prostokąta, a następnie przyciąć górną lewą część? Prostokąt nie jest przycinany.Korzystanie z funkcji clipRect - wyjaśnienie

Proszę wyjaśnić, co robi clipRect. Co to właściwie przycina? Czy klip ma postać prostokąta, z uwzględnieniem współrzędnych? Jeśli tak, dlaczego powyższy kod nie działa?

+2

check http://youtu.be/vkTn3Ule4Ps?list=PLOU2XLYxmsIKEOXh5TwZEv89aofHzNCiu –

Odpowiedz

66

Kanwa. clipRect(left, top, right, bottom) zmniejsza obszar ekranu, do którego mogą w przyszłości pisać operacje rysowania. Ustawia clipBounds jako przecięcie przestrzenne bieżącego prostokąta obcinania i określonego prostokąta. Istnieje wiele wariantów metody clipRect, które akceptują różne formy dla regionów i pozwalają na różne operacje na prostokącie obcinania. Jeśli chcesz jawnie ustawić region obcinania, spróbuj:

canvas.clipRect(left, top, right, bottom, Region.Op.REPLACE); 

5th argumentem oznacza zastąpienie prostokąt obcinania zamiast tworzenia skrzyżowania z poprzedniej wersji.

Spróbuj przenieść instrukcję clipRect przed instrukcją drawRect. Lub spróbuj dodać:

paint.setColor(Color.YELLOW); 
drawRect(0,0,75,75); 

po istniejącej instrukcji clipRect. Powinien narysować 50x50 żółtego kwadratu nad tym, co miałeś wcześniej.

Inna uwaga: (po długiej frustracji z widocznym, w dużej mierze nieudokumentowanym kodem View/ViewGroup/drawing) odkryłem, że canvas.translate (x, y) również koryguje clipRect. Interakcja clipRect i matrycy rysunku jest bardzo myląca. Jest to pomocne, aby wydrukować:

canvas.getMatrix() 

i

canvas.getClipBounds() 

przed i po modyfikacjach płótnie i przed wyciągnięciem rzeczy.

+2

Nota na canvas.translate (x, y) Zabawa z clipRect była bardzo przydatna. Zaoszczędziłam wiele frustracji. Dzięki! –

+0

Metody z 'Region.Op' są najwyraźniej obecnie przestarzałe. – Suragch

+0

Jak uzyskać oryginalne płótno z obciętego płótna? –

3

Aby przyciąć lewą górną część, należy:

canvas.clipRect(0,0,50,50, Region.Op.DIFFERENCE); 
// secondly... 
canvas.drawRect(0,0,100,100, paint); 
4

ICS i powyżej ...

XOR, różnica i ReverseDifference klip tryby ignorowane przez ICS czy akceleracja sprzętowa jest włączona.

Wystarczy wyłączyć sprzętową akcelerację 2D w widoku:

myView.setLayerType (View.LAYER_TYPE_SOFTWARE, null);

referencyjny Android: Howto use clipRect in API15