diff --git a/samples/RenderDemo/Pages/Transform3DPage.axaml b/samples/RenderDemo/Pages/Transform3DPage.axaml
index fa03c7ba49..30ed35bbac 100644
--- a/samples/RenderDemo/Pages/Transform3DPage.axaml
+++ b/samples/RenderDemo/Pages/Transform3DPage.axaml
@@ -21,149 +21,139 @@
+
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
-
-
-
+
-
-
-
-
+
-
-
-
-
+
-
-
-
-
+
diff --git a/src/Android/Avalonia.AndroidTestApplication/Resources/Resource.Designer.cs b/src/Android/Avalonia.AndroidTestApplication/Resources/Resource.Designer.cs
index 83db67fcee..87fd47df25 100644
--- a/src/Android/Avalonia.AndroidTestApplication/Resources/Resource.Designer.cs
+++ b/src/Android/Avalonia.AndroidTestApplication/Resources/Resource.Designer.cs
@@ -14,7 +14,7 @@ namespace Avalonia.AndroidTestApplication
{
- [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Xamarin.Android.Build.Tasks", "1.0.0.0")]
+ [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Xamarin.Android.Build.Tasks", "12.1.99.62")]
public partial class Resource
{
diff --git a/src/Avalonia.Visuals/Animation/Transitions/Rotate3DTransition.cs b/src/Avalonia.Visuals/Animation/Transitions/Rotate3DTransition.cs
index b603fe5f7b..56567f5fea 100644
--- a/src/Avalonia.Visuals/Animation/Transitions/Rotate3DTransition.cs
+++ b/src/Avalonia.Visuals/Animation/Transitions/Rotate3DTransition.cs
@@ -2,6 +2,7 @@ using System;
using System.Collections.Generic;
using System.Threading;
using System.Threading.Tasks;
+using Avalonia.Collections;
using Avalonia.Media;
using Avalonia.Styling;
@@ -9,18 +10,26 @@ namespace Avalonia.Animation;
public class Rotate3DTransition: PageSlide
{
-
+
///
- /// Creates a new instance if the
+ /// Creates a new instance of the
///
/// How long the rotation should take place
/// The orientation of the rotation
- public Rotate3DTransition(TimeSpan duration, SlideAxis orientation = SlideAxis.Horizontal)
+ public Rotate3DTransition(TimeSpan duration, SlideAxis orientation = SlideAxis.Horizontal, double? depth = null)
: base(duration, orientation)
- {}
+ {
+ Depth = depth;
+ }
+
+ ///
+ /// Defines the depth of the 3D Effect. If null, depth will be calculated automatically from the width or height
+ /// of the common parent of the visual being rotated.
+ ///
+ public double? Depth { get; set; }
///
- /// Creates a new instance if the
+ /// Creates a new instance of the
///
public Rotate3DTransition() { }
@@ -41,49 +50,32 @@ public class Rotate3DTransition: PageSlide
_ => throw new ArgumentOutOfRangeException()
};
- var depthSetter = new Setter {Property = Rotate3DTransform.DepthProperty, Value = center};
+ var depthSetter = new Setter {Property = Rotate3DTransform.DepthProperty, Value = Depth ?? center};
var centerZSetter = new Setter {Property = Rotate3DTransform.CenterZProperty, Value = -center / 2};
+ KeyFrame CreateKeyFrame(double cue, double rotation, int zIndex) =>
+ new() {
+ Setters =
+ {
+ new Setter { Property = rotateProperty, Value = rotation },
+ new Setter { Property = Visual.ZIndexProperty, Value = zIndex },
+ centerZSetter,
+ depthSetter
+ },
+ Cue = new Cue(cue)
+ };
+
if (from != null)
{
var animation = new Animation
{
+ Easing = SlideOutEasing,
Duration = Duration,
Children =
{
- new KeyFrame
- {
- Setters =
- {
- new Setter { Property = rotateProperty, Value = 0d },
- new Setter { Property = Visual.ZIndexProperty, Value = 2 },
- centerZSetter,
- depthSetter,
- },
- Cue = new Cue(0d)
- },
- new KeyFrame
- {
- Setters =
- {
- new Setter { Property = rotateProperty, Value = 45d * (forward ? -1 : 1) },
- new Setter { Property = Visual.ZIndexProperty, Value = 1 },
- centerZSetter,
- depthSetter
- },
- Cue = new Cue(0.5d)
- },
- new KeyFrame
- {
- Setters =
- {
- new Setter { Property = rotateProperty, Value = 90d * (forward ? -1 : 1) },
- new Setter { Property = Visual.ZIndexProperty, Value = 1 },
- centerZSetter,
- depthSetter
- },
- Cue = new Cue(1d)
- }
+ CreateKeyFrame(0d, 0d, 2),
+ CreateKeyFrame(0.5d, 45d * (forward ? -1 : 1), 1),
+ CreateKeyFrame(1d, 90d * (forward ? -1 : 1), 1)
}
};
@@ -95,42 +87,13 @@ public class Rotate3DTransition: PageSlide
to.IsVisible = true;
var animation = new Animation
{
+ Easing = SlideInEasing,
Duration = Duration,
Children =
{
- new KeyFrame
- {
- Setters =
- {
- new Setter { Property = rotateProperty, Value = 90d * (forward ? 1 : -1) },
- new Setter { Property = Visual.ZIndexProperty, Value = 1 },
- centerZSetter,
- depthSetter
- },
- Cue = new Cue(0d)
- },
- new KeyFrame
- {
- Setters =
- {
- new Setter { Property = Visual.ZIndexProperty, Value = 1 },
- new Setter { Property = rotateProperty, Value = 45d * (forward ? 1 : -1) },
- centerZSetter,
- depthSetter
- },
- Cue = new Cue(0.5d)
- },
- new KeyFrame
- {
- Setters =
- {
- new Setter { Property = rotateProperty, Value = 0d },
- new Setter { Property = Visual.ZIndexProperty, Value = 2 },
- centerZSetter,
- depthSetter,
- },
- Cue = new Cue(1d)
- }
+ CreateKeyFrame(0d, 90d * (forward ? 1 : -1), 1),
+ CreateKeyFrame(0.5d, 45d * (forward ? 1 : -1), 1),
+ CreateKeyFrame(1d, 0d, 2)
}
};
@@ -139,15 +102,18 @@ public class Rotate3DTransition: PageSlide
await Task.WhenAll(tasks);
- if (from != null && !cancellationToken.IsCancellationRequested)
+ if (!cancellationToken.IsCancellationRequested)
{
- from.IsVisible = false;
- from.ZIndex = 1;
- }
+ if (from != null)
+ {
+ from.IsVisible = false;
+ from.ZIndex = 1;
+ }
- if (to != null && !cancellationToken.IsCancellationRequested)
- {
- to.ZIndex = 2;
+ if (to != null)
+ {
+ to.ZIndex = 2;
+ }
}
}
}
diff --git a/src/Avalonia.Visuals/Matrix.cs b/src/Avalonia.Visuals/Matrix.cs
index 5c7d42676a..5bbc657385 100644
--- a/src/Avalonia.Visuals/Matrix.cs
+++ b/src/Avalonia.Visuals/Matrix.cs
@@ -348,15 +348,9 @@ namespace Avalonia
}
else
{
- var x = p.X;
- var y = p.Y;
- var xAdd = y * M21 + M31;
- var yAdd = x * M12 + M32;
- x *= M11;
- x += xAdd;
- y *= M22;
- y += yAdd;
- transformedResult = new Point(x, y);
+ return new Point(
+ (p.X * M11) + (p.Y * M21) + M31,
+ (p.X * M12) + (p.Y * M22) + M32);
}
return transformedResult;
diff --git a/src/Avalonia.Visuals/Media/Rotate3DTransform.cs b/src/Avalonia.Visuals/Media/Rotate3DTransform.cs
index 0fea9d73a0..4feca7acd8 100644
--- a/src/Avalonia.Visuals/Media/Rotate3DTransform.cs
+++ b/src/Avalonia.Visuals/Media/Rotate3DTransform.cs
@@ -5,7 +5,7 @@ using Avalonia.Animation.Animators;
namespace Avalonia.Media;
///
-/// Non-Affine 3D transformation for rotating an visual around a definable axis
+/// Non-Affine 3D transformation for rotating a visual around a definable axis
///
public class Rotate3DTransform : Transform
{
diff --git a/src/Avalonia.Visuals/Point.cs b/src/Avalonia.Visuals/Point.cs
index 8e01ea47c5..fbdf0db800 100644
--- a/src/Avalonia.Visuals/Point.cs
+++ b/src/Avalonia.Visuals/Point.cs
@@ -169,12 +169,7 @@ namespace Avalonia
/// The point.
/// The matrix.
/// The resulting point.
- public static Point operator *(Point point, Matrix matrix)
- {
- return new Point(
- (point.X * matrix.M11) + (point.Y * matrix.M21) + matrix.M31,
- (point.X * matrix.M12) + (point.Y * matrix.M22) + matrix.M32);
- }
+ public static Point operator *(Point point, Matrix matrix) => matrix.Transform(point);
///
/// Parses a string.