[*] ScaleX and ScaleY
authorStephane Delcroix <stephane@delcroix.org>
Mon, 6 Feb 2017 14:16:54 +0000 (15:16 +0100)
committerStephane Delcroix <stephane@delcroix.org>
Mon, 6 Feb 2017 14:16:54 +0000 (15:16 +0100)
AndroidNative/FormsViewGroup/src/com/xamarin/forms/platform/android/FormsViewGroup.java
Xamarin.Forms.Controls/GalleryPages/ScaleRotate.cs
Xamarin.Forms.Core/VisualElement.cs
Xamarin.Forms.Platform.Android/VisualElementTracker.cs
Xamarin.Forms.Platform.WP8/VisualElementTracker.cs
Xamarin.Forms.Platform.WinRT/VisualElementTracker.cs
Xamarin.Forms.Platform.iOS/VisualElementTracker.cs

index 2168f32..b9ce8e8 100644 (file)
@@ -72,7 +72,8 @@ public class FormsViewGroup extends ViewGroup {
                        float rotation, 
                        float rotationX, 
                        float rotationY,
-                       float scale,
+                       float scaleX,
+                       float scaleY
                        float translationX,
                        float translationY){
                setPivotX (pivotX);
@@ -88,8 +89,8 @@ public class FormsViewGroup extends ViewGroup {
                setRotation (rotation);
                setRotationX (rotationX);
                setRotationY (rotationY);
-               setScaleX (scale);
-               setScaleY (scale);
+               setScaleX (scaleX);
+               setScaleY (sclaeY);
                setTranslationX (translationX);
                setTranslationY (translationY);
        }
index e189f83..18276d8 100644 (file)
@@ -39,19 +39,41 @@ namespace Xamarin.Forms.Controls
                        scaleSlider.SetBinding(Slider.ValueProperty,
                                new Binding("Scale", BindingMode.TwoWay));
 
+                       // Label and Slider for ScaleX property.
+                       Label scaleXSliderValue = new Label {
+                               VerticalTextAlignment = TextAlignment.Center
+                       };
+                       Grid.SetRow(scaleXSliderValue, 1);
+                       Grid.SetColumn(scaleXSliderValue, 0);
+
+                       Slider scaleXSlider = new Slider {
+                               Maximum = 10
+                       };
+                       Grid.SetRow(scaleXSlider, 1);
+                       Grid.SetColumn(scaleXSlider, 1);
+
+                       // Set Bindings.
+                       scaleXSliderValue.BindingContext = scaleXSlider;
+                       scaleXSliderValue.SetBinding(Label.TextProperty,
+                               new Binding("Value", BindingMode.OneWay, null, null, "ScaleX = {0:F1}"));
+
+                       scaleXSlider.BindingContext = label;
+                       scaleXSlider.SetBinding(Slider.ValueProperty,
+                               new Binding("ScaleX", BindingMode.TwoWay));
+
                        // Label and Slider for Rotation property.
                        Label rotationSliderValue = new Label
                        {
                                VerticalTextAlignment = TextAlignment.Center
                        };
-                       Grid.SetRow(rotationSliderValue, 1);
+                       Grid.SetRow(rotationSliderValue, 2);
                        Grid.SetColumn(rotationSliderValue, 0);
 
                        Slider rotationSlider = new Slider
                        {
                                Maximum = 360
                        };
-                       Grid.SetRow(rotationSlider, 1);
+                       Grid.SetRow(rotationSlider, 2);
                        Grid.SetColumn(rotationSlider, 1);
 
                        // Set Bindings.
@@ -68,7 +90,7 @@ namespace Xamarin.Forms.Controls
                        {
                                VerticalTextAlignment = TextAlignment.Center
                        };
-                       Grid.SetRow(anchorxStepperValue, 2);
+                       Grid.SetRow(anchorxStepperValue, 3);
                        Grid.SetColumn(anchorxStepperValue, 0);
 
                        Stepper anchorxStepper = new Stepper
@@ -77,7 +99,7 @@ namespace Xamarin.Forms.Controls
                                Minimum = -1,
                                Increment = 0.5
                        };
-                       Grid.SetRow(anchorxStepper, 2);
+                       Grid.SetRow(anchorxStepper, 3);
                        Grid.SetColumn(anchorxStepper, 1);
 
                        // Set bindings.
@@ -94,7 +116,7 @@ namespace Xamarin.Forms.Controls
                        {
                                VerticalTextAlignment = TextAlignment.Center
                        };
