Xamarin.Forms Shapes: Pfadtransformationen
Ein Transform
definiert, wie ein Path
Objekt von einem Koordinatenraum in einen anderen Koordinatenraum transformiert wird. Wenn eine Transformation auf ein Path
Objekt angewendet wird, ändert sie, wie das Objekt auf der Benutzeroberfläche gerendert wird.
Transformationen können in vier allgemeine Klassifizierungen unterteilt werden: Rotation, Skalierung, Abweichung und Übersetzung. Xamarin.Forms definiert eine Klasse für jede dieser Transformationsklassifizierungen:
RotateTransform
, das einePath
durch eine angegebeneAngle
rotiert.ScaleTransform
, das einPath
-Objekt nach den angegebenenScaleX
Mengen undScaleY
skaliert.SkewTransform
, wodurch einPath
Objekt nach den angegebenenAngleX
Mengen undAngleY
verzerrt wird.TranslateTransform
, das einPath
-Objekt um die angegebenenX
Mengen undY
verschiebt.
Xamarin.Forms stellt außerdem die folgenden Klassen zum Erstellen komplexerer Transformationen bereit:
TransformGroup
, die eine zusammengesetzte Transformation darstellt, die aus mehreren Transformationsobjekten besteht.CompositeTransform
, das mehrere Transformationsvorgänge auf einPath
Objekt anwendet.MatrixTransform
, wodurch benutzerdefinierte Transformationen erstellt werden, die nicht von den anderen Transformationsklassen bereitgestellt werden.
Alle diese Klassen werden von der Transform
-Klasse abgeleitet, die eine Value
Eigenschaft vom Typ Matrix
definiert, die die aktuelle Transformation als Matrix
-Objekt darstellt. Diese Eigenschaft wird von einem BindableProperty
-Objekt unterstützt, was bedeutet, dass es das Ziel von Datenbindungen sein und stilisiert werden kann. Weitere Informationen zur Struktur finden Sie unter Transformieren der Matrix
Matrix.
Um eine Transformation auf anzuwenden Path
, erstellen Sie eine Transformationsklasse und legen sie als Wert der Path.RenderTransform
-Eigenschaft fest.
Drehungstransformation
Eine drehbare Transformation dreht ein Path
Objekt im Uhrzeigersinn um einen angegebenen Punkt in einem 2D-x-y-Koordinatensystem.
Die RotateTransform
-Klasse, die von der Transform
-Klasse abgeleitet wird, definiert die folgenden Eigenschaften:
Angle
vom Typdouble
stellt den Winkel der Drehung im Uhrzeigersinn in Grad dar. Der Standardwert dieser Eigenschaft ist 0,0.CenterX
vom Typdouble
stellt die x-Koordinate des Drehmittelpunkts dar. Der Standardwert dieser Eigenschaft ist 0,0.CenterY
vom Typdouble
stellt die y-Koordinate des Drehmittelpunkts dar. Der Standardwert dieser Eigenschaft ist 0,0.
Diese Eigenschaften werden durch BindableProperty
-Objekte gestützt, was bedeutet, dass sie Ziele von Datenbindungen sein können, und geformt.
Die CenterX
Eigenschaften und CenterY
geben den Punkt an, um den das Path
Objekt gedreht wird. Dieser Mittelpunkt wird im Koordinatenraum des objekts ausgedrückt, das transformiert wird. Standardmäßig wird die Drehung auf (0,0) angewendet, bei der es sich um die obere linke Ecke des Path
Objekts handelt.
Im folgenden Beispiel wird gezeigt, wie ein Path
-Objekt gedreht wird:
<Path Stroke="Black"
Aspect="Uniform"
HorizontalOptions="Center"
HeightRequest="100"
WidthRequest="100"
Data="M13.908992,16.207977L32.000049,16.207977 32.000049,31.999985 13.908992,30.109983z">
<Path.RenderTransform>
<RotateTransform CenterX="0"
CenterY="0"
Angle="45" />
</Path.RenderTransform>
</Path>
In diesem Beispiel wird das Path
Objekt um 45 Grad um seine obere linke Ecke gedreht.
Skalierungstransformation
Eine Skalierungstransformation skaliert ein Path
Objekt im 2D x-y-Koordinatensystem.
Die ScaleTransform
-Klasse, die von der Transform
-Klasse abgeleitet wird, definiert die folgenden Eigenschaften:
ScaleX
vom Typdouble
, der den Skalierungsfaktor der x-Achse darstellt. Der Standardwert dieser Eigenschaft ist 1,0.ScaleY
vom Typdouble
, der den Skalierungsfaktor der y-Achse darstellt. Der Standardwert dieser Eigenschaft ist 1,0.CenterX
vom Typdouble
, der die x-Koordinate des Mittelpunkts dieser Transformation darstellt. Der Standardwert dieser Eigenschaft ist 0,0.CenterY
vom Typdouble
, der die y-Koordinate des Mittelpunkts dieser Transformation darstellt. Der Standardwert dieser Eigenschaft ist 0,0.
Diese Eigenschaften werden durch BindableProperty
-Objekte gestützt, was bedeutet, dass sie Ziele von Datenbindungen sein können, und geformt.
Der Wert von ScaleX
und ScaleY
hat einen großen Einfluss auf die resultierende Skalierung:
- Werte zwischen 0 und 1 verringern die Breite und Höhe des skalierten Objekts.
- Werte größer als 1 erhöhen die Breite und Höhe des skalierten Objekts.
- Der Wert 1 gibt an, dass das Objekt nicht skaliert ist.
- Negative Werte kippen das Skalierungsobjekt horizontal und vertikal.
- Werte zwischen 0 und -1 kippen das Skalierungsobjekt und verringern seine Breite und Höhe.
- Werte kleiner als -1 kippen das Objekt und erhöhen seine Breite und Höhe.
- Die Werte -1 kippen das skalierte Objekt, ändern jedoch seine horizontale oder vertikale Größe nicht.
Die CenterX
Eigenschaften und CenterY
geben den Punkt an, an dem das Path
Objekt skaliert wird. Dieser Mittelpunkt wird im Koordinatenraum des objekts ausgedrückt, das transformiert wird. Standardmäßig wird die Skalierung auf (0,0) angewendet, wobei es sich um die obere linke Ecke des Path
Objekts handelt. Dies hat den Effekt, dass das Path
Objekt verschoben und größer angezeigt wird, denn wenn Sie eine Transformation anwenden, ändern Sie den Koordinatenbereich, in dem sich das Path
Objekt befindet.
Im folgenden Beispiel wird gezeigt, wie ein Path
-Objekt skaliert wird:
<Path Stroke="Black"
Aspect="Uniform"
HorizontalOptions="Center"
HeightRequest="100"
WidthRequest="100"
Data="M13.908992,16.207977L32.000049,16.207977 32.000049,31.999985 13.908992,30.109983z">
<Path.RenderTransform>
<ScaleTransform CenterX="0"
CenterY="0"
ScaleX="1.5"
ScaleY="1.5" />
</Path.RenderTransform>
</Path>
In diesem Beispiel wird das Path
Objekt auf das 1,5-fache der Größe skaliert.
Transformation mit Skew
Eine Skewtransformation verzerrt ein Path
Objekt im 2D x-y-Koordinatensystem und ist nützlich, um die Illusion der 3D-Tiefe in einem 2D-Objekt zu erzeugen.
Die SkewTransform
-Klasse, die von der Transform
-Klasse abgeleitet wird, definiert die folgenden Eigenschaften:
AngleX
vom Typdouble
, der den Neigungswinkel der x-Achse darstellt, der in Grad gegen den Uhrzeigersinn von der y-Achse gemessen wird. Der Standardwert dieser Eigenschaft ist 0,0.AngleY
, vom Typdouble
, der den Y-Achsenschiefewinkel darstellt, der in Grad gegen den Uhrzeigersinn von der x-Achse gemessen wird. Der Standardwert dieser Eigenschaft ist 0,0.CenterX
vom Typdouble
, der die x-Koordinate des Transformationszentrums darstellt. Der Standardwert dieser Eigenschaft ist 0,0.CenterY
vom Typdouble
, der die y-Koordinate des Transformationszentrums darstellt. Der Standardwert dieser Eigenschaft ist 0,0.
Diese Eigenschaften werden durch BindableProperty
-Objekte gestützt, was bedeutet, dass sie Ziele von Datenbindungen sein können, und geformt.
Um die Auswirkungen einer schiefen Transformation vorherzusagen, betrachten Sie, dass AngleX
die Werte der x-Achse relativ zum ursprünglichen Koordinatensystem neigt. Bei einem AngleX
von 30 dreht sich die y-Achse daher um 30 Grad durch den Ursprung und verzerrt die Werte in x um 30 Grad von diesem Ursprung. Ebenso wird ein AngleY
von 30 die y-Werte des Path
Objekts um 30 Grad vom Ursprung entfernt.
Hinweis
Um ein Path
Objekt zu verzerren, legen Sie die CenterX
Eigenschaften und CenterY
auf den Mittelpunkt des Objekts fest.
Das folgende Beispiel zeigt, wie Sie ein Path
Objekt verzerren:
<Path Stroke="Black"
Aspect="Uniform"
HorizontalOptions="Center"
HeightRequest="100"
WidthRequest="100"
Data="M13.908992,16.207977L32.000049,16.207977 32.000049,31.999985 13.908992,30.109983z">
<Path.RenderTransform>
<SkewTransform CenterX="0"
CenterY="0"
AngleX="45"
AngleY="0" />
</Path.RenderTransform>
</Path>
In diesem Beispiel wird eine horizontale Abweichung von 45 Grad vom Mittelpunkt (0,0) auf das Path
Objekt angewendet.
Übersetzen der Transformation
Eine Übersetzungstransformation verschiebt ein Objekt im 2D-x-y-Koordinatensystem.
Die TranslateTransform
-Klasse, die von der Transform
-Klasse abgeleitet wird, definiert die folgenden Eigenschaften:
X
vom Typdouble
, der den Abstand darstellt, der entlang der x-Achse verschoben werden soll. Der Standardwert dieser Eigenschaft ist 0,0.Y
vom Typdouble
, der den Abstand darstellt, der entlang der y-Achse verschoben werden soll. Der Standardwert dieser Eigenschaft ist 0,0.
Diese Eigenschaften werden durch BindableProperty
-Objekte gestützt, was bedeutet, dass sie Ziele von Datenbindungen sein können, und geformt.
Negative X
Werte verschieben ein Objekt nach links, während positive Werte ein Objekt nach rechts verschieben. Negative Y
Werte verschieben ein Objekt nach oben, während positive Werte ein Objekt nach unten verschieben.
Im folgenden Beispiel wird gezeigt, wie ein Path
-Objekt übersetzt wird:
<Path Stroke="Black"
Aspect="Uniform"
HorizontalOptions="Center"
HeightRequest="100"
WidthRequest="100"
Data="M13.908992,16.207977L32.000049,16.207977 32.000049,31.999985 13.908992,30.109983z">
<Path.RenderTransform>
<TranslateTransform X="50"
Y="50" />
</Path.RenderTransform>
</Path>
In diesem Beispiel wird das Path
Objekt um 50 geräteunabhängige Einheiten nach rechts und 50 geräteunabhängige Einheiten nach unten verschoben.
Mehrere Transformationen
Xamarin.Forms verfügt über zwei Klassen, die das Anwenden mehrerer Transformationen auf ein Path
Objekt unterstützen. Dies sind TransformGroup
, und CompositeTransform
. Ein TransformGroup
führt Transformationen in beliebiger Reihenfolge aus, während transformationen CompositeTransform
in einer bestimmten Reihenfolge ausgeführt werden.
Transformieren von Gruppen
Transformationsgruppen stellen zusammengesetzte Transformationen dar, die aus mehreren Transform
Objekten bestehen.
Die TransformGroup
-Klasse, die von der Transform
-Klasse abgeleitet wird, definiert eine Children
-Eigenschaft vom Typ TransformCollection
, die eine Auflistung von Transform
-Objekten darstellt. Diese Eigenschaft wird von einem BindableProperty
-Objekt unterstützt, was bedeutet, dass es das Ziel von Datenbindungen sein und stilisiert werden kann.
Die Reihenfolge der Transformationen ist bei einer zusammengesetzten Transformation, die die TransformGroup
-Klasse verwendet, wichtig. Wenn Sie beispielsweise erst drehen, dann skalieren und dann übersetzen, erhalten Sie ein anderes Ergebnis im Vergleich dazu, wenn Sie erst übersetzen, dann drehen und dann skalieren. Ein Grund für die Reihenfolge ist, dass Transformationen wie Drehung und Skalierung in Bezug auf den Ursprung des Koordinatensystems durchgeführt werden. Das Skalieren eines Objekts, das am Ursprung zentriert ist, führt zu einem anderen Ergebnis als die Skalierung eines Objekts, das vom Ursprung entfernt wurde. In ähnlicher Weise führt das Drehen eines Objekts, das auf den Ursprung zentriert ist, zu einem anderen Ergebnis als das Drehen eines Objekts, das vom Ursprung weg bewegt wurde.
Im folgenden Beispiel wird gezeigt, wie eine zusammengesetzte Transformation mithilfe der TransformGroup
-Klasse ausgeführt wird:
<Path Stroke="Black"
Aspect="Uniform"
HorizontalOptions="Center"
HeightRequest="100"
WidthRequest="100"
Data="M13.908992,16.207977L32.000049,16.207977 32.000049,31.999985 13.908992,30.109983z">
<Path.RenderTransform>
<TransformGroup>
<ScaleTransform ScaleX="1.5"
ScaleY="1.5" />
<RotateTransform Angle="45" />
</TransformGroup>
</Path.RenderTransform>
</Path>
In diesem Beispiel wird das Objekt auf das Path
1,5-fache seiner Größe skaliert und dann um 45 Grad gedreht.
Zusammengesetzte Transformationen
Eine zusammengesetzte Transformation wendet mehrere Transformationen auf ein Objekt an.
Die CompositeTransform
-Klasse, die von der Transform
-Klasse abgeleitet wird, definiert die folgenden Eigenschaften:
CenterX
vom Typdouble
, der die x-Koordinate des Mittelpunkts dieser Transformation darstellt. Der Standardwert dieser Eigenschaft ist 0,0.CenterY
vom Typdouble
, der die y-Koordinate des Mittelpunkts dieser Transformation darstellt. Der Standardwert dieser Eigenschaft ist 0,0.ScaleX
vom Typdouble
, der den Skalierungsfaktor der x-Achse darstellt. Der Standardwert dieser Eigenschaft ist 1,0.ScaleY
vom Typdouble
, der den Skalierungsfaktor der y-Achse darstellt. Der Standardwert dieser Eigenschaft ist 1,0.SkewX
vom Typdouble
, der den Neigungswinkel der x-Achse darstellt, der in Grad gegen den Uhrzeigersinn von der y-Achse gemessen wird. Der Standardwert dieser Eigenschaft ist 0,0.SkewY
, vom Typdouble
, der den Y-Achsenschiefewinkel darstellt, der in Grad gegen den Uhrzeigersinn von der x-Achse gemessen wird. Der Standardwert dieser Eigenschaft ist 0,0.Rotation
vom Typdouble
stellt den Winkel der Drehung im Uhrzeigersinn in Grad dar. Der Standardwert dieser Eigenschaft ist 0,0.TranslateX
vom Typdouble
, der den Abstand darstellt, der entlang der x-Achse verschoben werden soll. Der Standardwert dieser Eigenschaft ist 0,0.TranslateY
vom Typdouble
, der den Abstand darstellt, der entlang der y-Achse verschoben werden soll. Der Standardwert dieser Eigenschaft ist 0,0.
Diese Eigenschaften werden durch BindableProperty
-Objekte gestützt, was bedeutet, dass sie Ziele von Datenbindungen sein können, und geformt.
Ein CompositeTransform
wendet Transformationen in der folgenden Reihenfolge an:
- Skalierung (
ScaleX
undScaleY
). - Skew (
SkewX
undSkewY
). - Drehen (
Rotation
). - Übersetzen (
TranslateX
,TranslateY
).
Wenn Sie mehrere Transformationen in einer anderen Reihenfolge auf ein Objekt anwenden möchten, sollten Sie eine TransformGroup
erstellen und die Transformationen in der gewünschten Reihenfolge einfügen.
Wichtig
Ein CompositeTransform
verwendet die gleichen Mittelpunkte und CenterX
CenterY
für alle Transformationen. Wenn Sie unterschiedliche Mittelpunkte pro Transformation angeben möchten, verwenden Sie eine TransformGroup
,
Im folgenden Beispiel wird gezeigt, wie eine zusammengesetzte Transformation mithilfe der CompositeTransform
-Klasse ausgeführt wird:
<Path Stroke="Black"
Aspect="Uniform"
HorizontalOptions="Center"
HeightRequest="100"
WidthRequest="100"
Data="M13.908992,16.207977L32.000049,16.207977 32.000049,31.999985 13.908992,30.109983z">
<Path.RenderTransform>
<CompositeTransform ScaleX="1.5"
ScaleY="1.5"
Rotation="45"
TranslateX="50"
TranslateY="50" />
</Path.RenderTransform>
</Path>
In diesem Beispiel wird das Objekt auf das Path
1,5-fache seiner Größe skaliert, dann um 45 Grad gedreht und dann um 50 geräteunabhängige Einheiten übersetzt.
Transformationsmatrix
Eine Transformation kann als 3x3-affine Transformationsmatrix beschrieben werden, die Transformationen im 2D-Raum ausführt. Diese 3x3-Matrix wird durch die Struktur dargestellt, bei der Matrix
es sich um eine Auflistung von drei Zeilen und drei Spalten mit double
Werten handelt.
Die Matrix
Struktur definiert die folgenden Eigenschaften:
Determinant
vom Typdouble
, der die Determinante der Matrix abruft.HasInverse
vom Typbool
, der angibt, ob die Matrix invertierbar ist.Identity
vom TypMatrix
, der eine Identitätsmatrix abruft.HasIdentity
vom Typbool
, der angibt, ob die Matrix eine Identitätsmatrix ist.M11
vom Typdouble
, der den Wert der ersten Zeile und ersten Spalte der Matrix darstellt.M12
vom Typdouble
, der den Wert der ersten Zeile und der zweiten Spalte der Matrix darstellt.M21
vom Typdouble
, der den Wert der zweiten Zeile und der ersten Spalte der Matrix darstellt.M22
vom Typdouble
, der den Wert der zweiten Zeile und der zweiten Spalte der Matrix darstellt.OffsetX
vom Typdouble
, der den Wert der dritten Zeile und der ersten Spalte der Matrix darstellt.OffsetY
vom Typdouble
, der den Wert der dritten Zeile und der zweiten Spalte der Matrix darstellt.
Die OffsetX
Eigenschaften und OffsetY
werden so benannt, da sie den Betrag angeben, der den Koordinatenraum entlang der x-Achse bzw. y-Achse übersetzen soll.
Darüber hinaus macht die Matrix
Struktur eine Reihe von Methoden verfügbar, die zum Bearbeiten der Matrixwerte verwendet werden können, einschließlich Append
, Invert
, Multiply
Prepend
und viele mehr.
Die folgende Tabelle zeigt die Struktur einer Xamarin.Forms Matrix:
M11
M12
0,0
M21
M22
0,0
OffsetX
OffsetY
1.0
Hinweis
Eine affine Transformationsmatrix hat ihre letzte Spalte gleich (0,0,1), sodass nur die Elemente in den ersten beiden Spalten angegeben werden müssen.
Durch Bearbeiten von Matrixwerten können Sie Objekte drehen, skalieren, verzerren und übersetzen Path
. Wenn Sie beispielsweise den OffsetX
Wert in 100 ändern, können Sie damit ein Path
Objekt um 100 geräteunabhängige Einheiten entlang der X-Achse verschieben. Wenn Sie den M22
Wert in 3 ändern, können Sie ihn verwenden, um ein Objekt auf das Path
Dreifache seiner aktuellen Höhe zu strecken. Wenn Sie beide Werte ändern, verschieben Sie das Path
Objekt um 100 geräteunabhängige Einheiten entlang der x-Achse und strecken seine Höhe um den Faktor 3. Darüber hinaus können affine Transformationsmatrizen multipliziert werden, um eine beliebige Anzahl linearer Transformationen zu bilden, z. B. Drehung und Abweichung, gefolgt von der Übersetzung.
Benutzerdefinierte Transformationen
Die MatrixTransform
-Klasse, die von der Transform
-Klasse abgeleitet wird, definiert eine Matrix
Eigenschaft vom Typ Matrix
, die die Matrix darstellt, die die Transformation definiert. Diese Eigenschaft wird von einem BindableProperty
-Objekt unterstützt, was bedeutet, dass es das Ziel von Datenbindungen sein und stilisiert werden kann.
Jede Transformation, die Sie mit einem TranslateTransform
- , ScaleTransform
- RotateTransform
oder SkewTransform
-Objekt beschreiben können, kann ebenfalls durch eine MatrixTransform
beschrieben werden. Die TranslateTransform
Klassen , ScaleTransform
, RotateTransform
und SkewTransform
sind jedoch einfacher zu konzipieren als das Festlegen der Vektorkomponenten in einem Matrix
. Daher wird die -Klasse in der MatrixTransform
Regel verwendet, um benutzerdefinierte Transformationen zu erstellen, die nicht von den RotateTransform
Klassen , ScaleTransform
, SkewTransform
oder TranslateTransform
bereitgestellt werden.
Im folgenden Beispiel wird gezeigt, wie ein Path
-Objekt mithilfe von MatrixTransform
transformiert wird:
<Path Stroke="Black"
Aspect="Uniform"
HorizontalOptions="Center"
Data="M13.908992,16.207977L32.000049,16.207977 32.000049,31.999985 13.908992,30.109983z">
<Path.RenderTransform>
<MatrixTransform>
<MatrixTransform.Matrix>
<!-- M11 stretches, M12 skews -->
<Matrix OffsetX="10"
OffsetY="100"
M11="1.5"
M12="1" />
</MatrixTransform.Matrix>
</MatrixTransform>
</Path.RenderTransform>
</Path>
In diesem Beispiel wird das Objekt in den Path
Dimensionen X und Y gestreckt, verzerrt und versetzt.
Alternativ kann dies in einer vereinfachten Form geschrieben werden, die einen Typkonverter verwendet, der in Xamarin.Formsintegriert ist:
<Path Stroke="Black"
Aspect="Uniform"
HorizontalOptions="Center"
Data="M13.908992,16.207977L32.000049,16.207977 32.000049,31.999985 13.908992,30.109983z">
<Path.RenderTransform>
<MatrixTransform Matrix="1.5,1,0,1,10,100" />
</Path.RenderTransform>
</Path>
In diesem Beispiel wird die Matrix
-Eigenschaft als durch Trennzeichen getrennte Zeichenfolge angegeben, die aus sechs Membern besteht: M11
, M12
, M21
, M22
, OffsetX
, OffsetY
. Obwohl die Member in diesem Beispiel durch Trennzeichen getrennt sind, können sie auch durch ein oder mehrere Leerzeichen getrennt werden.
Darüber hinaus kann das vorherige Beispiel noch weiter vereinfacht werden, indem die gleichen sechs Member als Wert der RenderTransform
-Eigenschaft angegeben werden:
<Path Stroke="Black"
Aspect="Uniform"
HorizontalOptions="Center"
RenderTransform="1.5 1 0 1 10 100"
Data="M13.908992,16.207977L32.000049,16.207977 32.000049,31.999985 13.908992,30.109983z" />