web-dev-qa-db-ja.com

Android:背景として縞模様の線形グラデーションを使用する

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"

動作しますが、エミュレータ上および実際のデバイス上でも非常に「バンド化」されています。

この「動作」を減らす方法はありますか?

81

Romain Guyが提案するように:

listView.getBackground().setDither(true);

私の問題を解決します

これが特にAMOLEDおよび/またはhdpiデバイスに十分でない場合は、これを試してください:

@Override
public void onAttachedToWindow() {
    super.onAttachedToWindow();
    Window window = getWindow();
    window.setFormat(PixelFormat.RGBA_8888);
}
81

Drawableオブジェクトでディザリングを有効にできます。

38
Romain Guy

これをアクティビティに追加します。

@Override
public void onAttachedToWindow() {
    super.onAttachedToWindow();
    Window window = getWindow();
    window.setFormat(PixelFormat.RGBA_8888);
}
8
Miša Peić

HTC Desireの私にとっては、このように動作します

window.getDecorView().getBackground().setDither(true);
3
Sebastian

一部の電話でディザーとRGBA_888の設定が役に立たない場合、解決策は要素layerTypesoftwareに設定して、ハードウェアアクセラレーションを無効にすることです。

Android:layerType="software"

これにより、Samsung S5電話の問題が修正されました。

2
peter.bartos

私にとって、グラデーションに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」ドロウアブル

enter image description here

2
TouchBoarder

私のために働いた唯一のことは、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”はディザリングしません、何が問題ですか?

0
Greg