Android ListViewのスライドバックグラウンドが黒の解決策
8053 ワード
別の場所で見たのは、回って記録として!!
AndroidではListViewが最もよく使われるコントロールで、UIのデザインをするとき、多くの人が背景を変えて、全体のUIのデザインに合うようにしたいと思っています.背景を変えるのは簡単です.画像を1枚用意して属性android:background=「@drawable/bg」を指定する必要がありますが、あまり早く喜ばないでください.そうすると、背景が変わっていることに気づきます.しかし、ドラッグしたりリストの空白の位置をクリックしたりすると、ListItemが黒くなり、次の図のように全体的な効果が破壊されます.
これはなぜですか.
これはListviewの効果から言えば、デフォルトのListItem背景は透明であり、ListViewの背景は一定であるため、スクロールバーのスクロール中に現在の各Itemの表示内容と背景をリアルタイムで混合演算する場合、androidシステムはこのプロセスを最適化するためにandroid:cacheColorHintという属性を使用している.黒のテーマの下でデフォルトの色の値は#191919なので、さっきの画面が現れて、半分は黒です.
どうすればいいの?
背景の色を変えるだけなら、android:cacheColorHintを直接指定して欲しい色にすることができます.画像を背景にするなら、android:cacheColorHintを透明(#00000000)に指定すればいいのです.もちろん美化のために効率的です.最後に上記のあなたが望んでいない結果が現れません!ListView行間の分割線のカスタマイズ
Androidプラットフォームでは、システムコントロールに柔軟なカスタマイズオプションが用意されており、ListViewまたはAbsListViewに基づいて実現されるwidgetコントロールは、行間隔の分割線を以下の方法で設定することができ、分割線は色、または画像をカスタマイズすることができます.ListViewでは、属性android:divider=「#FF 0000」を使用して区切り記号を赤に定義します.もちろん、ここで値はdrawableピクチャオブジェクトを指すことができます.画像を使用すると、システムのデフォルトの画素よりも高い可能性がある場合は、6画素android:dividerHeight=「6 px」などの高さを自分で設定することができます.Android開発サイトのヒントはもちろんJavaでListViewにも設定できる方法があります.
1)Itemをクリックしたときの背景色の変化なしxmlファイルのListViewコントロールには、android:listSelector="@drawable/timer_list_selector"drawableでtimer_を定義する属性が追加されています.list_selectorのプロパティ値timer_list_selector.xmlではvaluesフォルダの下にあるcolor.xmlで定義transparentは以下の通りである:#50000002)Item間の隙間を設けるxmlファイルのListViewコントロールには、android:divider=「#00000000」またはjavaCodeで以下のように定義する:listView.setDividerHeight(0);3)カスタムBaseAdapterでnotifyDataSetChanged()メソッドを呼び出すと、BaseAdapterのgetView()メソッドが再呼び出されます.
心を込めた友人は、listviewで背景が設定されていることに気づくはずです.いくつか問題があります.
1.listviewドラッグすると背景画像が消えて黒い背景になります.自分の背景画像をドラッグしてから表示されます.
2、listviewの上と下に黒い影があります.
3、lsitviewの各項目の間に1つの画像を間隔として設定する必要があります.
以上の問題に対してlistviewのxmlファイルに文を設定します.
問題1 android:scrollingCache=「false」を解決するコード接合があります.
問題2は、android:fadingEdge=「none」問題3は、android:divider=「@drawable/list_driver」の@drawable/list_driverは画像リソースです
全体的に次のようになります.
android:id="@+id/myListView01"android:layout_width="fill_parent"android:layout_height="287dip"android:fadingEdge="none" android:divider="@drawable/list_driver"android:scrollingCache="false"android:background="@drawable/list">
Why is my list black? An Android optimization
Posted by Romain Guy on 13 January 2009 at 11:20 AM
ListView is one of Android's most widely used widgets. It is rather easy to use, very flexible and incredibly powerful.
One of the most common issues with
The fade effect is implemented using a combination of Canvas.saveLayerAlpha() and the Porter-Duff Destination Out blending mode. This technique is similar to the one explained in Filthy Rich Clients and various presentations. Unfortunately, things start to get ugly when you try to use a custom background on the
This rendering issue is caused by an optimization of the Android framework enabled by default on all instances of
Since
As I said before,
To fix this issue, all you have to do is either disable the cache color hint optimization, if you use a non-solid color background, or set the hint to the appropriate solid color value. This can be dome from code or preferably from XML, by using the
As you can see, the fade works perfectly against the custom wooden background. I find the cache color hint feature interesting because it shows how optimizations can make developers' life more difficult in some situations. In this particular case, however, the benefit of the default behavior outweighs the added complexity for the developer.
AndroidではListViewが最もよく使われるコントロールで、UIのデザインをするとき、多くの人が背景を変えて、全体のUIのデザインに合うようにしたいと思っています.背景を変えるのは簡単です.画像を1枚用意して属性android:background=「@drawable/bg」を指定する必要がありますが、あまり早く喜ばないでください.そうすると、背景が変わっていることに気づきます.しかし、ドラッグしたりリストの空白の位置をクリックしたりすると、ListItemが黒くなり、次の図のように全体的な効果が破壊されます.
これはなぜですか.
これはListviewの効果から言えば、デフォルトのListItem背景は透明であり、ListViewの背景は一定であるため、スクロールバーのスクロール中に現在の各Itemの表示内容と背景をリアルタイムで混合演算する場合、androidシステムはこのプロセスを最適化するためにandroid:cacheColorHintという属性を使用している.黒のテーマの下でデフォルトの色の値は#191919なので、さっきの画面が現れて、半分は黒です.
どうすればいいの?
背景の色を変えるだけなら、android:cacheColorHintを直接指定して欲しい色にすることができます.画像を背景にするなら、android:cacheColorHintを透明(#00000000)に指定すればいいのです.もちろん美化のために効率的です.最後に上記のあなたが望んでいない結果が現れません!ListView行間の分割線のカスタマイズ
Androidプラットフォームでは、システムコントロールに柔軟なカスタマイズオプションが用意されており、ListViewまたはAbsListViewに基づいて実現されるwidgetコントロールは、行間隔の分割線を以下の方法で設定することができ、分割線は色、または画像をカスタマイズすることができます.ListViewでは、属性android:divider=「#FF 0000」を使用して区切り記号を赤に定義します.もちろん、ここで値はdrawableピクチャオブジェクトを指すことができます.画像を使用すると、システムのデフォルトの画素よりも高い可能性がある場合は、6画素android:dividerHeight=「6 px」などの高さを自分で設定することができます.Android開発サイトのヒントはもちろんJavaでListViewにも設定できる方法があります.
1)Itemをクリックしたときの背景色の変化なしxmlファイルのListViewコントロールには、android:listSelector="@drawable/timer_list_selector"drawableでtimer_を定義する属性が追加されています.list_selectorのプロパティ値timer_list_selector.xmlではvaluesフォルダの下にあるcolor.xmlで定義transparentは以下の通りである:#50000002)Item間の隙間を設けるxmlファイルのListViewコントロールには、android:divider=「#00000000」またはjavaCodeで以下のように定義する:listView.setDividerHeight(0);3)カスタムBaseAdapterでnotifyDataSetChanged()メソッドを呼び出すと、BaseAdapterのgetView()メソッドが再呼び出されます.
心を込めた友人は、listviewで背景が設定されていることに気づくはずです.いくつか問題があります.
1.listviewドラッグすると背景画像が消えて黒い背景になります.自分の背景画像をドラッグしてから表示されます.
2、listviewの上と下に黒い影があります.
3、lsitviewの各項目の間に1つの画像を間隔として設定する必要があります.
以上の問題に対してlistviewのxmlファイルに文を設定します.
問題1 android:scrollingCache=「false」を解決するコード接合があります.
問題2は、android:fadingEdge=「none」問題3は、android:divider=「@drawable/list_driver」の@drawable/list_driverは画像リソースです
全体的に次のようになります.
android:id="@+id/myListView01"android:layout_width="fill_parent"android:layout_height="287dip"android:fadingEdge="none" android:divider="@drawable/list_driver"android:scrollingCache="false"android:background="@drawable/list">
Why is my list black? An Android optimization
Posted by Romain Guy on 13 January 2009 at 11:20 AM
ListView is one of Android's most widely used widgets. It is rather easy to use, very flexible and incredibly powerful.
ListView
can also be difficult to understand at times. One of the most common issues with
ListView
happens when you try to use a custom background. By default, like many Android widgets, ListView
has a transparent background which means yo can see through the default window's background, a very dark gray ( #FF191919
with the current dark theme.) Additionally, ListView
enables the fading edges by default, as you can see at the top of the following screenshot; the first text item gradually fades to black. This technique is used throughout the system to indicate that the container can be scrolled. The fade effect is implemented using a combination of Canvas.saveLayerAlpha() and the Porter-Duff Destination Out blending mode. This technique is similar to the one explained in Filthy Rich Clients and various presentations. Unfortunately, things start to get ugly when you try to use a custom background on the
ListView
or when you change the window's background. The following two screenshots show what happens in an application when you change the window's background. The left image shows what the list looks like by default and the right image shows what the list looks like during a scroll initiated with a touch gesture: This rendering issue is caused by an optimization of the Android framework enabled by default on all instances of
ListView
(for some reason, I forgot to enable it by default on GridView
.) I mentioned earlier that the fade effect is implemented using a Porter-Duff blending mode. This implementation works really well but is unfortunately very costly and can bring down drawing performance by quite a bit as it requires to capture a portion of the rendering in an offscreen bitmap and then requires extra blending (which implies readbacks from memory.) Since
ListView
is most of the time displayed on a solid background, there is no reason to go down that expensive route. That's why we introduced an optimization called the "cache color hint."The cache color hint is an RGB color set by default to the window's background color, that is #191919 in Android's dark theme. When this hint is set, ListView
(actually, its base class View
) knows it will draw on a solid background and therefore replaces th expensive saveLayerAlpha()/Porter-Duff
rendering with a simple gradient. This gradient goes from fully transparent to the cache color hint value and this is exactly what you see on the image above, with the dark gradient at the bottom of the list. However, this still does not explain why the entire list turns black during a scroll. As I said before,
ListView
has a transparent/translucent background by default, and so all default Android widgets. This implies that when ListView
redraws its children, it has to blend the children with the window's background. Once again, this requires costly readbacks from memory that are particularly painful during a scroll or a fling when drawing happens dozen of times per second. To improve drawing performance during scrolling operations, the Android framework reuses the cache color hint. When this hint is set, the framework copies each child of the list in a Bitmap
filled with the hint value (this assumes that another optimization, called scrolling cache, is not turned off.) ListView
then blits these bitmaps directly on screen and because these bitmaps are known to be opaque, no blending is required. And since the default cache color hint is #191919
, you get a dark background behind each item during a scroll. To fix this issue, all you have to do is either disable the cache color hint optimization, if you use a non-solid color background, or set the hint to the appropriate solid color value. This can be dome from code or preferably from XML, by using the
android:cacheColorHint
attribute. To disable the optimization, simply use the transparent color #00000000
. The following screenshot shows a list with android:cacheColorHint="#00000000"
set in the XML layout file: As you can see, the fade works perfectly against the custom wooden background. I find the cache color hint feature interesting because it shows how optimizations can make developers' life more difficult in some situations. In this particular case, however, the benefit of the default behavior outweighs the added complexity for the developer.