Android: Arka plan şeritli göründüğünde doğrusal renk geçişi kullanma


85

ListView'uma doğrusal bir gradyan uygulamaya çalışıyorum. Bu benim çekilebilir xml'imin içeriği:

 <?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>

Bu yüzden onu ListView'uma şu şekilde uygularım:

android:background="@drawable/shape_background_grey"

Çalışıyor ama emülatörde ve gerçek bir cihazda çok "bantlı" görünüyor.

Bu "davranışı" azaltmanın bir yolu var mı?


18
Sadece bir güncelleme: getWindow (). SetFormat (PixelFormat.RGBA_8888) ekleme; getWindow (). addFlags (WindowManager.LayoutParams.FLAG_DITHER); onCreate yöntemde AMOLED ekranı ile hdpi için de hile yok görünüyor (N1 / Desire)
— Francesco Laurita

2
@FrancescoHarika! Android 2.2 ile Galaxy S cihazıma yardımcı oldu . Lütfen yararlı yorumunuzu bir cevaba dönüştürün, böylece insanlar ona oy verebilir.
— java.is.for.desktop

Yanıtlar:


84

Romain Guy'ın önerdiği gibi:

listView.getBackground().setDither(true);

sorunumu çözer

Bu özellikle AMOLED ve / veya hdpi cihazları için yeterli değilse şunu deneyin:

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

Bu, android 1.6 ve üzeri sürümlerde çalışmaz. Diğer
— yorumuma

@Artem Benim durumumda, Android> = 1.6 listView.getBackground().setDither(true);çalışmayacak, onAttachedToWindowyöntemi geçersiz kılmam gerekti .
— Francesco Laurita

3
setDither () artık kullanımdan kaldırıldı
— GuillermoMP

39

Drawable nesnenizde renk taklidini etkinleştirebilirsiniz.


1
Evet çalışıyor! Çok teşekkürler. BTW Bu özelliği çekilebilir xml tanımında kullanmayı denedim, ancak dokümantasyonu daha iyi okuduğum için, bu özellik yalnızca seçici öğe için destekleniyor.
— Francesco Laurita

Ne yazık ki bu, Android sürüm> 1.5'te çalışmıyor. Android 1.6 ve Android 1.5 ile gerçek cihazda test ettim. Çekilebilir gradyanıma renk taklidi eklemek işe yaramıyor. Cihazların her ikisi de 320 x 480 (180 ppi). Herhangi bir öneri? Tnx
— Francesco Laurita

3
setDither()API düzeyi 23'te kullanımdan kaldırıldı. Bu özellik artık göz ardı edildi.
— Tot Zam

9

Bunu Faaliyetinize ekleyin:

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

3

HTC Desire'da benim için böyle çalışıyor

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

1
setDither()API düzeyi 23'te kullanımdan kaldırıldı. Bu özellik artık göz ardı edildi.
— Tot Zam

2

Benim için, gradient: gradient_dark.xml: android: useLevel = "true" ayarladığımda şerit kayboldu

<?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>

Ama önce şeritlenmeyi gidermek için "gürültü" çekilebilir bir Katman Listesi kullanmayı denedim, yardımcı oluyor ama yine de biraz şeritlenme var.

<?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>

Oluşturduğum ve kullandığım "noise_repeater" çekmecesi

görüntü açıklamasını buraya girin


2

Titreme ve RGBA_888 ayarı bazı telefonlarda yardımcı olmazsa, çözüm , donanım hızlandırmayı devre dışı bırakmak için öğeyi layerTypeolarak ayarlamak olabilir.software

android:layerType="software"

Bu, Samsung S5 telefonundaki sorunumu çözdü.


0

Benim için işe yarayan tek şey, hem startColor hem de endColor'da biraz şeffaf bir alfa kanalı ayarlamaktı.

<?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>

Bunu diğer SO sorusundan denemek için bir fikrim var: android: dither = "true" titretmiyor, sorun ne?

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.