参考资料:http://liuwangshu.cn/application/view/2-sliding.html
目录
平移方法总结
建议将View移动前后的getLeft、getRight、getX、getY的参数打印出来,对比变化。
private void print(View view){
int left = view.getLeft();
int right = view.getRight();
float x = view.getX();
float y = view.getY();
Log.d(TAG, "left: " + left + ",right = " + right + ",x = " + x + ",y = " + y);
}
平移方法1:setTranslationX与setTranslationY
View的位置变化
setTranslationX后,getLeft()不变,getX()会变。
恢复方法是setTranslationX(0),而不是上一次偏移量的相反数。
tvTest.setTranslationX(tvTest.getTranslationX() + 200);
平移方法2:layout
View的layout方法会改变View的边界的绝对位置,View的尺寸也就随之变化了,如果不想改变尺寸,只想改变位置,则left与right,top与bottom的增量应该方向相同大小相等。
layout之后,getLeft()、getX()都会变化。
layout(getLeft()+offsetX, getTop()+offsetY,
getRight()+offsetX , getBottom()+offsetY);
平移方法3:offsetLeftAndRight与offsetTopAndBottom
仅View的位置变化,offset为正则x轴正向移动。
offset之后,getLeft()、getRight()、getX()都会变化,但是View原有的尺寸不会变化。
tvTest.offsetLeftAndRight(-200);
平移方法4:layoutParams
仅View的位置变化
TODO:第一次setLayoutParams之后,View的getLeft、getX等参数并没有变化,但是View的位置确实变化了。后面再setLayoutParams,getLeft()、getRight()、getX()都会变化。
ViewGroup.MarginLayoutParams layoutParams = (ViewGroup.MarginLayoutParams) tvTest.getLayoutParams();
layoutParams.leftMargin = layoutParams.leftMargin + (-200);
tvTest.setLayoutParams(layoutParams);
平移方法5:动画
View的位置变化了,但是点击的位置不变(补间动画)。
getLeft、getX等参数均不变化
终于明白了为什么View的位置挪动了,原来的位置还能点击,因为点击对象是根据点击坐标计算检索出来的。
Animation animation = AnimationUtils.loadAnimation(this, R.anim.translate);
animation.setFillAfter(true);
tvTest.startAnimation(animation);
平移方法6:scollTo与scollBy
scollTo、scollBy移动的是View的内容,如果在ViewGroup中使用则是移动他所有的子View。
getLeft、getX等参数均不变化
平移方法7:Scroller
用法:http://liuwangshu.cn/application/view/2-sliding.html
源码:http://liuwangshu.cn/application/view/4-scroller-sourcecode.html
0 条评论