diff --git a/widgets/src/main/java/org/nativescript/widgets/OriginPoint.java b/widgets/src/main/java/org/nativescript/widgets/OriginPoint.java new file mode 100644 index 000000000..6ea55395a --- /dev/null +++ b/widgets/src/main/java/org/nativescript/widgets/OriginPoint.java @@ -0,0 +1,73 @@ +package org.nativescript.widgets; + +import android.view.View; +import java.util.WeakHashMap; + +/** + * A class encapsulating the logic of setting an origin point. + * The origin acts as a pivot point but is relative to the View size, + * Where 0 is the left or top of the view, 0.5 is at the middle and 1 is right or bottom. + * Under the hood the pivot point is set but is updated when the View's layout is changed. + */ +public class OriginPoint { + private static WeakHashMap layoutListeners; + + public static void setX(View view, float x) { + getSetter(view).setOriginX(view, x); + } + + public static void setY(View view, float y) { + getSetter(view).setOriginY(view, y); + } + + private static PivotSetter getSetter(View view) { + PivotSetter setter = null; + + if (layoutListeners == null) { + layoutListeners = new WeakHashMap<>(); + } else { + setter = layoutListeners.get(view); + } + + if (setter == null) { + setter = new PivotSetter(); + view.addOnLayoutChangeListener(setter); + layoutListeners.put(view, setter); + } + + return setter; + } + + private static class PivotSetter implements View.OnLayoutChangeListener { + private float originX; + private float originY; + + public PivotSetter() { + originX = 0.5f; + originY = 0.5f; + } + + public void setOriginX(View view, float x) { + originX = x; + updateX(view, view.getWidth()); + } + + public void setOriginY(View view, float y) { + originY = y; + updateY(view, view.getHeight()); + } + + public void onLayoutChange(View view, int left, int top, int right, int bottom, int oldLeft, int oldTop, int oldRight, int oldBottom) { + updateX(view, right - left); + updateY(view, bottom - top); + } + + private void updateX(View view, int width) { + view.setPivotX(originX * width); + } + + private void updateY(View view, int height) { + view.setPivotY(originY * height); + } + } +}