-                       Grid.SetRow(anchoryStepperValue, 3);
+                       Grid.SetRow(anchoryStepperValue, 4);
                        Grid.SetColumn(anchoryStepperValue, 0);
 
                        Stepper anchoryStepper = new Stepper
@@ -103,7 +125,7 @@ namespace Xamarin.Forms.Controls
                                Minimum = -1,
                                Increment = 0.5
                        };
-                       Grid.SetRow(anchoryStepper, 3);
+                       Grid.SetRow(anchoryStepper, 4);
                        Grid.SetColumn(anchoryStepper, 1);
 
                        // Set bindings.
@@ -130,6 +152,7 @@ namespace Xamarin.Forms.Controls
                                                        new RowDefinition { Height = GridLength.Auto },
                                                        new RowDefinition { Height = GridLength.Auto },
                                                        new RowDefinition { Height = GridLength.Auto },
+                                                       new RowDefinition { Height = GridLength.Auto },
                                                },
                                                ColumnDefinitions = 
                                                {
@@ -140,6 +163,8 @@ namespace Xamarin.Forms.Controls
                                                {
                                                        scaleSliderValue,
                                                        scaleSlider,
+                                                       scaleXSliderValue,
+                                                       scaleXSlider,
                                                        rotationSliderValue,
                                                        rotationSlider,
                                                        anchorxStepperValue, 
index 352e254..e0125f3 100644 (file)
@@ -48,6 +48,10 @@ namespace Xamarin.Forms
 
                public static readonly BindableProperty ScaleProperty = BindableProperty.Create("Scale", typeof(double), typeof(VisualElement), 1d);
 
+               public static readonly BindableProperty ScaleXProperty = BindableProperty.Create("ScaleX", typeof(double), typeof(VisualElement), 1d);
+
+               public static readonly BindableProperty ScaleYProperty = BindableProperty.Create("ScaleY", typeof(double), typeof(VisualElement), 1d);
+
                public static readonly BindableProperty IsVisibleProperty = BindableProperty.Create("IsVisible", typeof(bool), typeof(VisualElement), true,
                        propertyChanged: (bindable, oldvalue, newvalue) => ((VisualElement)bindable).OnIsVisibleChanged((bool)oldvalue, (bool)newvalue));
 
@@ -242,6 +246,16 @@ namespace Xamarin.Forms
                        set { SetValue(ScaleProperty, value); }
                }
 
+               public double ScaleX {
+                       get { return (double)GetValue(ScaleXProperty); }
+                       set { SetValue(ScaleXProperty, value); }
+               }
+
+               public double ScaleY {
+                       get { return (double)GetValue(ScaleYProperty); }
+                       set { SetValue(ScaleYProperty, value); }
+               }
+
                public Style Style
                {
                        get { return (Style)GetValue(StyleProperty); }
index 7ade459..b2e9fe4 100644 (file)
@@ -120,7 +120,7 @@ namespace Xamarin.Forms.Platform.Android
                                if (e.PropertyName == VisualElement.XProperty.PropertyName || e.PropertyName == VisualElement.YProperty.PropertyName || e.PropertyName == VisualElement.WidthProperty.PropertyName ||
                                        e.PropertyName == VisualElement.HeightProperty.PropertyName)
                                        _layoutNeeded = true;
-                               else if (e.PropertyName == VisualElement.AnchorXProperty.PropertyName || e.PropertyName == VisualElement.AnchorYProperty.PropertyName || e.PropertyName == VisualElement.ScaleProperty.PropertyName ||
+                               else if (e.PropertyName == VisualElement.AnchorXProperty.PropertyName || e.PropertyName == VisualElement.AnchorYProperty.PropertyName || e.PropertyName == VisualElement.ScaleProperty.PropertyName || e.PropertyName == VisualElement.ScaleXProperty.PropertyName || e.PropertyName == VisualElement.ScaleYProperty.PropertyName ||
                                                 e.PropertyName == VisualElement.RotationProperty.PropertyName || e.PropertyName == VisualElement.RotationXProperty.PropertyName || e.PropertyName == VisualElement.RotationYProperty.PropertyName ||
                                                 e.PropertyName == VisualElement.IsVisibleProperty.PropertyName || e.PropertyName == VisualElement.OpacityProperty.PropertyName ||
                                                 e.PropertyName == VisualElement.TranslationXProperty.PropertyName || e.PropertyName == VisualElement.TranslationYProperty.PropertyName)
@@ -138,7 +138,7 @@ namespace Xamarin.Forms.Platform.Android
                                UpdateAnchorX();
                        else if (e.PropertyName == VisualElement.AnchorYProperty.PropertyName)
                                UpdateAnchorY();
-                       else if (e.PropertyName == VisualElement.ScaleProperty.PropertyName)
+                       else if (e.PropertyName == VisualElement.ScaleProperty.PropertyName || e.PropertyName == VisualElement.ScaleXProperty.PropertyName || e.PropertyName == VisualElement.ScaleYProperty.PropertyName)
                                UpdateScale();
                        else if (e.PropertyName == VisualElement.RotationProperty.PropertyName)
                                UpdateRotation();
@@ -230,7 +230,7 @@ namespace Xamarin.Forms.Platform.Android
                                                UpdateRotationX();
                                        if (oldElement.RotationY != newElement.RotationY)
                                                UpdateRotationY();
-                                       if (oldElement.Scale != newElement.Scale)
+                                       if (oldElement.Scale != newElement.Scale || oldElement.ScaleX != newElement.ScaleY || oldElement.ScaleY != newElement.ScaleY)
                                                UpdateScale();
                                        // ReSharper restore CompareOfFloatsByEqualityOperator
 
@@ -299,9 +299,18 @@ namespace Xamarin.Forms.Platform.Android
                        if (aview is FormsViewGroup)
                        {
                                var formsViewGroup = (FormsViewGroup)aview;
-                               formsViewGroup.SendBatchUpdate((float)(view.AnchorX * _context.ToPixels(view.Width)), (float)(view.AnchorY * _context.ToPixels(view.Height)),
-                                       (int)(view.IsVisible ? ViewStates.Visible : ViewStates.Invisible), view.IsEnabled, (float)view.Opacity, (float)view.Rotation, (float)view.RotationX, (float)view.RotationY, (float)view.Scale,
-                                       _context.ToPixels(view.TranslationX), _context.ToPixels(view.TranslationY));
+                               formsViewGroup.SendBatchUpdate((float)(view.AnchorX * _context.ToPixels(view.Width)),
+                                                                                          (float)(view.AnchorY * _context.ToPixels(view.Height)),
+                                                                                          (int)(view.IsVisible ? ViewStates.Visible : ViewStates.Invisible),
+                                                                                          view.IsEnabled,
+                                                                                          (float)view.Opacity,
+                                                                                          (float)view.Rotation,
+                                                                                          (float)view.RotationX,
+                                                                                          (float)view.RotationY,
+                                                                                          (float)view.ScaleX,
+                                                                                          (float)view.ScaleY,
+                                                                                          _context.ToPixels(view.TranslationX),
+                                                                                          _context.ToPixels(view.TranslationY));
                        }
                        else
                        {
@@ -365,8 +374,8 @@ namespace Xamarin.Forms.Platform.Android
                        VisualElement view = _renderer.Element;
                        AView aview = _renderer.ViewGroup;
 
-                       aview.ScaleX = (float)view.Scale;
-                       aview.ScaleY = (float)view.Scale;
+                       aview.ScaleX = (float)view.Scale * (float)view.ScaleX;
+                       aview.ScaleY = (float)view.Scale * (float)view.ScaleY;
                }
 
                void UpdateTranslationX()
index 45b51a9..c197bbf 100644 (file)
@@ -160,7 +160,7 @@ namespace Xamarin.Forms.Platform.WinPhone
                                MaybeInvalidate();
                        else if (e.PropertyName == VisualElement.AnchorXProperty.PropertyName || e.PropertyName == VisualElement.AnchorYProperty.PropertyName)
                                UpdateScaleAndRotation(Model, Element);
-                       else if (e.PropertyName == VisualElement.ScaleProperty.PropertyName)
+                       else if (e.PropertyName == VisualElement.ScaleProperty.PropertyName || e.PropertyName == VisualElement.ScaleXProperty.PropertyName || e.PropertyName == VisualElement.ScaleYProperty.PropertyName )
                                UpdateScaleAndRotation(Model, Element);
                        else if (e.PropertyName == VisualElement.TranslationXProperty.PropertyName || e.PropertyName == VisualElement.TranslationYProperty.PropertyName ||
                                         e.PropertyName == VisualElement.RotationProperty.PropertyName || e.PropertyName == VisualElement.RotationXProperty.PropertyName || e.PropertyName == VisualElement.RotationYProperty.PropertyName)
@@ -350,9 +350,8 @@ namespace Xamarin.Forms.Platform.WinPhone
                {
                        double anchorX = view.AnchorX;
                        double anchorY = view.AnchorY;
-                       double scale = view.Scale;
                        frameworkElement.RenderTransformOrigin = new System.Windows.Point(anchorX, anchorY);
-                       frameworkElement.RenderTransform = new ScaleTransform { ScaleX = scale, ScaleY = scale };
+                       frameworkElement.RenderTransform = new ScaleTransform { ScaleX = view.Scale * view.ScaleX, ScaleY = view.Scale * view.ScaleY };
 
                        UpdateRotation(view, frameworkElement);
                }
index 760b9b3..6eadec7 100644 (file)
@@ -188,7 +188,7 @@ namespace Xamarin.Forms.Platform.WinRT
                        {
                                UpdateScaleAndRotation(Element, Container);
                        }
-                       else if (e.PropertyName == VisualElement.ScaleProperty.PropertyName)
+                       else if (e.PropertyName == VisualElement.ScaleProperty.PropertyName || e.PropertyName == VisualElement.ScaleXProperty.PropertyName ||)e.PropertyName == VisualElement.ScaleYProperty.PropertyName
                        {
                                UpdateScaleAndRotation(Element, Container);
                        }
@@ -470,9 +470,8 @@ namespace Xamarin.Forms.Platform.WinRT
                {
                        double anchorX = view.AnchorX;
                        double anchorY = view.AnchorY;
-                       double scale = view.Scale;
                        frameworkElement.RenderTransformOrigin = new Windows.Foundation.Point(anchorX, anchorY);
-                       frameworkElement.RenderTransform = new ScaleTransform { ScaleX = scale, ScaleY = scale };
+                       frameworkElement.RenderTransform = new ScaleTransform { ScaleX = view.Scale * view.ScaleX, view.Scale * view.ScaleY = scale };
 
                        UpdateRotation(view, frameworkElement);
                }
index 29840e2..4ca7539 100644 (file)
@@ -78,7 +78,7 @@ namespace Xamarin.Forms.Platform.MacOS
                {
                        if (e.PropertyName == VisualElement.XProperty.PropertyName || e.PropertyName == VisualElement.YProperty.PropertyName || e.PropertyName == VisualElement.WidthProperty.PropertyName ||
                                e.PropertyName == VisualElement.HeightProperty.PropertyName || e.PropertyName == VisualElement.AnchorXProperty.PropertyName || e.PropertyName == VisualElement.AnchorYProperty.PropertyName ||
-                               e.PropertyName == VisualElement.TranslationXProperty.PropertyName || e.PropertyName == VisualElement.TranslationYProperty.PropertyName || e.PropertyName == VisualElement.ScaleProperty.PropertyName ||
+                               e.PropertyName == VisualElement.TranslationXProperty.PropertyName || e.PropertyName == VisualElement.TranslationYProperty.PropertyName || e.PropertyName == VisualElement.ScaleProperty.PropertyName || e.PropertyName == VisualElement.ScaleXProperty.PropertyName || e.PropertyName == VisualElement.ScaleYProperty.PropertyName ||
                                e.PropertyName == VisualElement.RotationProperty.PropertyName || e.PropertyName == VisualElement.RotationXProperty.PropertyName || e.PropertyName == VisualElement.RotationYProperty.PropertyName ||
                                e.PropertyName == VisualElement.IsVisibleProperty.PropertyName || e.PropertyName == VisualElement.IsEnabledProperty.PropertyName ||
                                e.PropertyName == VisualElement.InputTransparentProperty.PropertyName || e.PropertyName == VisualElement.OpacityProperty.PropertyName)
@@ -135,6 +135,8 @@ namespace Xamarin.Forms.Platform.MacOS
                        var rotationY = (float)view.RotationY;
                        var rotation = (float)view.Rotation;
                        var scale = (float)view.Scale;
+                       var scaleX = (float)view.ScaleX * scale;
+                       var scaleY = (float)view.ScaleY * scale;
                        var width = (float)view.Width;
                        var height = (float)view.Height;
                        var x = (float)view.X;
@@ -227,8 +229,8 @@ namespace Xamarin.Forms.Platform.MacOS
                                if (Math.Abs(translationX) > epsilon || Math.Abs(translationY) > epsilon)
                                        transform = transform.Translate(translationX, translationY, 0);
 
-                               if (Math.Abs(scale - 1) > epsilon)
-                                       transform = transform.Scale(scale);
+                               if (Math.Abs(scaleX - 1) > epsilon || Math.Abs(scaleY - 1) > epsilon)
+                                       transform = transform.Scale(scaleX, scaleY, scale);
 
                                // not just an optimization, iOS will not "pixel align" a view which has m34 set
                                if (Math.Abs(rotationY % 180) > epsilon || Math.Abs(rotationX % 180) > epsilon)