我试图获取有关文档中方法的更多信息,但我找不到与我的问题相关的任何有用信息。
启用缓存会引入滞后似乎违反直觉 - 缓存的目的毕竟是减少检索延迟。那么这些方法究竟发生了什么呢?
答案 0 :(得分:1)
滚动缓存基本上是一个绘图缓存。
在android中,您可以要求View将其绘图存储在名为绘图缓存的缓存中(基本上是位图)。默认情况下,禁用绘图缓存,因为它会占用内存,但您可以通过setDrawingCacheEnabled或通过硬件层(setLayerType)明确要求View创建一个。
那为什么它有用呢?因为与每帧重绘视图相比,使用绘图缓存可以使动画更流畅。
这种类型的动画也可以是硬件加速的,因为渲染系统可以采用这个位图并将其作为纹理上传到GPU(如果使用硬件层)并对其进行快速矩阵操作(如更改alpha,平移,旋转)。将其与动画进行比较,你是在每一帧上重绘(onDraw被调用)。
对于列表视图,当您通过投掷滚动时,您实际上是为列表的视图设置动画(向上或向下移动它们)。列表视图使用其可见子项的绘图缓存(以及边缘附近的一些可能可见的子项)来非常快速地为它们设置动画。
使用绘图缓存是否有缺点?是的,它消耗内存,这就是默认情况下它在视图中关闭的原因。对于ListView,只要您触摸ListView并稍微移动(以区分点按滚动),就会自动为您创建缓存。换句话说,只要ListView认为您要滚动/滚动它就会创建一个滚动缓存,让您为滚动/拖动动画设置动画。
同样,AnimationCache有时可能是邪恶的(邪恶我的意思是它会增加GC的频率)
定义布局动画是否应为其子项创建绘图缓存。启用动画缓存会占用更多内存,并且需要更长的初始化但提供更好的性能。默认情况下启用动画缓存。
以下是我们对列表视图所做的操作。首先,这是原始列表视图。
<ListView
android:id="@android:id/list"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:divider="@color/list_background_color"
android:dividerHeight="0dp"
android:listSelector="#00000000"
android:smoothScrollbar="true" />
这是改变之后的那个
<ListView
android:id="@android:id/list"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:divider="@color/list_background_color"
android:dividerHeight="0dp"
android:listSelector="#00000000"
android:smoothScrollbar="true"
android:scrollingCache="false"
android:animationCache="false" />
您可以访问此链接
http://queriesofandroid.blogspot.in/2015/03/in-listview-why-does-disabling.html