Add OriginPoint that will recalculate the pivot point on layout cange

This commit is contained in:
Panayot Cankov
2016-01-15 15:02:39 +02:00
parent 433476a298
commit 1a9e6f69c0

View File

@@ -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<View, PivotSetter> 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);
}
}
}