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 View体系是界面编程的核心,他的重要性不亚于Android四大组件,在这个系列中我会陆续讲到View坐标系、View的滑动、View的事件分发等文章来逐步介绍Android View...
  • itachi85
  • itachi85
  • 2016年02月23日 19:25
  • 15800

QT的Graphics View框架与坐标系

原文链接   http://dxwang.blog.51cto.com/384651/215340 Graphics View提供了一个界面,它既可以管理大数量的定制2D graphical ite...
  • pfm685757
  • pfm685757
  • 2016年02月25日 16:22
  • 876

Android应用坐标系统全面详解

很多人可能不屑一顾Android的坐标系,但是如果你想彻底学会自定义控件,我想说了解Android各种坐标系及一些API的坐标含义绝对算一个小而不可忽视的技能;所谓Android自定义View那几大主...
  • yanbober
  • yanbober
  • 2016年01月05日 20:20
  • 27508

android学习5#--自定义View之坐标系统

近期在学习android过程中,看到有人在伯乐在线上分享如何开发自定义View的一系列文章。我觉得对于初学者,很有必要掌握它,因为今后很多时候系统自带的组件不足以满足我们的功能需求,那么我们就要根据需...
  • uudou
  • uudou
  • 2016年06月15日 15:09
  • 1150

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

由于移动设备一般定义屏幕左上角为坐标原点,向右为 x 轴增大方向,向下为 y 轴增大方向, 所以在手机屏幕上的坐标系与数学中常见的坐标系是稍微有点差别的。...
  • u013831257
  • u013831257
  • 2016年01月05日 17:39
  • 3376

你真的了解View的坐标吗?

闲聊View,对我们来说在熟悉不过了,从接触Android开始,我们就一直在接触View,界面当中到处都是 View,比如我们经常用到的TextView,Button,LinearLayout等等,但...
  • gdutxiaoxu
  • gdutxiaoxu
  • 2016年12月16日 22:22
  • 1683

Android 坐标系与视图坐标系图解

1.Android坐标系在Android中,将屏幕的最左上角顶点作为Android坐标系的原点 从原点向右是X轴的正方向,从原点向下是Y轴的正方向View提供了getLocationOnScre...
  • zhuwentao2150
  • zhuwentao2150
  • 2016年09月04日 21:34
  • 1741

Android自定义View(一)__坐标系

*屏幕坐标系和数学中的坐标系的区别由于Android定义屏幕左上角为坐标原点 , 向右为x轴增大方向 , 向下为y轴增大方向 , 所以在手机屏幕上的坐标系与数学中常见的坐标系是稍微有点差别的,详情如下...
  • EaskShark
  • EaskShark
  • 2016年12月02日 15:23
  • 1010

iOS-UIView坐标系转换-convertRect toview

iOS-- UIView中的坐标转换// 将像素point由point所在视图转换到目标视图view中,返回在目标视图view中的像素值 - (CGPoint)convertPoint:(CGPoin...
  • qiuxuewei2012
  • qiuxuewei2012
  • 2016年04月13日 17:54
  • 10689

Android 屏幕(View)坐标系统

首先明确一下 android中的坐标系统 :屏幕的左上角是坐标系统原点(0,0),原点向右延伸是X轴正方向,原点向下延伸是Y轴正方向。一、View的坐标    需要注意view的坐标是相对父容器而言的...
  • wangjinyu501
  • wangjinyu501
  • 2014年03月22日 21:34
  • 13940
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:View的坐标系
举报原因:
原因补充:

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