View的坐标系

1. left,right,top,bottom

这四个属性决定了一个view的位置。view总是要摆放在一个容器中,因此这四个属性的值是相对于其父容器的左上角而言的。即,view的left为100px,意味着距离父容器的左上角横坐标为100个像素,view的top为100px,意味着距离父容器左上角纵坐标为100个像素。而view的rigth为left+view的width,bottom为view的top+view的height。其中widht和height可以通过view的getWidth和getHeight方法获得。

2. translation、translationY属性

这个属性添加自Android 3.0之后。

如果我们要改变一个View在父容器中的位置,可以增加这个View的外边距。例如,将view向右移动300px,可以增加view的左外边距300px。

MarginLayoutParams params = (MarginLayoutParams)view.getLayoutParams();

params.leftMargin += 300;

view.setLayoutParams(params);

此时view会向右移动300px,同时view的left属性值也会在原值基础上增加300px。

在引入了translationX和translationY这两个属性后,通过设置这两个值同样可以引起view 的移动,translationX意思是将view水平移动到距离view的left多远的地方。例如将view的translationX设置为300px,意味着将view移动到距离left 300px的位置。此时需要注意三个事情:

1)view确实移动了,且距离原先的位置300px

2)view的left没有改变。因为改变的是translatioinX属性值,并没有改变left值。

3)因为left的值没有改变,所以再次设置translationX为300px时,view是不会动的。因为此时view已经距离left为300px了,即此时的translationX的值已经是300px了。

3. x,y属性

与translationX和translationY一起新增的属性还有x和y。其中:

x = left + translationX

y = top + translationY

另外还需要注意View的x、y与MotionEvent的x、y不要搞混了

4. scrollX、scrollY属性

视图大小与视图要显示的内容大小可以是不一样的。最常见的比如ImageView,当遇到图片与ImageView尺寸不一致时,ImageView会以缩放的方式用来显示图片,比较常用的就是fitXY,center等。View提供了scrollTo / scrollBy方法来移动View中显示的内容到指定的位置。而这个指定的位置就是scrollX和scrollY。其中scrollX代表着View的左侧边缘与内容的左侧边缘之间的距离。当View的左侧边缘在内容的左侧边缘左侧时,scrollX的值为负数,反之为正数;scrollY代表着View的顶部边缘与内容的顶部边缘之间的距离。当View的顶部边缘在内容的顶部边缘上方时,scrollY的值为负数,反之为正数。

将以上的内容用代码再进行一次描述:

布局文件:


这里为了避免屏幕密度问题,将度量单位使用的为px。ImageView加载了一幅200px*200px的纯色图片,ImageView还有一个深灰色的背景。

初始时屏幕的效果。


在代码中打印left、top、right、bottom、width和height


打印结果为:


用一个示意图来表示也就是:


接下来写一段通过设置translationX进行移动view的代码


当动画结束时,打印的结果是:


可以看到left没有改变,此时iv的translationX为300,x为400

此时如果再次执行上述代码,iv的位置是不会改变的。因为此时translationX已经是300了。

画一幅示意图来示意一下移动后的样子:


最后写一段代码来移动iv中的内容。iv中现在显示的是一幅200px*200px大小的图片a.jpg


执行后的打印结果为:


此时的效果为:


深灰色为iv的背景色,红色为移动后的iv中显示的内容。因为scrollTo里面给定的值为100,-100,即移动后的scrollX为100,iv的左侧边缘在图像左侧边缘的右侧100个像素;scrollY为-100,iv的顶部边缘在图像顶部边缘上方100个像素。

再给一幅示意图来示意一下此时iv和图像:


最后看一下scollTo方法的源代码:

其实scrollTo方法的主要作用就是给view的scrollX和scrollY两个属性赋值,赋的值就是参数中传入的两个int。然后将新赋值的scrollX,scrollY以及原先的scrollX和scrollY一并作为参数提交给onScrollChanged方法进行操作。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值