Android:背景が縞模様に見えるように線形グラデーションを使用する


85

ListViewに線形グラデーションを適用しようとしています。これは私のドローアブル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>

だから私はそれを私のListViewに適用します:

android:background="@drawable/shape_background_grey"

動作しますが、エミュレーターや実際のデバイスでも非常に「バンド」に見えます。

この「振る舞い」を減らす方法はありますか?


18
単なる更新:getWindow()。setFormat(PixelFormat.RGBA_8888);を追加します。getWindow()。addFlags(WindowManager.LayoutParams.FLAG_DITHER); onCreateメソッドでは、Amoled Screen(N1 / Desire)を使用したhdpiでもトリックが実行されるようです
Francesco Laurita 2010年

2
@Francescoすごい!それはAndroid2.2搭載した私のGalaxySに役立ちました。有用なコメントを回答に変換して、他の人が投票できるようにしてください。
java.is.for.desktop 2011年

回答:


84

Romain Guyが示唆するように:

listView.getBackground().setDither(true);

私の問題を解決します

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

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

これはAndroid1.6以降では機能しません。私の他のコメントを参照してください
Francesco Laurita 2010年

8
これをxmlで実行できますか?
Thomas Ahle 2010

@Artem私の場合、Android> = 1.6では機能しlistView.getBackground().setDither(true);ないため、onAttachedToWindowメソッドをオーバーライドする必要がありました。
Francesco Laurita 2011年

3
setDither()は非推奨になりました
GuillermoMP

39

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


1
はい、動作します!とてもタイ。ところで、このプロパティをドローアブルxml定義に使用しようとしましたが、ドキュメントをよく読んでいるため、このプロパティはselector要素でのみサポートされています。
Francesco Laurita 2010年

残念ながら、これはAndroidバージョン> 1.5では機能しません。Android1.6とAndroid1.5を搭載した実際のデバイスでテストしました。ドローアブルグラデーションにディザを追加しても機能しません。デバイスは両方とも320x 480(180 ppi)です。なにか提案を?Tnx
Francesco Laurita 2010年

3
setDither()APIレベル23で非推奨になりました。このプロパティは現在無視されています。
Tot Zam

9

これをあなたの活動に入れてください:

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

3

私にとってHTCDesireはこのように機能します

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

1
setDither()APIレベル23で非推奨になりました。このプロパティは現在無視されています。
Tot Zam

2

私の場合、グラデーションに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>

しかし、最初に「ノイズ」ドローアブルを備えたレイヤーリストを使用してバンディングを削除しようとしました。それは役に立ちますが、まだいくつかのバンディングがあります。

<?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」ドローアブル

ここに画像の説明を入力してください


2

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

android:layerType="software"

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


0

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.