ListViewに線形グラデーションを適用しようとしています。これは私のdrawable xmlの内容です:
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:Android="http://schemas.Android.com/apk/res/Android">
<gradient
Android:startColor="#3A3C39"
Android:endColor="#181818"
Android:angle="270"
/>
<corners Android:radius="0dp" />
</shape>
だから私はリストビューにそれを適用します:
Android:background="@drawable/shape_background_grey"
動作しますが、エミュレータ上および実際のデバイス上でも非常に「バンド化」されています。
この「動作」を減らす方法はありますか?
Romain Guyが提案するように:
listView.getBackground().setDither(true);
私の問題を解決します
これが特にAMOLEDおよび/またはhdpiデバイスに十分でない場合は、これを試してください:
@Override
public void onAttachedToWindow() {
super.onAttachedToWindow();
Window window = getWindow();
window.setFormat(PixelFormat.RGBA_8888);
}
Drawableオブジェクトでディザリングを有効にできます。
これをアクティビティに追加します。
@Override
public void onAttachedToWindow() {
super.onAttachedToWindow();
Window window = getWindow();
window.setFormat(PixelFormat.RGBA_8888);
}
HTC Desireの私にとっては、このように動作します
window.getDecorView().getBackground().setDither(true);
一部の電話でディザーとRGBA_888の設定が役に立たない場合、解決策は要素layerType
をsoftware
に設定して、ハードウェアアクセラレーションを無効にすることです。
Android:layerType="software"
これにより、Samsung S5電話の問題が修正されました。
私にとって、グラデーションにAndroid:useLevel = "true"を設定すると、バンディングは消えました:gradient_dark.xml
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:shape="rectangle">
<gradient Android:startColor="#464646"
Android:endColor="#323232"
Android:angle="270"
Android:type="linear"
Android:useLevel="true"
/>
</shape>
しかし、最初に「ノイズ」ドローアブルを含むLayer-Listを使用してバンディングを削除しようとしましたが、それは役立ちますが、まだバンディングが残っています。
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:Android="http://schemas.Android.com/apk/res/Android" >
<item Android:drawable="@drawable/gradient_dark"/>
<item>
<bitmap
Android:gravity="center"
Android:src="@drawable/noise_repeater"
Android:tileMode="repeat" />
</item>
</layer-list>
私が作成して使用した「noise_repeater」ドロウアブル
私のために働いた唯一のことは、startColorとendColorの両方にわずかに透明なアルファチャンネルを設定することでした。
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:Android="http://schemas.Android.com/apk/res/Android">
<gradient
Android:startColor="#FE3A3C39"
Android:endColor="#FE181818"
Android:angle="270"
/>
</shape>
私はこれを他のSO質問: Android:dither =“ true”はディザリングしません、何が問題ですか?