diff --git a/CrossPlatformModules.csproj b/CrossPlatformModules.csproj
index bb95f4f6c..62f5dea41 100644
--- a/CrossPlatformModules.csproj
+++ b/CrossPlatformModules.csproj
@@ -2104,7 +2104,7 @@
False
-
+
\ No newline at end of file
diff --git a/apps/transforms/main-page.ts b/apps/transforms/main-page.ts
index 94782be09..7dee8e379 100644
--- a/apps/transforms/main-page.ts
+++ b/apps/transforms/main-page.ts
@@ -5,4 +5,9 @@ import model = require("./model");
export function pageLoaded(args: observable.EventData) {
var page = args.object;
page.bindingContext = new model.ViewModel();
+}
+
+export function onReset(args: observable.EventData) {
+ var model = (args.object).bindingContext;
+ model.reset();
}
\ No newline at end of file
diff --git a/apps/transforms/main-page.xml b/apps/transforms/main-page.xml
index 7940cb54a..46aed804d 100644
--- a/apps/transforms/main-page.xml
+++ b/apps/transforms/main-page.xml
@@ -1,29 +1,56 @@
-
-
+
+
-
-
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
+
\ No newline at end of file
diff --git a/apps/transforms/model.ts b/apps/transforms/model.ts
index a103b8a96..c97b2b292 100644
--- a/apps/transforms/model.ts
+++ b/apps/transforms/model.ts
@@ -3,6 +3,7 @@
export class ViewModel extends observable.Observable {
constructor() {
super();
+ this.reset();
}
private _translateX = 0;;
@@ -23,7 +24,7 @@ export class ViewModel extends observable.Observable {
this.notify({ object: this, eventName: observable.Observable.propertyChangeEvent, propertyName: "translateY", value: value });
}
- private _scaleX = 1;
+ private _scaleX = 100;
get scaleX(): number {
return this._scaleX;
}
@@ -32,7 +33,7 @@ export class ViewModel extends observable.Observable {
this.notify({ object: this, eventName: observable.Observable.propertyChangeEvent, propertyName: "scaleX", value: value });
}
- private _scaleY = 1;
+ private _scaleY = 100;
get scaleY(): number {
return this._scaleY;
}
@@ -41,6 +42,24 @@ export class ViewModel extends observable.Observable {
this.notify({ object: this, eventName: observable.Observable.propertyChangeEvent, propertyName: "scaleY", value: value });
}
+ private _originX = 50;
+ get originX(): number {
+ return this._originX;
+ }
+ set originX(value: number) {
+ this._originX = value;
+ this.notify({ object: this, eventName: observable.Observable.propertyChangeEvent, propertyName: "originX", value: value });
+ }
+
+ private _originY = 50;
+ get originY(): number {
+ return this._originY;
+ }
+ set originY(value: number) {
+ this._originY = value;
+ this.notify({ object: this, eventName: observable.Observable.propertyChangeEvent, propertyName: "originY", value: value });
+ }
+
private _rotate = 0;
get rotate(): number {
return this._rotate;
@@ -49,4 +68,14 @@ export class ViewModel extends observable.Observable {
this._rotate = value;
this.notify({ object: this, eventName: observable.Observable.propertyChangeEvent, propertyName: "rotate", value: value });
}
+
+ public reset() {
+ this.originX = 50;
+ this.originY = 50;
+ this.scaleX = 100;
+ this.scaleY = 100;
+ this.translateX = 0;
+ this.translateY = 0;
+ this.rotate = 0;
+ }
}
\ No newline at end of file
diff --git a/ui/core/view-common.ts b/ui/core/view-common.ts
index c1c85898b..b43eb7c4f 100644
--- a/ui/core/view-common.ts
+++ b/ui/core/view-common.ts
@@ -148,6 +148,18 @@ var scaleYProperty = new dependencyObservable.Property(
"View",
new proxy.PropertyMetadata(1)
);
+
+var originXProperty = new dependencyObservable.Property(
+ "originX",
+ "View",
+ new proxy.PropertyMetadata(0.5)
+ );
+
+var originYProperty = new dependencyObservable.Property(
+ "originY",
+ "View",
+ new proxy.PropertyMetadata(0.5)
+ );
var rotateProperty = new dependencyObservable.Property(
"rotate",
@@ -178,6 +190,8 @@ export class View extends proxy.ProxyObject implements definition.View {
public static translateYProperty = translateYProperty;
public static scaleXProperty = scaleXProperty;
public static scaleYProperty = scaleYProperty;
+ public static originXProperty = originXProperty;
+ public static originYProperty = originYProperty;
public static rotateProperty = rotateProperty;
public static isEnabledProperty = isEnabledProperty;
public static isUserInteractionEnabledProperty = isUserInteractionEnabledProperty;
@@ -470,6 +484,20 @@ export class View extends proxy.ProxyObject implements definition.View {
this._setValue(View.scaleYProperty, value);
}
+ get originX(): number {
+ return this._getValue(View.originXProperty);
+ }
+ set originX(value: number) {
+ this._setValue(View.originXProperty, value);
+ }
+
+ get originY(): number {
+ return this._getValue(View.originYProperty);
+ }
+ set originY(value: number) {
+ this._setValue(View.originYProperty, value);
+ }
+
get rotate(): number {
return this._getValue(View.rotateProperty);
}
diff --git a/ui/core/view.android.ts b/ui/core/view.android.ts
index 6a600229f..9a8e91f90 100644
--- a/ui/core/view.android.ts
+++ b/ui/core/view.android.ts
@@ -44,6 +44,20 @@ function onScaleYPropertyChanged(data: dependencyObservable.PropertyChangeData)
}
(viewCommon.View.scaleYProperty.metadata).onSetNativeValue = onScaleYPropertyChanged;
+function onOriginXPropertyChanged(data: dependencyObservable.PropertyChangeData) {
+ var view = data.object;
+ var width = view._nativeView.getWidth();
+ view._nativeView.setPivotX(data.newValue * width);
+}
+(viewCommon.View.originXProperty.metadata).onSetNativeValue = onOriginXPropertyChanged;
+
+function onOriginYPropertyChanged(data: dependencyObservable.PropertyChangeData) {
+ var view = data.object;
+ var height = view._nativeView.getHeight();
+ view._nativeView.setPivotY(data.newValue * height);
+}
+(viewCommon.View.originYProperty.metadata).onSetNativeValue = onOriginYPropertyChanged;
+
function onRotatePropertyChanged(data: dependencyObservable.PropertyChangeData) {
var view = data.object;
view._nativeView.setRotation(data.newValue);
diff --git a/ui/core/view.d.ts b/ui/core/view.d.ts
index a6fd21c06..ede1427e8 100644
--- a/ui/core/view.d.ts
+++ b/ui/core/view.d.ts
@@ -259,6 +259,16 @@ declare module "ui/core/view" {
*/
scaleY: number;
+ /**
+ * Gets or sets the X component of the origin point around which the view will be transformed. The deafault value is 0.5 representing the center of the view.
+ */
+ originX: number;
+
+ /**
+ * Gets or sets the Y component of the origin point around which the view will be transformed. The deafault value is 0.5 representing the center of the view.
+ */
+ originY: number;
+
/**
* Gets or sets the rotate affine transform of the view.
*/
diff --git a/ui/core/view.ios.ts b/ui/core/view.ios.ts
index 1927f8532..1186fcb48 100644
--- a/ui/core/view.ios.ts
+++ b/ui/core/view.ios.ts
@@ -66,6 +66,20 @@ function onScaleYPropertyChanged(data: dependencyObservable.PropertyChangeData)
}
(viewCommon.View.scaleYProperty.metadata).onSetNativeValue = onScaleYPropertyChanged;
+function onOriginXPropertyChanged(data: dependencyObservable.PropertyChangeData) {
+ var view = data.object;
+ var current = view._nativeView.layer.anchorPoint;
+ view._nativeView.layer.anchorPoint = CGPointMake(data.newValue, current.y);
+}
+(viewCommon.View.originXProperty.metadata).onSetNativeValue = onOriginXPropertyChanged;
+
+function onOriginYPropertyChanged(data: dependencyObservable.PropertyChangeData) {
+ var view = data.object;
+ var current = view._nativeView.layer.anchorPoint;
+ view._nativeView.layer.anchorPoint = CGPointMake(current.x, data.newValue);
+}
+(viewCommon.View.originYProperty.metadata).onSetNativeValue = onOriginYPropertyChanged;
+
function onRotatePropertyChanged(data: dependencyObservable.PropertyChangeData) {
var view = data.object;
var newTransform = CGAffineTransformIdentity;