老牛知点所以然-区分View的translationX/Y,x/y,left/top/right/bottom

友情提示:看了我这篇文章,你就可以去吐槽其他博主了,这么简单的东西,你们解释的也太复杂了,看了更让人不懂了

结论:

这几个概念,由于名字或者意义上具有一定的相似性,硬扣字面,非常容易晕菜,所以要先说结论:

  1. x/y是最终结果,“最终事实”;x/y的数值,是由left/top/right/bottom +translationX/Y共同决定的
  2. left/top/right/bottom是以子View四条边,相对于父View四条边为参照的
  3. translationX/Y是指,View当前的"最终事实位置",相对于他自己的左边和上边的偏移量

说人话就是:x/y是"视觉效果",“视觉坐标”,“最终结果”,它是由left/top/right/bottomtranslationX/Y共同决定的.实际上,只需要记住,两个参照系不同的参数,构成了最终的视觉结果,就算抓住了纲领:x/y=left/top +translationX/Y

问题

绿色View距离父布局左和上的距离都是80个像素,那么他的x/y,left/top,translationX/Y分别是多少?
在这里插入图片描述

答案

外人,除了能肯定x/y是80之外,另外两个参数,根本确定不了.

原因
  1. getX()的doc,只看前一句就行了,翻译过来是:获取的是此View(在父布局中)的视觉坐标.在这里插入图片描述

  2. getLeft():返回的View的左边界到父布局左边界的距离
    在这里插入图片描述

  3. getTranslationX():返回的是View在水平上,距离他自己的左边的距离
    在这里插入图片描述

回到第一幅图,视觉上,距离父布局左边距80Pix的效果,是由left和translationX共同作用决定的,理论上有无数种可能,是个此消彼长的过程;这就好比你兜里有100块钱(x)来自你父母(left和translationX),但是你这100块,你父母是怎么各自出资的,有无数中可能一样.

  1. left=80,而translationX=0
  2. left=0,而translationX=80
  3. left=40,而translationX=40
  4. left=-80,而translationX=160
  5. left=160,而translationX=-80

还有更贴切的比喻吗?
呃,left/top/right/bottom可以理解为View的魂,x/y可以理解为View的形;
View形的位置,等于魂离它父布局的距离 + 形离他自己魂的距离…

Mark:通过设置x/y,translationX/Y,left/top/right/bottom改变View的位置后,View是在新位置响应点击事件的

用那个?

left/right/top/bottom,是和View大小有关的,当你改变这几个值时,表现出来的,是View "Frame"的变化,也就是View高矮胖瘦的变化,而不是View整体位置的改变.
所以,当你的需求,是改变View的视觉位置时,果断用setX/Y,他里面帮你计算了考虑View边界对于父布局的距离后,还要偏移的距离,然后设置偏移量,让你传入的参数,和你预期的效果一致.
不要去想使用left/right/top/bottom了,DOC为证:

在这里插入图片描述
这个方法,本意是为layout那一套东西准备的,而不是为我们信手拈来改变View状态准备的.
顺便提一嘴getHeight/Width和getMeasuredHeight
前者,是"视觉"上的,也就是,如果你通过set改变了View的上下左右,那么get出来的值,是跟随变化的;相对的,后者,是指View布局时,测量出来的结果,如果View的视觉变化,是你通过操作left/right/top/bottom实现的,而不是通过LayoutParams,那么,后者get出来的数值,是不会有相应变化的.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值