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.