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 ดูเหมือนว่าเคล็ดลับสำหรับ hdpi ด้วยหน้าจอ amoled (N1 / Desire)
Francesco Laurita

2
@Francescoเยี่ยมมาก! มันช่วยให้ฉันGalaxy SกับAndroid 2.2 โปรดแปลงความคิดเห็นที่เป็นประโยชน์ของคุณเป็นคำตอบเพื่อให้ทุกคนสามารถโหวตได้
java.is.for.desktop

คำตอบ:


84

ตามที่ Romain Guy แนะนำ:

listView.getBackground().setDither(true);

แก้ปัญหาของฉัน

หากสิ่งนี้ไม่เพียงพอโดยเฉพาะสำหรับอุปกรณ์ AMOLED และ / หรือ hdpi ให้ลองทำดังนี้:

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

สิ่งนี้ใช้ไม่ได้กับ Android 1.6 ขึ้นไป ดูความคิดเห็นอื่น ๆ ของฉัน
Francesco Laurita

@Artem ในกรณีของฉันบน Android> = 1.6 listView.getBackground().setDither(true);เคยชินฉันต้องแทนที่onAttachedToWindowเมธอด
Francesco Laurita

3
setDither () เลิกใช้งานแล้ว
GuillermoMP

39

คุณสามารถเปิดใช้งาน dithering บนวัตถุ Drawable ของคุณได้


1
ใช่มันได้ผล! Ty มาก. BTW ฉันพยายามใช้คุณสมบัตินี้ในนิยาม xml ที่วาดได้ แต่เมื่อฉันอ่านเอกสารได้ดีขึ้นคุณสมบัตินี้ได้รับการสนับสนุนสำหรับองค์ประกอบตัวเลือกเท่านั้น
Francesco Laurita

น่าเสียดายที่สิ่งนี้ใช้ไม่ได้กับ Android เวอร์ชัน> 1.5 ฉันทดสอบบนอุปกรณ์จริงด้วย Android 1.6 และ Android 1.5 การเพิ่มสองอย่างในการไล่ระดับสีที่วาดได้ของฉันไม่ทำงาน อุปกรณ์มีทั้ง 320 x 480 (180 ppi) ข้อเสนอแนะใด ๆ ? Tnx
Francesco Laurita

3
setDither()เลิกใช้แล้วใน API ระดับ 23 ขณะนี้คุณสมบัตินี้ถูกละเว้น
Tot Zam

9

ใส่สิ่งนี้ในกิจกรรมของคุณ:

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

3

สำหรับฉันบน HTC Desire ใช้งานได้เช่นนี้

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>

แต่ก่อนอื่นฉันลองใช้ Layer-List ที่มี "noise" drawable เพื่อลบแถบมันช่วยได้ แต่ก็ยังมีแถบอยู่บ้าง

<?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" drawable ที่ฉันสร้างและใช้

ใส่คำอธิบายภาพที่นี่


2

หากสองจิตสองใจและตั้งค่า RGBA_888 ไม่ได้ช่วยในโทรศัพท์บาง, การแก้ปัญหาสามารถที่จะกำหนดองค์ประกอบlayerTypeการsoftwareเพื่อปิดการเร่งฮาร์ดแวร์

android:layerType="software"

สิ่งนี้ช่วยแก้ปัญหาของฉันในโทรศัพท์ Samsung S5


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.