Android view的位移滑动
基础
Android view的移动不管特效多么绚丽,都是view控件的基础移动实现的。
方式:
- scrollTo/scrollby: view控件内容移动。
- 动画:给view实现移动效果。
- LayoutParams: 使view重新布局实现view移动。
1: scrollBy/scrollTo
1.1: 内容左边界
-
View:对于单个view,内容左边界就是文字图片等的左边界。eg:botton可以很大但他的内容显示可能就一个单词,
而内容左边界就是这个单词的左边起始位置。
-
ViewGroup:以单个view的理解,ViewGroup的内容左边界就是它包裹的控件的左边界。
1.2 scrollBy/scrollTo滑动
view 控件内容的滑动,eg: ScrollView包裹的控件,Button上显示的文字,但控件自身的位置不会改变。
// scrollBy scroolTo源码
public void scrollBy(int x, int y) {
scrollTo(mScrollX + x, mScrollY + y);
}
public void scrollTo(int x, int y) {
if (mScrollX != x || mScrollY != y) {
int oldX = mScrollX;
int oldY = mScrollY;
mScrollX = x;
mScrollY = y;
invalidateParentCaches();
onScrollChanged(mScrollX, mScrollY, oldX, oldY);
if (!awakenScrollBars()) {
postInvalidateOnAnimation();
}
}
}
这里mScrollx/mScrolly是view内容已经滑动的距离可由get方法获取,从源码可以看出.
- scrollBy是在现有基础上滑动x, y距离。
- scrollTo是滑动到x, y位置。
方向
上述两个方法都是对mScrollx/mScrolly进行操作的,
- mScrollx : 已view内容左边界为准,向左滑为正,向右滑为负。
- mScrolly: 已view内容上边界为准,向上滑为正,向下滑为负。
即左上为正,右下为负。
2. 动画
使用动画操作的是view的translationX与translationY属性。可以使用传统动画或者属性动画。
TranslateAnimation animation = new TranslateAnimation(0f, 0f, 0f, 150f);
animation.setDuration(1500);
view.startAnimation(animation);
3. 布局参数LayoutParams
RelativeLayout.LayoutParams layoutParams = (RelativeLayout.LayoutParams)
mTvLayoutParam.getLayoutParams();
layoutParams.topMargin = layoutParams.topMargin + 50;
mTvLayoutParam.requestLayout();
直接代码改变view的布局参数从根本上改变view的位置,
mTvTranslate.offsetTopAndBottom(50);
这个方法根本上也是对LayoutParams的改变,只是在原有的LayoutParams上进行了加减。
网友评论