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
업데이트 일뿐입니다. adding getWindow (). setFormat (PixelFormat.RGBA_8888); getWindow (). addFlags (WindowManager.LayoutParams.FLAG_DITHER); 에서 onCreate 방법에 AMOLED 화면 hdpi에 대한 또한 트릭을 수행 보인다 (N1 / 욕망)
프란체스코 Laurita

2
@Francesco큰! 그것은 내에 도움이 갤럭시 S를 함께 안드로이드 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);
}

이것은 안드로이드 1.6 이상에서는 작동하지 않습니다. 내 다른 코멘트를 참조하십시오
프란체스코 Laurita

@Artem 제 경우에는 Android> = 1.6에서 listView.getBackground().setDither(true);작동하지 않으므로 onAttachedToWindow메서드 를 재정의해야했습니다 .
프란체스코 Laurita

3
setDither ()는 현재 지원되지 않습니다
GuillermoMP

39

Drawable 개체에서 디더링을 활성화하기 만하면됩니다.


1
네, 작동합니다! 타이 아주 많이. BTW이 속성을 드로어 블 xml 정의에 사용하려고했지만 설명서를 더 잘 읽었으므로이 속성은 선택기 요소에 대해서만 지원됩니다.
Francesco Laurita

안타깝게도 Android 버전 1.5 이상에서는 작동하지 않습니다. Android 1.6 및 Android 1.5가 설치된 실제 기기에서 테스트했습니다. 드로어 블 그래디언트에 디더를 추가하면 작동하지 않습니다. 장치는 모두 320 x 480 (180ppi)입니다. 어떠한 제안? 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를 사용하여 밴딩을 제거해 보았습니다. 도움이되지만 여전히 밴딩이 있습니다.

<?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 설정이 일부 휴대폰에서 도움이되지 않는 경우 솔루션은 요소 layerTypesoftware로 설정하여 하드웨어 가속을 비활성화하는 것입니다.

android:layerType="software"

이것은 삼성 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.