View的坐标系

原创 2016年08月28日 23:54:16

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方法进行操作。

相关文章推荐

Android的坐标系及获取View的坐标方法

android中有两种坐标系,分别称之为Android坐标系和视图坐标系。 我们经常在自定义View,在测量和绘制时会用到这些,只有我们弄清楚它们才能保证不出错。下面我们来谈谈它们的定义及区别吧。一...

Android的自定义View的坐标系

最近正在学习自定义View,因为每次我们的开发时,毕竟我们所有的UI控件都不是拿来就用的,虽然很多开源的库,但是也不是都可以满足我们的需求,即使有本人认为不爱动手写的程序员不是合格的程序猿。近期查阅了...

自定义View基础之坐标系

一.屏幕坐标系和数学坐标系的区别  移动设备上的坐标是按照屏幕左上角开始计算的,从左上角到右边是X轴,从屏幕左上角到下边是Y轴,并且都是正数。而数学中的坐标系是X轴和Y轴交叉,有正负之分。和手机屏幕的...
  • hnzcdy
  • hnzcdy
  • 2017年03月22日 17:45
  • 306

Android View坐标系详解(getTop()、getX、getTranslationX...)

View 提供了如下 5 种方法获取 View 的坐标: 1. View.getTop()、View.getLeft()、View.getBottom()、View.getRight(); 2. Vi...

android之View坐标系

在做一个view背景特效的时候被坐标的各个获取方法搞晕了,几篇抄来抄去的博客也没弄很清楚。 现在把整个总结一下。 其实只要把下面这张图看明白就没问题了。 涉及到的方法一共有下面几个: vi...

自定义View基础-坐标系

一.屏幕坐标系和数学坐标系的区别 由于移动设备一般定义屏幕左上角为坐标原点,向右为x轴增大方向,向下为y轴增大方向, 所以在手机屏幕上的坐标系与数学中常见的坐标系是稍微有点差别的,详情如下: ...

安卓自定义View基础:坐标系

原文章地址 一.屏幕坐标系和数学坐标系的区别 由于移动设备一般定义屏幕左上角为坐标原点,向右为x轴增大方向,向下为y轴增大方向, 所以在手机屏幕上的坐标系与数学中常见的坐标系是稍微有点差别的,详情...

安卓自定义 View 基础:坐标系

安卓中的坐标系 一.屏幕坐标系和数学坐标系的区别 由于移动设备一般定义屏幕左上角为坐标原点,向右为x轴增大方向,向下为y轴增大方向, 所以在手机屏幕上的坐标系与数学...

Android开发 View的平移、缩放、旋转以及位置、坐标系

转载地址:http://blog.csdn.net/eieihihi/article/details/45668189 1、移动View内容的相关变量和方法 (注意:是移动View所包含的内容,...
  • QQ55214
  • QQ55214
  • 2016年08月31日 16:15
  • 8904

Android View体系(一)视图坐标系

Android View体系是界面编程的核心,他的重要性不亚于Android四大组件,在这个系列中我会陆续讲到View坐标系、View的滑动、View的事件分发等文章来逐步介绍Android View...
  • itachi85
  • itachi85
  • 2016年02月23日 19:25
  • 14180
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:View的坐标系
举报原因:
原因补充:

(最多只允许输入30个字)