2012-09-16 4 views
14

나는 안드로이드 응용 프로그램 용 색상 선택 도구를 구현하려고하고 있으며 Android 4.1.1에서 이상한 문제가 발생했습니다.이 enter image description hereAndroid 4.1.1의 ComposeShader 관련 문제

(아래에 빨간색 상자를 무시 : 여기에 문제의

Shader fadeInRight = new LinearGradient(0, 0, pWidth, 0, 0x00000000, 0xFF000000, Shader.TileMode.CLAMP); 
Shader blackToWhite = new LinearGradient(0, 0, 0, pHeight, 0xFF000000, 0xFFFFFFFF, Shader.TileMode.CLAMP); 
Shader whiteMask = new ComposeShader(blackToWhite, fadeInRight, PorterDuff.Mode.DST_IN); 
Shader blackToColor = new LinearGradient(0, 0, pWidth, 0, 0xFF000000, hue, Shader.TileMode.CLAMP); 
Shader shader = new ComposeShader(blackToColor, whiteMask, PorterDuff.Mode.SCREEN); 
paint.setShader(shader); 
... 
canvas.drawRect(new Rect(0, 0, pWidth, pHeight), paint); 

: 2.3.7에 다음 코드는 안드로이드 4.1.1에 예상 그라디언트를 생성하지 않는다, 그러나 안드로이드 4.1.1. 위의 그라디언트에 대해서 이야기했습니다.)

어떤 아이디어가 잘못 되었나요? 내 코드에는 뭔가 빠져있는 것 같지만 어떤 생각이 들지 않습니다.

수정 # 1 : 빛나는 2.3.7에 나는 (팝업 뒤에) 구성 메뉴의 텍스트를 볼 수 있습니다 : 난 그냥 setShader에 대한 whiteMask를 사용하는 경우 , 나 또한 두 시스템 모두에 대해 서로 다른 결과를 얻을 수 그라디언트 사각형을 통해. 또한 왼쪽 위 가장자리에서 오른쪽 아래 가장자리 (검은 색에서 흰색)까지의 그래디언트가 있지만 4.1.1의 그래디언트는 왼쪽에서 오른쪽으로 수평으로 이동합니다. 나는이 문제를 설명하는 더 간단한 예를 발견 : 은 그래서 ComposeShader

편집 # 2에 문제가 될 것으로 보인다

Shader shader1 = new LinearGradient(0, 0, 0, pHeight, hue, 0xffffffff, Shader.TileMode.CLAMP); 
Shader shader2 = new LinearGradient(0, 0, pWidth, 0, 0xff000000, 0xffffffff, Shader.TileMode.CLAMP); 
Shader shader = new ComposeShader(shader1, shader2, PorterDuff.Mode.MULTIPLY); 

그래서를 우리는 불과 수직 선형 그라데이션이 모든 색상을 검정색으로, 검정색에서 흰색까지의 수평 선형 그래디언트. 이 두 레이어를 곱하면 위의 왼쪽 스크린 샷과 같이 올바른 사각형을 얻어야합니다. 하지만 Android 4.1.1에서는 shader2의 그래디언트 만 보았습니다. 나는 또한 Gimp에서 두 개의 레이어를 사용하여이 작업을 시도했으며 결과는 Android 2.3.7에서와 동일합니다.

답변

19

발견 : 하드웨어 가속화와 관련이있는 것 같습니다. 설명 된대로 here 'ComposeShader에는 다른 유형의 쉐이더 만 포함될 수 있습니다 (BitmapShader 및 LinearGradient는 두 개이지만 BitmapShader 인스턴스는 두 개가 아닙니다)'. 그러나 '응용 프로그램이 이러한 누락 된 기능 또는 제한 사항의 영향을받는 경우 setLayerType(View.LAYER_TYPE_SOFTWARE, null)을 호출하여 응용 프로그램의 영향을받는 부분에 대한 하드웨어 가속을 해제 할 수 있습니다.

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { 
    setLayerType(View.LAYER_TYPE_SOFTWARE, null); 
} 

이제 모두의 벌금을 : SDK (11) 내 애플 SDK 7로 시작하는 모든 버전을 지원합니다, 그래서이 방법을 사용할 수 있는지 확인해야하기 때문에이 방법을 사용할 수 있는지 '내가 본

.

+0

하드웨어 가속이 기본적으로 적용됩니까? 귀하가 제공 한 링크에서이 정보를 찾지 못했습니다. – Marek

+0

모르겠다. 그러나 나는 그렇게 생각한다 :-) –

+2

또한 ViewCompat.setLayerType (view, View.LAYER_TYPE_SOFTWARE, null);'method/call in support-v4 라이브러리가있다. – Mavrik

관련 문제