Auf Android wie mache ich seltsam geformte Clipping-Bereiche?

Hier ist, wie man einen Clipping-Bereich die Form eines Kreises zu schaffen:

Path path = new Path(); path.addCircle(200,200,100,Direction.CW); c.clipPath(path); // c is a Canvas 

Jetzt gibt es einen Ausschnitt auf der Leinwand, der verhindert, dass etwas außerhalb der Grenzen dieses Kreises ist. Aber was, wenn ich will, dass die Clipping-Bereich wie ein Donut (oder was auch immer) geformt werden?

  • Android Viewpager speichert Daten und Ansichten
  • Wie bekomme ich die xml-ID von EditText?
  • Floating Action Button erscheint über Navigation Schublade
  • So konfiguriere ich das NDK-Projekt in Android Studio 1.3
  • Kontext in AsyncTask erhalten
  • Android: wie man diese Art von Zeit-Picker haben?
  • Ich habe versucht, herum zu spielen mit dem Erstellen eines zweiten Pfades und mit toggleInverseFillType auf sie und dann das Hinzufügen, dass auf den ursprünglichen Pfad, aber das scheint nicht zu funktionieren.

    Alternativ, anstatt einen Pfad zu verwenden, ist es möglich, einfach nur eine Bitmap zu erstellen, die als Maske verwendet wird und sie als Clipping-Maske auf dem Canvas irgendwie setzen soll?

    EDIT: Die Antwort ist genau das, was ich mit einer kleinen Ergänzung brauchte. Wenn Sie mehrere Operationen auf einer Leinwand durchführen, verwenden Sie immer Op.REPLACE auf dem ersten ClipPath-Aufruf. Das wird jeden vorhandenen ClipPath auf diesem Canvas ersetzen.

    Als Referenz ist hier das, was ich entdeckt habe, was die 6 verschiedenen Region.Op Werte bedeuten. Stellen Sie sich ein Venn-Diagramm mit 2 Kreisen vor. "B" ist der Teil, an dem sich die 2 Kreise überlappen. "A" ist der nicht überlappende linke Kreis. "C" ist der nicht überlappende rechte Kreis.

     c.clipPath(a,Region.Op.REPLACE); c.clipPath(b,???); Region.Op.DIFFERENCE -> A.. Region.Op.INTERSECT -> .B. Region.Op.REPLACE -> .BC Region.Op.REVERSE_DIFFERENCE -> ..C Region.Op.UNION -> ABC Region.Op.XOR -> AC 

    Das "." Zeigt den Teil an, der nicht gezeichnet wird. Tut mir leid, wenn das nicht besonders klar ist. Es ist schwer, ohne Grafik zu beschreiben.

  • Erstellen von Ansichten innerhalb eines Arbeitsthreads
  • Android.database.CursorIndexOutOfBoundsException: Index -1 angefordert
  • Android - Erstellen eines Ordners im Verzeichnis data / data / pkg / files
  • JIT Compiler Verbesserungen in Android 3.0 und 4.0
  • Veröffentlichen Sie meinen RESTful Web Service im Internet
  • Konnte nicht auf den Paketmanager zugreifen. Ist das System läuft bei der Installation von Android-Anwendung
  • One Solution collect form web for “Auf Android wie mache ich seltsam geformte Clipping-Bereiche?”

    Von der Canvas javadoc :

    Canvas#clipPath(Path path, Region.Op op) – Ändern Sie den aktuellen Clip mit dem angegebenen Pfad.

    Also, für Ihr Donut Beispiel:

    1. Erstellen Sie 2 Pfade. Einer für den größeren Kreis, einer für den kleineren Kreis.
    2. Canvas#clipPath( Path ) mit größerem Kreis Path .
    3. Rufen Sie die Canvas#clipPath( Path, Region.Op ) Methode auf Ihrer Leinwand mit dem kleineren Kreis Path für das erste Argument und die entsprechende Region.Op Enum Wert für das zweite Argument.

       Path largePath = new Path(); largePath.addCircle(200,200,100,Direction.CW); Path smallPath = new Path(); smallPath.addCircle(200,200,40,Direction.CW); c.clipPath(largePath); // c is a Canvas c.clipPath(smallPath, Region.Op.DIFFERENCE); 

    Wiederum ändern Sie die Region.Op enum Wert, um verschiedene Effekte zu bekommen …

    Das Android ist ein Google Android Fan-Website, Alles ΓΌber Android Phones, Android Wear, Android Dev und Android Spiele Apps und so weiter.