Source code
package android.support.design.widget;
import android.os.Build.VERSION;
import android.support.v4.view.ViewCompat;
import android.view.View;
import android.view.ViewParent;
class ViewOffsetHelper {
private int mLayoutLeft;
private int mLayoutTop;
private int mOffsetLeft;
private int mOffsetTop;
private final View mView;
public ViewOffsetHelper(View view) {
this.mView = view;
}
public void onViewLayout() {
this.mLayoutTop = this.mView.getTop();
this.mLayoutLeft = this.mView.getLeft();
updateOffsets();
}
private void updateOffsets() {
ViewCompat.offsetTopAndBottom(this.mView, this.mOffsetTop - (this.mView.getTop() - this.mLayoutTop));
ViewCompat.offsetLeftAndRight(this.mView, this.mOffsetLeft - (this.mView.getLeft() - this.mLayoutLeft));
if (VERSION.SDK_INT < 23) {
tickleInvalidationFlag(this.mView);
ViewParent vp = this.mView.getParent();
if (vp instanceof View) {
tickleInvalidationFlag((View) vp);
}
}
}
private static void tickleInvalidationFlag(View view) {
float x = ViewCompat.getTranslationX(view);
ViewCompat.setTranslationY(view, 1.0f + x);
ViewCompat.setTranslationY(view, x);
}
public boolean setTopAndBottomOffset(int offset) {
if (this.mOffsetTop == offset) {
return false;
}
this.mOffsetTop = offset;
updateOffsets();
return true;
}
public boolean setLeftAndRightOffset(int offset) {
if (this.mOffsetLeft == offset) {
return false;
}
this.mOffsetLeft = offset;
updateOffsets();
return true;
}
public int getTopAndBottomOffset() {
return this.mOffsetTop;
}
public int getLeftAndRightOffset() {
return this.mOffsetLeft;
}
}