Android实战技巧: ExpandableListView滑动时会变黑

问题

有一个简单的ExpandableListView用于显示某一天下面的事件列表。为了符合整体的风格,把窗口的背景设成了白色,把ExpandableListView的背景也设置成了白色!一切都很好,但突然发现,当滑动的时候,ExpandableListView会变黑!甚是奇怪。刚开始以为是Focus的问题,调整了不管用。后来,调整了每个GroupItem和ChildItem的背景,把它们的背景都设成白色的,问题是解决了,但想不明白原因是什么。Google了一下才发现原来这是Android里的一个坑,并且有更好的解法。下图中右边是正常情况下的截屏,左边是滑动时的情况.

Android实战技巧: ExpandableListView滑动时会变黑_第1张图片Android实战技巧: ExpandableListView滑动时会变黑_第2张图片

首先是StackOverflow里面有一个帖子讲的关于这个,不过不是ExpandableListView而是ListView,但ExpandableListView是继承自ListView并且在事件手势处理方面并没有做其他动作。里面提到了这篇文章,讲的很透切,把问题的原因说清了,大意是酱紫的:
ListView(其实查看了源码,很多东西都是AbsListView,因为ListView的滑动,手势,事件等都是由AbsListView来做的)本身的背景是透明的,你看到的ListView之所以是黑色的(Android 2.3默认情况下)其实并不是ListView或者其Item的背景,而是窗体的背景,ListView是透明的。因为背景是透明的,所以在渲染时,就必须做混合,把子Item的前台着色和背景与窗体背景进行混合(blending).这样做效果很好,但是效率稍差,所以当滑动时,ListView中的Item都是一闪而过,很快会滑过一大把的Item,所以如果对每个显示出来的Item都做这样的混合的话,性能会有损失.所以为了优化就使用了cache color hint这个东西,它仅是一个RGB着色值,ListView会把它当作滑动时的背景,因为它并不是透明的,所以在滑动的时候就不会做Blending,进而提升的效率.因为默认情况下窗体的背景是#191919,而AbsListView默认的cache color hint也是#191919,所以你看不出来!
而当你设置了窗体背景和ListView的背景时就不一样了,窗体背景着色变了,而默认的cache color hint还是#191919所以,你滑动的时候就会看到ListView是黑色的.
因为ExpandableListView是ListView的子类,所以它也有这个问题.
原文 前半段说到了在边缘时的渐裉色也用到了cache color hint但与这个问题无关.

解法

最简单的解法,就是把ListView的每个Item的背景色也都调成跟窗体背景色一致.这样Item会盖住ListView的cache color hint自然会解决问题.但如果窗体的背景是一个整体的图片的话这样做就会不妥,实现起来也有难度.


其次的解法就是作者建议的把cache color hint设置成透明色#00000000,这样实际上会Disable掉ListView滑动时的优化,因为你把它变成了无色透明的,它必须去做Blending.自然这会造成损失,不过对于现在的Android系统,这并不算是问题(原文是在2009年1月发布的,那个时候的Android性能还很差,各方面也都很差).这非常适用于窗体的背景一个图片时.


如果你的窗体背景是一个着值的话,更好的解法是把ListView的cache color hint设置成与背景色一致的着色,这样滑动的优化仍然有效果.

你可能感兴趣的:(Android实战技巧: ExpandableListView滑动时会变黑)