为什么Android View类为少数属性提供“outValues风格”获取器?

您可以使用标准getter(如getHeight()getAlpha()getId() …)获取一些视图属性,如heightalphaidmatrixdrawingTimeelevation

但是,你有一些视图的属性(大部分是PointRect返回类型),比如locationInWindowglobalVisibleRectlocationInScreendrawingRectdrawingCache隐藏在getters之下,强制你事先用空构造函数创建返回对象,对象作为getter参数,以便将数据“保存”给它们。

globalVisibleRect的getter globalVisibleRect

 public final boolean getGlobalVisibleRect(Rect r) 

迫使你做这样的事情(Kotlin):

 val rect = Rect() getGlobalVisibleRect(rect) doSomeStuffWithRect(rect) 

这不是真的一致,也不是可以实时调试的Android Studio中的表达式选项卡,它真的很麻烦。

为什么这样做? 如果View不可见,我看到一些返回false布尔值的方法,因此,您知道返回的数据是无效的,但是如果方法已经知道它产生了不可用的信息,那么不应该使用返回空值来解决它。 另一方面, getLocationOnScreen返回void,没有额外的参数,所以我不能真正理解为什么你会这样复杂的东西。

为什么这样做?

鼓励对象的重用,例如通过对象池。 创建一个数十亿个Rect实例并使用GC进行清理效率不高,特别是在2006年代的设备上。 创建和收集数十亿个Rect实例也会碎片堆,虽然Android 5.0的更改有所帮助,但这仍然是Android 8.0之前的设备的问题。