Xamarin.Forms Kształty: przekształcenia ścieżki
Obiekt Transform
definiuje sposób przekształcania Path
obiektu z jednej przestrzeni współrzędnej na inną przestrzeń współrzędną. Po zastosowaniu Path
przekształcenia do obiektu zmienia sposób renderowania obiektu w interfejsie użytkownika.
Przekształcenia można podzielić na cztery klasyfikacje ogólne: rotację, skalowanie, niesymetryczność i tłumaczenie. Xamarin.Forms definiuje klasę dla każdej z tych klasyfikacji przekształceń:
RotateTransform
, który obraca elementPath
według określonegoAngle
elementu .ScaleTransform
, który skalujePath
obiekt według określonejScaleX
wartości iScaleY
.SkewTransform
, który wypaczaPath
obiekt o określoneAngleX
wartości iAngleY
.TranslateTransform
, który przenosiPath
obiekt według określonejX
wartości iY
.
Xamarin.Forms Udostępnia również następujące klasy do tworzenia bardziej złożonych przekształceń:
TransformGroup
, który reprezentuje transformację złożoną składającą się z wielu obiektów transformacji.CompositeTransform
, który stosuje wiele operacji przekształcaniaPath
do obiektu.MatrixTransform
, który tworzy niestandardowe przekształcenia, które nie są udostępniane przez inne klasy transformacji.
Wszystkie te klasy pochodzą z Transform
klasy, która definiuje właściwość typu Matrix
, która reprezentuje bieżącą Value
transformację Matrix
jako obiekt. Ta właściwość jest wspierana BindableProperty
przez obiekt, co oznacza, że może być obiektem docelowym powiązań danych i stylizowany. Aby uzyskać więcej informacji na temat Matrix
struktury, zobacz Przekształcanie macierzy.
Aby zastosować przekształcenie do Path
klasy , należy utworzyć klasę transform i ustawić ją jako wartość Path.RenderTransform
właściwości.
Przekształcanie rotacji
Przekształcenie rotacji obraca Path
obiekt zgodnie z ruchem wskazówek zegara o określonym punkcie w układzie współrzędnych 2D x-y.
Klasa RotateTransform
, która pochodzi z Transform
klasy, definiuje następujące właściwości:
Angle
, typudouble
, reprezentuje kąt, w stopniach, obrotu zgodnie z ruchem wskazówek zegara. Wartość domyślna tej właściwości to 0,0.CenterX
, typudouble
, reprezentuje współrzędną x punktu środkowego obrotu. Wartość domyślna tej właściwości to 0,0.CenterY
, typudouble
, reprezentuje współrzędną y punktu środkowego obrotu. Wartość domyślna tej właściwości to 0,0.
Te właściwości są wspierane przez BindableProperty
obiekty, co oznacza, że mogą być obiektami docelowymi powiązań danych i stylizowanymi.
Właściwości CenterX
i CenterY
określają punkt, o którym Path
obiekt jest obracany. Ten punkt środkowy jest wyrażony w przestrzeni współrzędnej przekształconego obiektu. Domyślnie rotacja jest stosowana do (0,0), czyli lewego górnego Path
rogu obiektu.
W poniższym przykładzie pokazano, jak obrócić Path
obiekt:
<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>
W tym przykładzie Path
obiekt jest obracany o 45 stopni w lewym górnym rogu.
Skalowanie transformacji
Przekształcenie skalowania skaluje obiekt w układzie Path
współrzędnych 2D x-y.
Klasa ScaleTransform
, która pochodzi z Transform
klasy, definiuje następujące właściwości:
ScaleX
, typudouble
, który reprezentuje współczynnik skalowania osi x. Wartość domyślna tej właściwości to 1.0.ScaleY
, typudouble
, który reprezentuje współczynnik skalowania osi y. Wartość domyślna tej właściwości to 1.0.CenterX
, typudouble
, który reprezentuje współrzędną x punktu środkowego tej transformacji. Wartość domyślna tej właściwości to 0,0.CenterY
, typudouble
, który reprezentuje współrzędną y punktu środkowego tej transformacji. Wartość domyślna tej właściwości to 0,0.
Te właściwości są wspierane przez BindableProperty
obiekty, co oznacza, że mogą być obiektami docelowymi powiązań danych i stylizowanymi.
Wartość ScaleX
i ScaleY
mają ogromny wpływ na wynikowe skalowanie:
- Wartości z zakresu od 0 do 1 zmniejszają szerokość i wysokość skalowanego obiektu.
- Wartości większe niż 1 zwiększają szerokość i wysokość skalowanego obiektu.
- Wartości 1 wskazują, że obiekt nie jest skalowany.
- Wartości ujemne przerzucają obiekt skalowania w poziomie i w pionie.
- Wartości z zakresu od 0 do -1 przerzucają obiekt skalowania i zmniejszają jego szerokość i wysokość.
- Wartości mniejsze niż -1 przerzucają obiekt i zwiększają jego szerokość i wysokość.
- Wartości -1 przerzucają przeskalowany obiekt, ale nie zmieniają rozmiaru poziomego ani pionowego.
Właściwości CenterX
i CenterY
określają punkt, o którym Path
obiekt jest skalowany. Ten punkt środkowy jest wyrażony w przestrzeni współrzędnej przekształconego obiektu. Domyślnie skalowanie jest stosowane do (0,0), czyli lewego górnego Path
rogu obiektu. Ma to wpływ na przeniesienie obiektu i pojawienie się go większego, ponieważ po zastosowaniu Path
przekształcenia zmieniasz przestrzeń współrzędną, w której Path
znajduje się obiekt.
W poniższym przykładzie pokazano, jak skalować Path
obiekt:
<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>
W tym przykładzie Path
obiekt jest skalowany do 1,5 razy większy.
Przekształć niesymetryczne
Przekrzywiona transformacja wypacza obiekt w układzie współrzędnych 2D x-y i przydaje Path
się do tworzenia iluzji głębokości 3D w obiekcie 2D.
Klasa SkewTransform
, która pochodzi z Transform
klasy, definiuje następujące właściwości:
AngleX
, typudouble
, który reprezentuje kąt niesymetryczności osi x, który jest mierzony w stopniach odwrotnie od osi y. Wartość domyślna tej właściwości to 0,0.AngleY
, typudouble
, który reprezentuje kąt niesymetryczności osi y, który jest mierzony w stopniach odwrotnie od osi x. Wartość domyślna tej właściwości to 0,0.CenterX
, typudouble
, który reprezentuje współrzędną x centrum transformacji. Wartość domyślna tej właściwości to 0,0.CenterY
, typudouble
, który reprezentuje współrzędną y centrum transformacji. Wartość domyślna tej właściwości to 0,0.
Te właściwości są wspierane przez BindableProperty
obiekty, co oznacza, że mogą być obiektami docelowymi powiązań danych i stylizowanymi.
Aby przewidzieć efekt przekształcenia niesymetryczności, należy wziąć pod uwagę, że AngleX
wartości osi x są niesymetryczne względem oryginalnego układu współrzędnych. W związku z tym dla AngleX
30 osi y obraca się 30 stopni przez źródło i wypacza wartości w x o 30 stopni od tego źródła. Podobnie, AngleY
30 wypacza wartości Path
y obiektu o 30 stopni od źródła.
Uwaga
Aby skośnić Path
obiekt na miejscu, ustaw CenterX
właściwości i CenterY
na punkt środkowy obiektu.
W poniższym przykładzie pokazano, jak wypaczyć Path
obiekt:
<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>
W tym przykładzie do obiektu zastosowano Path
niesymetryczność poziomą 45 stopni z punktu środkowego (0,0).
Tłumaczenie przekształcenia
Przekształcenie tłumaczenia przenosi obiekt w układzie współrzędnych 2D x-y.
Klasa TranslateTransform
, która pochodzi z Transform
klasy, definiuje następujące właściwości:
X
, typudouble
, który reprezentuje odległość do poruszania się wzdłuż osi x. Wartość domyślna tej właściwości to 0,0.Y
, typudouble
, który reprezentuje odległość do poruszania się wzdłuż osi y. Wartość domyślna tej właściwości to 0,0.
Te właściwości są wspierane przez BindableProperty
obiekty, co oznacza, że mogą być obiektami docelowymi powiązań danych i stylizowanymi.
Wartości ujemne X
przenoszą obiekt do lewej strony, a wartości dodatnie przenoszą obiekt z prawej strony. Wartości ujemne Y
przenoszą obiekt w górę, a wartości dodatnie przenoszą obiekt w dół.
W poniższym przykładzie pokazano, jak przetłumaczyć Path
obiekt:
<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>
W tym przykładzie Path
obiekt jest przenoszony o 50 jednostek niezależnych od urządzenia po prawej stronie i 50 jednostek niezależnych od urządzenia.
Wiele przekształceń
Xamarin.Forms ma dwie klasy, które obsługują stosowanie wielu przekształceń do Path
obiektu. TransformGroup
Są to , i CompositeTransform
. Element TransformGroup
wykonuje przekształcenia w dowolnej żądanej kolejności, a CompositeTransform
element wykonuje przekształcenia w określonej kolejności.
Przekształcanie grup
Grupy przekształcania reprezentują złożone przekształcenia składające się z wielu Transform
obiektów.
Klasa TransformGroup
, która pochodzi z Transform
klasy, definiuje Children
właściwość typu TransformCollection
, która reprezentuje kolekcję Transform
obiektów. Ta właściwość jest wspierana BindableProperty
przez obiekt, co oznacza, że może być obiektem docelowym powiązań danych i stylizowany.
Kolejność przekształceń jest ważna w transformacji złożonej TransformGroup
, która używa klasy . Jeśli na przykład najpierw obrócisz, przeprowadź skalowanie, a następnie przetłumacz, uzyskasz inny wynik niż w przypadku pierwszego tłumaczenia, a następnie obróć, a następnie przeprowadź skalowanie. Jedną z przyczyn jest to, że przekształcenia, takie jak rotacja i skalowanie, są wykonywane w odniesieniu do źródła układu współrzędnych. Skalowanie obiektu, który jest wyśrodkowany na początku, daje inny wynik w celu skalowania obiektu, który został przeniesiony z punktu początkowego. Podobnie obracanie obiektu, który jest wyśrodkowany na początku, powoduje inny wynik niż obracanie obiektu, który został przeniesiony z punktu początkowego.
W poniższym przykładzie pokazano, jak wykonać transformację złożoną przy użyciu TransformGroup
klasy :
<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>
W tym przykładzie Path
obiekt jest skalowany do 1,5 razy większy, a następnie obracany o 45 stopni.
Przekształcenia złożone
Przekształcenie złożone stosuje wiele przekształceń do obiektu.
Klasa CompositeTransform
, która pochodzi z Transform
klasy, definiuje następujące właściwości:
CenterX
, typudouble
, który reprezentuje współrzędną x punktu środkowego tej transformacji. Wartość domyślna tej właściwości to 0,0.CenterY
, typudouble
, który reprezentuje współrzędną y punktu środkowego tej transformacji. Wartość domyślna tej właściwości to 0,0.ScaleX
, typudouble
, który reprezentuje współczynnik skalowania osi x. Wartość domyślna tej właściwości to 1.0.ScaleY
, typudouble
, który reprezentuje współczynnik skalowania osi y. Wartość domyślna tej właściwości to 1.0.SkewX
, typudouble
, który reprezentuje kąt niesymetryczności osi x, który jest mierzony w stopniach odwrotnie od osi y. Wartość domyślna tej właściwości to 0,0.SkewY
, typudouble
, który reprezentuje kąt niesymetryczności osi y, który jest mierzony w stopniach odwrotnie od osi x. Wartość domyślna tej właściwości to 0,0.Rotation
, typudouble
, reprezentuje kąt, w stopniach, obrotu zgodnie z ruchem wskazówek zegara. Wartość domyślna tej właściwości to 0,0.TranslateX
, typudouble
, który reprezentuje odległość do poruszania się wzdłuż osi x. Wartość domyślna tej właściwości to 0,0.TranslateY
, typudouble
, który reprezentuje odległość do poruszania się wzdłuż osi y. Wartość domyślna tej właściwości to 0,0.
Te właściwości są wspierane przez BindableProperty
obiekty, co oznacza, że mogą być obiektami docelowymi powiązań danych i stylizowanymi.
Zastosowanie CompositeTransform
przekształceń w tej kolejności:
- Skaluj (
ScaleX
iScaleY
). - Niesymetryczność (
SkewX
iSkewY
). - Obróć (
Rotation
). - Przetłumacz (
TranslateX
,TranslateY
).
Jeśli chcesz zastosować wiele przekształceń do obiektu w innej kolejności, należy utworzyć TransformGroup
i wstawić przekształcenia w zamierzonej kolejności.
Ważne
Element CompositeTransform
używa tych samych punktów CenterX
środkowych i CenterY
, dla wszystkich przekształceń. Jeśli chcesz określić różne punkty środkowe na przekształcenie, użyj elementu TransformGroup
,
W poniższym przykładzie pokazano, jak wykonać transformację złożoną przy użyciu CompositeTransform
klasy :
<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>
W tym przykładzie Path
obiekt jest skalowany do 1,5 razy większy, a następnie obracany o 45 stopni, a następnie tłumaczony przez 50 jednostek niezależnych od urządzenia.
Macierz przekształcania
Przekształcenie można opisać w postaci macierzy transformacji 3x3, która wykonuje przekształcenia w przestrzeni 2D. Ta macierz 3x3 jest reprezentowana przez Matrix
strukturę, która jest kolekcją trzech wierszy i trzech kolumn double
wartości.
Struktura Matrix
definiuje następujące właściwości:
Determinant
, typudouble
, który pobiera determinant macierzy.HasInverse
, typubool
, który wskazuje, czy macierz jest niewzględna.Identity
, typuMatrix
, który pobiera macierz tożsamości.HasIdentity
, typubool
, który wskazuje, czy macierz jest macierzą tożsamości.M11
, typudouble
, który reprezentuje wartość pierwszego wiersza i pierwszej kolumny macierzy.M12
, typudouble
, który reprezentuje wartość pierwszego wiersza i drugiej kolumny macierzy.M21
, typudouble
, który reprezentuje wartość drugiego wiersza i pierwszej kolumny macierzy.M22
, typudouble
, który reprezentuje wartość drugiego wiersza i drugiej kolumny macierzy.OffsetX
, typudouble
, który reprezentuje wartość trzeciego wiersza i pierwszej kolumny macierzy.OffsetY
, typudouble
, który reprezentuje wartość trzeciego wiersza i drugiej kolumny macierzy.
Właściwości OffsetX
i OffsetY
są tak nazwane, ponieważ określają ilość, aby przetłumaczyć przestrzeń współrzędnych wzdłuż osi x i y odpowiednio.
Ponadto struktura uwidacznia szereg metod, Matrix
których można użyć do manipulowania wartościami macierzy, w tym Append
, Invert
, Multiply
Prepend
i wiele innych.
W poniższej Xamarin.Forms tabeli przedstawiono strukturę macierzy:
M11
M12
0,0
M21
M22
0,0
Przesunięcie X
Przesunięcie
1.0
Uwaga
Macierz przekształcenia affine ma końcową kolumnę równą (0,0,1), więc należy określić tylko elementy członkowskie w dwóch pierwszych kolumnach.
Manipulując wartościami macierzy, można obracać, skalować, niesymetrycznie i tłumaczyć Path
obiekty. Jeśli na przykład zmienisz OffsetX
wartość na 100, możesz użyć jej przeniesienia Path
obiektu 100 jednostek niezależnych od urządzenia wzdłuż osi x. Jeśli zmienisz M22
wartość na 3, możesz użyć jej do rozciągnięcia Path
obiektu na trzy razy więcej niż jego bieżąca wysokość. Jeśli zmienisz obie wartości, przeniesiesz Path
obiekt 100 jednostek niezależnych od urządzenia wzdłuż osi x i rozciągniesz jego wysokość przez współczynnik 3. Ponadto macierze przekształcania affine można mnożyć w celu utworzenia dowolnej liczby przekształceń liniowych, takich jak rotacja i niesymetryczność, a następnie tłumaczenie.
Przekształcenia niestandardowe
Klasa MatrixTransform
, która pochodzi z Transform
klasy, definiuje Matrix
właściwość typu Matrix
, która reprezentuje macierz definiującą transformację. Ta właściwość jest wspierana BindableProperty
przez obiekt, co oznacza, że może być obiektem docelowym powiązań danych i stylizowany.
Dowolna transformacja, którą można opisać za pomocą obiektu TranslateTransform
, , ScaleTransform
RotateTransform
lubSkewTransform
, może być równie opisana przez obiekt MatrixTransform
. Jednak TranslateTransform
klasy , ScaleTransform
, RotateTransform
i SkewTransform
są łatwiejsze do koncepcji niż ustawianie składników wektorów w obiekcie Matrix
. MatrixTransform
W związku z tym klasa jest zwykle używana do tworzenia przekształceń niestandardowych, które nie są dostarczane przez RotateTransform
klasy , ScaleTransform
, SkewTransform
lub TranslateTransform
.
W poniższym przykładzie pokazano, jak przekształcić Path
obiekt przy użyciu elementu MatrixTransform
:
<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>
W tym przykładzie Path
obiekt jest rozciągnięty, skośny i przesunięty zarówno w wymiarach X, jak i Y.
Alternatywnie można to napisać w uproszczonej postaci, która używa konwertera typów wbudowanego w Xamarin.Formsprogram :
<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>
W tym przykładzie Matrix
właściwość jest określana jako ciąg rozdzielany przecinkami składający się z sześciu elementów członkowskich: M11
, , M12
M21
, M22
, OffsetX
OffsetY
. Podczas gdy składowe są rozdzielane przecinkami w tym przykładzie, można je również rozdzielić co najmniej jedną spacją.
Ponadto poprzedni przykład można jeszcze bardziej uprościć, określając te same sześć elementów członkowskich co wartość RenderTransform
właściwości:
<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" />