View的位置参数
View中有四个基本的位置参数,分别是left,right,top,bottom。分别代表View的左上角横坐标,右上角横坐标,左上角纵坐标,右下角纵坐标。这四个参数都是相对父容器来说的。View有一个获得宽高的方法:getWidth()和getHeight(),其内部实现就是width=right-left,height = bottom-top。并且这四个属性的赋值是在layout方法中。
android 3.0开始给View新增了几个位置参数:x,y,translationX,translationY。其中x,y代表View左上角的坐标,translationX和translationY代表View相对父容器的偏移量,其初始值是0。
在View平移的过程中,top,left,right,bottom表示的还是原始左上角的位置信息,值不会改变。改变的是x,y,translationX,translationY。有如下公式:
x = left + translationX
ScrollBy和ScrollTo
ScrollBy和ScrollTo可以用来实现View的滑动,不过根据我的理解,这种方式只能移动“画框”。有其局限性。
例如有如下代码:
FrameLayout viewById = (FrameLayout) findViewById(R.id.frame1);
viewById.scrollBy(-50,-50);
如上图,在执行scrollBy方法之前,是上图状态。
执行之后的状态如上图,在ScrollBy之前,灰色框左上角相当于mScrollX = 0,mScrollY = 0。而scrollBy(-50,-50)相当于把“相框”往负方向移50。但是framLayout里面的布局没变。scrollTo同理。
动画
用动画实现滑动比较简单,有补间动画和属性动画可供选择。两者的区别是补间动画并不是真正的移动,动画执行完成后控件还在原地。而属性动画则是控件真正的移动,因为是在改变其属性。
补间动画的使用方法如下:
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:fillAfter="true"
>
<translate
android:duration="2000"
android:fromXDelta="0"
android:toXDelta="300"
android:fromYDelta="0"
android:toYDelta="300"/>
</set>
Animation animation = AnimationUtils.loadAnimation(MainActivity.this, R.anim.trans1);
tv1.startAnimation(animation);
或者用代码创建:
TranslateAnimation translateAnimation = new TranslateAnimation(0,200,0,200);
translateAnimation.setFillAfter(true);
translateAnimation.setDuration(3000);
tv1.startAnimation(translateAnimation);
属性动画的使用方式就不再介绍了。
改变LayoutParamas位置参数
通过改变LayoutParamas位置参数也可以实现滑动:
ViewGroup.MarginLayoutParams layoutParams = (ViewGroup.MarginLayoutParams) tv1.getLayoutParams();
layoutParams.leftMargin+=100;
tv1.setLayoutParams(layoutParams);
tv1.requestLayout();
实现平滑滑动如下:
final ViewGroup.MarginLayoutParams layoutParams = (ViewGroup.MarginLayoutParams) tv1.getLayoutParams();
final long l = System.currentTimeMillis();
Handler handler = new Handler(){
@Override
public void handleMessage(Message msg) {
layoutParams.leftMargin+=1;
tv1.setLayoutParams(layoutParams);
tv1.requestLayout();
if(System.currentTimeMillis()-l<10000){
sendEmptyMessageDelayed(0,50);
}
}
};
handler.sendEmptyMessage(0);
总结
scrollTo/scrollBy适合用于整体内容的滑动。
动画适合用于没有交互的View(考虑到兼容,非属性动画实现交互很麻烦)和实现复杂效果。
改变布局参数实现起来稍微麻烦一些,但适合有交互的滑动。