这几天在研究嵌套滚动的东西,在处理滚动的时候,发现自己对上述一些方法了解还不深入,之后琢磨了一下,这里做个记录。
分两部分来看:
第一部分:
View的getX()、getLeft()、getTranslationX()
要清楚他们这几个方法的区别,就需要知道他们的"x" 、"left"、"translateX"代表的含义(left、right、bottom、top 或 X、Y等类似),这里就直接说结果了。
这里以left举例:
他们之间的关系为:
x = left + translateX;
这里根据它的源码就可以看出:
/**
* The visual y position of this view, in pixels. This is equivalent to the
* {@link #setTranslationY(float) translationY} property plus the current
* {@link #getTop() top} property.
*
* @return The visual y position of this view, in pixels.
*/
@ViewDebug.ExportedProperty(category = "drawing")
public float getY() {
return mTop + getTranslationY();
}
区别的在于:
left属性是在布局时决定的,代表相对于它的父容器的初始位置(layout时的位置),具体可以看源码中mLeft的说明,以及它被调用的地方,都是layout或者setLeft等方法中,还有一个可能会调用的比较多的方法offsetLeftAndRight()。
translateX是相对于left属性来进行的平移,比如left=20,此时调用setTranslationX(30)后,就是相对于left(而不是它上一次的translationX后的位置)往右平移30px,若此时再调用调用setTranslationX(40),之前的30px值就被覆盖,改为相对于left右移40px。
X也是相对于父容器的当前View的位置,就像前面的等式所说,x = left + translationX;所以每一次setTranslationX都会导致getX值的变化,而left的值并不会改变。
总结:left是布局时决定的属性,在translationX的平移中和setX()的平移中left属性并不会发生改变,translationX平移会导致getX()值得改变,反过来一样。
第二部分:
MotionEvent的getX()与getRawX()其实区别就一个:
getX()是相对于自身这个View(被Touch的)的X轴位置,
getRawX()是相对于整个屏幕的X轴位置。
它们与View的上述方法区分性还是很强的,不容易混淆。