mirror of
https://github.com/NativeScript/NativeScript.git
synced 2025-11-05 13:26:48 +08:00
Add OriginPoint that will recalculate the pivot point on layout cange
This commit is contained in:
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user