友情提示:看了我这篇文章,你就可以去吐槽其他博主了,这么简单的东西,你们解释的也太复杂了,看了更让人不懂了
结论:
这几个概念,由于名字或者意义上具有一定的相似性,硬扣字面,非常容易晕菜,所以要先说结论:
x/y
是最终结果,“最终事实”;x/y
的数值,是由left/top/right/bottom
+translationX/Y
共同决定的left/top/right/bottom
是以子View四条边,相对于父View四条边为参照的translationX/Y
是指,View当前的"最终事实位置",相对于他自己的左边和上边的偏移量
说人话就是:x/y
是"视觉效果",“视觉坐标”,“最终结果”,它是由left/top/right/bottom
和translationX/Y
共同决定的.实际上,只需要记住,两个参照系不同的参数,构成了最终的视觉结果,就算抓住了纲领:x/y=left/top +translationX/Y
问题
绿色View距离父布局左和上的距离都是80个像素,那么他的x/y,left/top,translationX/Y分别是多少?
答案
外人,除了能肯定x/y是80之外,另外两个参数,根本确定不了.
原因
-
getX()的doc,只看前一句就行了,翻译过来是:获取的是此View(在父布局中)的视觉坐标.
-
getLeft():返回的View的左边界到父布局左边界的距离
-
getTranslationX():返回的是View在水平上,距离他自己的左边的距离
回到第一幅图,视觉上,距离父布局左边距80Pix的效果,是由left和translationX共同作用决定的,理论上有无数种可能,是个此消彼长的过程;这就好比你兜里有100块钱(x)来自你父母(left和translationX),但是你这100块,你父母是怎么各自出资的,有无数中可能一样.
- left=80,而translationX=0
- left=0,而translationX=80
- left=40,而translationX=40
- left=-80,而translationX=160
- 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出来的数值,是不会有相应变化的.