下面列出了android.view.Gravity#AXIS_Y_SHIFT 实例代码,或者点击链接到github查看源代码,也可以在右侧发表评论。
public static int getGravityFromRelative(int childGravity, ConfigDefinition config) {
// swap directions for vertical non relative view
// if it is relative, then START is TOP, and we do not need to switch it here.
// it will be switched later on onMeasure stage when calculations will be with length and thickness
if (config.getOrientation() == CommonLogic.VERTICAL && (childGravity & Gravity.RELATIVE_LAYOUT_DIRECTION) == 0) {
int horizontalGravity = childGravity;
childGravity = 0;
childGravity |= (horizontalGravity & Gravity.HORIZONTAL_GRAVITY_MASK) >> Gravity.AXIS_X_SHIFT << Gravity.AXIS_Y_SHIFT;
childGravity |= (horizontalGravity & Gravity.VERTICAL_GRAVITY_MASK) >> Gravity.AXIS_Y_SHIFT << Gravity.AXIS_X_SHIFT;
}
// for relative layout and RTL direction swap left and right gravity
if (config.getLayoutDirection() == View.LAYOUT_DIRECTION_RTL && (childGravity & Gravity.RELATIVE_LAYOUT_DIRECTION) != 0) {
int ltrGravity = childGravity;
childGravity = 0;
childGravity |= (ltrGravity & Gravity.LEFT) == Gravity.LEFT ? Gravity.RIGHT : 0;
childGravity |= (ltrGravity & Gravity.RIGHT) == Gravity.RIGHT ? Gravity.LEFT : 0;
}
return childGravity;
}
private int getGravityFromRelative(int childGravity) {
// swap directions for vertical non relative view
// if it is relative, then START is TOP, and we do not need to switch it here.
// it will be switched later on onMeasure stage when calculations will be with length and thickness
if (this.config.getOrientation() == VERTICAL && (childGravity & Gravity.RELATIVE_LAYOUT_DIRECTION) == 0) {
int horizontalGravity = childGravity;
childGravity = 0;
childGravity |= (horizontalGravity & Gravity.HORIZONTAL_GRAVITY_MASK) >> Gravity.AXIS_X_SHIFT << Gravity.AXIS_Y_SHIFT;
childGravity |= (horizontalGravity & Gravity.VERTICAL_GRAVITY_MASK) >> Gravity.AXIS_Y_SHIFT << Gravity.AXIS_X_SHIFT;
}
// for relative layout and RTL direction swap left and right gravity
if (this.config.getLayoutDirection() == LAYOUT_DIRECTION_RTL && (childGravity & Gravity.RELATIVE_LAYOUT_DIRECTION) != 0) {
int ltrGravity = childGravity;
childGravity = 0;
childGravity |= (ltrGravity & Gravity.LEFT) == Gravity.LEFT ? Gravity.RIGHT : 0;
childGravity |= (ltrGravity & Gravity.RIGHT) == Gravity.RIGHT ? Gravity.LEFT : 0;
}
return childGravity;
}
@SuppressWarnings("SameParameterValue")
private static void apply(int gravity, float w, float h, Rect container,
float xAdj, float yAdj, RectF outRect) {
switch (gravity & ((Gravity.AXIS_PULL_BEFORE | Gravity.AXIS_PULL_AFTER) <<
Gravity.AXIS_X_SHIFT)) {
case 0:
outRect.left = container.left
+ ((container.right - container.left - w) * 0.5f) + xAdj;
outRect.right = outRect.left + w;
if ((gravity & (Gravity.AXIS_CLIP << Gravity.AXIS_X_SHIFT))
== (Gravity.AXIS_CLIP << Gravity.AXIS_X_SHIFT)) {
if (outRect.left < container.left) {
outRect.left = container.left;
}
if (outRect.right > container.right) {
outRect.right = container.right;
}
}
break;
case Gravity.AXIS_PULL_BEFORE << Gravity.AXIS_X_SHIFT:
outRect.left = container.left + xAdj;
outRect.right = outRect.left + w;
if ((gravity & (Gravity.AXIS_CLIP << Gravity.AXIS_X_SHIFT))
== (Gravity.AXIS_CLIP << Gravity.AXIS_X_SHIFT)) {
if (outRect.right > container.right) {
outRect.right = container.right;
}
}
break;
case Gravity.AXIS_PULL_AFTER << Gravity.AXIS_X_SHIFT:
outRect.right = container.right - xAdj;
outRect.left = outRect.right - w;
if ((gravity & (Gravity.AXIS_CLIP << Gravity.AXIS_X_SHIFT))
== (Gravity.AXIS_CLIP << Gravity.AXIS_X_SHIFT)) {
if (outRect.left < container.left) {
outRect.left = container.left;
}
}
break;
default:
outRect.left = container.left + xAdj;
outRect.right = container.right + xAdj;
break;
}
switch (gravity & ((Gravity.AXIS_PULL_BEFORE | Gravity.AXIS_PULL_AFTER) <<
Gravity.AXIS_Y_SHIFT)) {
case 0:
outRect.top = container.top
+ ((container.bottom - container.top - h) * 0.5f) + yAdj;
outRect.bottom = outRect.top + h;
if ((gravity & (Gravity.AXIS_CLIP << Gravity.AXIS_Y_SHIFT))
== (Gravity.AXIS_CLIP << Gravity.AXIS_Y_SHIFT)) {
if (outRect.top < container.top) {
outRect.top = container.top;
}
if (outRect.bottom > container.bottom) {
outRect.bottom = container.bottom;
}
}
break;
case Gravity.AXIS_PULL_BEFORE << Gravity.AXIS_Y_SHIFT:
outRect.top = container.top + yAdj;
outRect.bottom = outRect.top + h;
if ((gravity & (Gravity.AXIS_CLIP << Gravity.AXIS_Y_SHIFT))
== (Gravity.AXIS_CLIP << Gravity.AXIS_Y_SHIFT)) {
if (outRect.bottom > container.bottom) {
outRect.bottom = container.bottom;
}
}
break;
case Gravity.AXIS_PULL_AFTER << Gravity.AXIS_Y_SHIFT:
outRect.bottom = container.bottom - yAdj;
outRect.top = outRect.bottom - h;
if ((gravity & (Gravity.AXIS_CLIP << Gravity.AXIS_Y_SHIFT))
== (Gravity.AXIS_CLIP << Gravity.AXIS_Y_SHIFT)) {
if (outRect.top < container.top) {
outRect.top = container.top;
}
}
break;
default:
outRect.top = container.top + yAdj;
outRect.bottom = container.bottom + yAdj;
break;
}
}
@SuppressWarnings("SameParameterValue")
private static void apply(int gravity, float w, float h, RectF container,
float xAdj, float yAdj, RectF outRect) {
switch (gravity & ((Gravity.AXIS_PULL_BEFORE | Gravity.AXIS_PULL_AFTER) <<
Gravity.AXIS_X_SHIFT)) {
case 0:
outRect.left = container.left
+ ((container.right - container.left - w) * 0.5f) + xAdj;
outRect.right = outRect.left + w;
if ((gravity & (Gravity.AXIS_CLIP << Gravity.AXIS_X_SHIFT))
== (Gravity.AXIS_CLIP << Gravity.AXIS_X_SHIFT)) {
if (outRect.left < container.left) {
outRect.left = container.left;
}
if (outRect.right > container.right) {
outRect.right = container.right;
}
}
break;
case Gravity.AXIS_PULL_BEFORE << Gravity.AXIS_X_SHIFT:
outRect.left = container.left + xAdj;
outRect.right = outRect.left + w;
if ((gravity & (Gravity.AXIS_CLIP << Gravity.AXIS_X_SHIFT))
== (Gravity.AXIS_CLIP << Gravity.AXIS_X_SHIFT)) {
if (outRect.right > container.right) {
outRect.right = container.right;
}
}
break;
case Gravity.AXIS_PULL_AFTER << Gravity.AXIS_X_SHIFT:
outRect.right = container.right - xAdj;
outRect.left = outRect.right - w;
if ((gravity & (Gravity.AXIS_CLIP << Gravity.AXIS_X_SHIFT))
== (Gravity.AXIS_CLIP << Gravity.AXIS_X_SHIFT)) {
if (outRect.left < container.left) {
outRect.left = container.left;
}
}
break;
default:
outRect.left = container.left + xAdj;
outRect.right = container.right + xAdj;
break;
}
switch (gravity & ((Gravity.AXIS_PULL_BEFORE | Gravity.AXIS_PULL_AFTER) <<
Gravity.AXIS_Y_SHIFT)) {
case 0:
outRect.top = container.top
+ ((container.bottom - container.top - h) * 0.5f) + yAdj;
outRect.bottom = outRect.top + h;
if ((gravity & (Gravity.AXIS_CLIP << Gravity.AXIS_Y_SHIFT))
== (Gravity.AXIS_CLIP << Gravity.AXIS_Y_SHIFT)) {
if (outRect.top < container.top) {
outRect.top = container.top;
}
if (outRect.bottom > container.bottom) {
outRect.bottom = container.bottom;
}
}
break;
case Gravity.AXIS_PULL_BEFORE << Gravity.AXIS_Y_SHIFT:
outRect.top = container.top + yAdj;
outRect.bottom = outRect.top + h;
if ((gravity & (Gravity.AXIS_CLIP << Gravity.AXIS_Y_SHIFT))
== (Gravity.AXIS_CLIP << Gravity.AXIS_Y_SHIFT)) {
if (outRect.bottom > container.bottom) {
outRect.bottom = container.bottom;
}
}
break;
case Gravity.AXIS_PULL_AFTER << Gravity.AXIS_Y_SHIFT:
outRect.bottom = container.bottom - yAdj;
outRect.top = outRect.bottom - h;
if ((gravity & (Gravity.AXIS_CLIP << Gravity.AXIS_Y_SHIFT))
== (Gravity.AXIS_CLIP << Gravity.AXIS_Y_SHIFT)) {
if (outRect.top < container.top) {
outRect.top = container.top;
}
}
break;
default:
outRect.top = container.top + yAdj;
outRect.bottom = container.bottom + yAdj;
break;
}
}