在实际的开发之中,很多时候需要根据手势或者按钮的点击来修改某些空间的位置,一般常见的做法为
1.根据手势所获得的x,y坐标,重新调用view.layout方法,随之把参数都设置进去。
2.使用属性动画,也就是object.animation的方法,设置透明或者x,y方向上的改变,当然做这个要考虑低版本的处理,需要导入nineOldandroid包来兼容。
3.使用补间动画,也就是Alpha、Scale、Translate和Rotate其中的Scale、Translate来修改。
当然本篇不讲这些,来说下比较简单的做法。View的源码之中有这么2个api
public void offsetLeftAndRight(int offset) {
if (offset != 0) {
final boolean matrixIsIdentity = hasIdentityMatrix();
if (matrixIsIdentity) {
if (isHardwareAccelerated()) {
invalidateViewProperty(false, false);
} else {
final ViewParent p = mParent;
if (p != null && mAttachInfo != null) {
final Rect r = mAttachInfo.mTmpInvalRect;
int minLeft;
int maxRight;
if (offset < 0) {
minLeft = mLeft + offset;
maxRight = mRight;
} else {
minLeft = mLeft;
maxRight = mRight + offset;
}
r.set(0, 0, maxRight - minLeft, mBottom - mTop);
p.invalidateChild(this, r);
}
}
} else {
invalidateViewProperty(false, false);
}
mLeft += offset;
mRight += offset;
mRenderNode.offsetLeftAndRight(offset);
if (isHardwareAccelerated()) {
invalidateViewProperty(false, false);
invalidateParentIfNeededAndWasQuickRejected();
} else {
if (!matrixIsIdentity) {
invalidateViewProperty(false, true);
}
invalidateParentIfNeeded();
}
notifySubtreeAccessibilityStateChangedIfNeeded();
}
}
/**
* Offset this view's vertical location by the specified number of pixels.
*
* @param offset the number of pixels to offset the view by
*/
public void offsetTopAndBottom(int offset) {
if (offset != 0) {
final boolean matrixIsIdentity = hasIdentityMatrix();
if (matrixIsIdentity) {
if (isHardwareAccelerated()) {
invalidateViewProperty(false, false);
} else {
final ViewParent p = mParent;
if (p != null && mAttachInfo != null) {
final Rect r = mAttachInfo.mTmpInvalRect;
int minTop;
int maxBottom;
int yLoc;
if (offset < 0) {
minTop = mTop + offset;
maxBottom = mBottom;
yLoc = offset;
} else {
minTop = mTop;
maxBottom = mBottom + offset;
yLoc = 0;
}
r.set(0, yLoc, mRight - mLeft, maxBottom - minTop);
p.invalidateChild(this, r);
}
}
} else {
invalidateViewProperty(false, false);
}
mTop += offset;
mBottom += offset;
mRenderNode.offsetTopAndBottom(offset);
if (isHardwareAccelerated()) {
invalidateViewProperty(false, false);
invalidateParentIfNeededAndWasQuickRejected();
} else {
if (!matrixIsIdentity) {
invalidateViewProperty(false, true);
}
invalidateParentIfNeeded();
}
notifySubtreeAccessibilityStateChangedIfNeeded();
}
}
通过上面2个截图,我们可以直接传递参数进去,就可以进行水平/垂直方向上的偏移了,当然实际上主要还是通过改变这个view的坐标属性来通知刷新重绘从而改变UI实际的位置。
具体用法如
textview.offsetTopAndBottom(10);//垂直方向上向下移动10像素
简单做法,可以复杂的用于手势的移动一些UI,比如google官方的下拉刷新就是主要用这个api来移动那个刷新圆圈。
当然,更多的用法还要自己去琢磨和实际的运用。谢谢。