2013-06-21 3 views
1

내 응용 프로그램에서 내 사용자 지정 색 선택기 위젯을 사용하고 있습니다. onDraw 방법은 다음 코드를 사용하여 두 Shaders를 혼합 :두 셰이더 (색 선택기)를 작성하십시오

ComposeShader mShader = new ComposeShader(mValShader, mSatShader, PorterDuff.Mode.MULTIPLY); 

그러나, 나는이 얻을 결과는 내가 좀하고 싶습니다 것이 아니다. 위에서 언급 한 Shaders의 모습을 어떻게 아래 볼 수 있습니다 :
enter image description here + enter image description here = enter image description here

당신이 볼 수 있듯이 그것은 전혀하지 않습니다 작품 ...
이 결과는 (다소처럼 보이는 방법이다) :
enter image description here

EDIT (가능한 해결 방법) :

만들려면 내가 다음 코드를 사용해야 할 일 :

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

그러나 난 정말이 코드 줄 내 응용 프로그램에 미치는 영향을 이해하지 않습니다. 내 말은 내가 HARDWARE ACCELERATION을 설정한다는 것을 이해하고 있다는 뜻입니다. 제 신청서에 대한 결과가 있습니까? Shader을 그리면 다시 켜야합니까? 아무도 설명 할 수 있을까요?

답변

2

이것은 하드웨어 가속 (HA)을 기본적으로 사용하는 Android 4+와 관련이 있습니다. 4.0 이전에는 AndroidManifest.xml에서 HA를 옵션으로 활성화 할 수있었습니다.

하드웨어 가속은 GPU를 사용하여 View의 캔버스에서 수행되는 모든 그리기 작업을 수행합니다. GPU를 사용하면 속도가 빨라지기 때문에 좋습니다. 하지만 HA를 사용하도록 설정하면 일부 그리기 방법이 지원되지 않습니다. 따라서 가속을 사용하려면 드로잉 메서드의 하위 집합 만 사용할 수 있습니다.

귀하의 경우 문서가 말한대로 문제가, ( Unsupported Drawing Operations 참조)에서

, 하드웨어 가속을 사용하지

ComposeShader can only contain shaders of different types (a BitmapShader and a 
LinearGradient for instance, but not two instances of BitmapShader) 



그. 당신이 지금하고있는대로

당신은 당신의 AndroidManifest.xml

<application android:hardwareAccelerated="false" ...> 

또는 활동

<application android:hardwareAccelerated="true"> 
<activity ... /> 
<activity android:hardwareAccelerated="false" /> 
</application> 

당 또는 뷰 당 전체 응용 프로그램에 대한 HA를 사용하지 않도록 설정할 수 있습니다.

4.1에서 수정되었습니다 (here 참조) 그 결과로 setLayerType(View.LAYER_TYPE_SOFTWARE, null) 호출이 일부 안드로이드 버전 (예 : 4.0.2)에서 무시됩니다 안드로이드의 버그이 있음을 유의하시기 바랍니다.

보기에 대해 HA를 사용하지 않도록 설정하면 HA가보기의 그림에만 영향을주기 때문에 다시 설정할 필요가 없습니다.

관련 문제