2016-06-10 22 views
2

Ich habe ein Layout, das mehrere Ansichten innerhalb hat - Symbolleiste, Recyclerview und einige Trennzeichen (das sind einfache Ansichten mit Höhe von 2DP und Match_Parent Breite). Ich wollte eine Maske auf ein Layout setzen - der wichtigste Teil davon sind die runden Ecken für das gesamte Layout (und nicht die Ansichten selbst). Ich beschloss, meine eigene LinearLayout-Klasse mit überladener dispatchDraw-Funktion zu erstellen, und es gelang mir, ein schönes Ergebnis zu erzielen ... bis auf eine Sache - diese Ecken sind nicht antialiasiert.Antialias auf clipPath auf Layout

tl; dr gibt es eine Möglichkeit, Antialias auf ClipPath-Funktion zu setzen? Ich weiß, kann es in Paint einschalten und dann xfermodes verwenden, um das Layout zu maskieren, aber ich habe keine Ahnung, wie man Maske zeichnet und dann alles andere zeichnet (ohne zu wissen, was genau drin ist).

Hier ist mein Layout-Code (mit Ausnahme des Klassennamen, einfachen Konstrukteuren und Pfad-Feld):

@Override protected void dispatchDraw(Canvas canvas) { 
    if (path == null) { 
     path = new Path(); 
     float margin = MyApplication.getInstance().getMetrics().density * 5; 
     path.addRoundRect(new RectF(margin,margin,getWidth()-margin, getHeight()-margin), 
       margin*2, margin*2, Path.Direction.CW); 
    } 
    canvas.clipPath(path); 
    super.dispatchDraw(canvas); 
} 

@Override protected void onDraw(Canvas canvas) { 
    super.onDraw(canvas); 
} 
+0

versuchen Sie [this] (http://Stackoverflow.com/a/37626545/2252830), natürlich anstelle von 'mMask.draw (Leinwand)' müssten Sie anrufen 'canvas.drawPath()' mit einem 'Paint'-Set mit dem' PorterDuff.Mode.DST_IN'-Modus – pskink

+0

Poste dies als Antwort, damit ich es als Lösung einstellen kann, funktionierte perfekt. – n4zArh

Antwort

5

versuchen this SO answer, natürlich statt mMask.draw(canvas), die eine „Maske“ von einem NinePatchDrawable gemacht ist, dass Sie benötigen würden Anruf canvas.drawPath() mit Paint mit PorterDuff.Mode.DST_IN eingestellt werden xfer Modus