Android: Sử dụng gradient tuyến tính làm nền trông như dải


85

Tôi đang cố gắng áp dụng một gradient tuyến tính cho ListView của mình. Đây là nội dung của xml có thể vẽ của tô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>

Vì vậy, tôi áp dụng nó vào ListView của mình với:

android:background="@drawable/shape_background_grey"

Nó hoạt động nhưng nó trông rất "dải" trên trình giả lập và trên thiết bị thực.

Có cách nào để giảm bớt "hành vi" này không?


18
Chỉ là bản cập nhật: thêm getWindow (). SetFormat (PixelFormat.RGBA_8888); getWindow (). addFlags (WindowManager.LayoutParams.FLAG_DITHER); trong phương thức onCreate dường như làm các trick cũng cho hdpi với màn hình AMOLED (N1 / Desire)
Francesco Laurita

2
@FrancescoTuyệt quá! Nó đã giúp trên Galaxy S của tôi với Android 2.2 . Vui lòng chuyển đổi bình luận hữu ích của bạn thành một câu trả lời, để mọi người có thể bình chọn cho nó.
java.is.for.desktop

Câu trả lời:


84

Như Romain Guy gợi ý:

listView.getBackground().setDither(true);

giải quyết vấn đề của tôi

Nếu điều này là không đủ, đặc biệt đối với các thiết bị AMOLED và / hoặc hdpi, hãy thử cách này:

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

Điều này không hoạt động trên Android 1.6 trở lên. Xem bình luận khác của tôi
Francesco Laurita

8
Bạn có thể làm điều này trong xml?
Thomas Ahle

@Artem Trong trường hợp của tôi, trên Android> = 1.6 listView.getBackground().setDither(true);sẽ không hoạt động, tôi phải ghi đè onAttachedToWindowphương thức.
Francesco Laurita

3
setDither () bây giờ bị phản đối
GuillermoMP

39

Bạn chỉ có thể bật phối màu trên đối tượng Drawable của mình.


1
Có nó hoạt động! Ty rất nhiều. BTW Tôi đã cố gắng sử dụng thuộc tính này vào định nghĩa xml có thể vẽ nhưng khi tôi đọc kỹ hơn vào tài liệu, thuộc tính này chỉ được hỗ trợ cho phần tử bộ chọn.
Francesco Laurita

Tuy nhiên, điều này không hoạt động trên phiên bản Android> 1.5. Tôi đã thử nghiệm trên thiết bị thực với Android 1.6 và Android 1.5. Thêm hòa sắc vào gradient có thể vẽ của tôi không hoạt động. Cả hai thiết bị đều có kích thước 320 x 480 (180 ppi). Bất kì lời đề nghị nào? Tnx
Francesco Laurita,

3
setDither()không được dùng nữa trong API cấp 23. Thuộc tính này hiện bị bỏ qua.
Tot Zam

9

Đưa cái này vào Hoạt động của bạn:

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

3

Đối với tôi trên HTC Desire hoạt động như thế này

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

1
setDither()không được dùng nữa trong API cấp 23. Thuộc tính này hiện bị bỏ qua.
Tot Zam

2

Đối với tôi, dải biến mất khi tôi đặt android: useLevel = "true" trên gradient: 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>

Nhưng trước tiên, tôi đã thử sử dụng Layer-List có thể vẽ "nhiễu" để loại bỏ dải, nó hữu ích nhưng vẫn còn một số dải.

<?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" có thể vẽ mà tôi đã tạo và sử dụng

nhập mô tả hình ảnh ở đây


2

Nếu cài đặt hòa sắc và RGBA_888 không hữu ích trên một số điện thoại, giải pháp có thể là đặt phần tử layerTypethành software, để tắt tăng tốc phần cứng

android:layerType="software"

Điều này đã khắc phục sự cố của tôi trên điện thoại Samsung S5.


0

Điều duy nhất phù hợp với tôi là thiết lập một kênh alpha hơi trong suốt trên cả startColor và 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>

Tôi có ý tưởng thử điều này từ câu hỏi SO khác này: android: dither = “true” không hòa sắc, có chuyện gì vậy?

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.