2013-06-21 3 views
1

Dans mon application, j'utilise mon widget sélecteur de couleurs personnalisé. Dans onDraw méthode mixer deux Shaders en utilisant le code suivant:Composer deux shaders (sélecteur de couleur)

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

Cependant, le résultat que je reçois est pas ce que je voudrais faire. Ci-dessous vous pouvez voir comment le Shaders mentionné ci-dessus ressemble:
enter image description here + enter image description here = enter image description here

Comme vous pouvez le voir ne fonctionne pas totalement ...
Voici comment résultat devrait ressembler à (plus ou moins):
enter image description here

EDIT (solution possible):

pour le faire fonctionner, je dois utiliser le code suivant :

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

Cependant, je ne comprends pas vraiment comment cette ligne de code affecte ma demande. Je veux dire que IU comprend qu'il règle le HARDWARE ACCELERATION, y a-t-il des conséquences à cela pour mon application? Devrais-je le rallumer après avoir dessiné le Shader? Quelqu'un pourrait-il expliquer?

Répondre

2

Ceci a à voir avec Android 4+ ayant l'accélération matérielle (HA) activée par défaut. Avant la version 4.0, vous pouviez activer HA dans votre AndroidManifest.xml.

L'accélération matérielle effectue toutes les opérations de dessin qui sont effectuées sur le canevas d'une vue à l'aide du GPU, ce qui est bien car il est supposé être plus rapide. Mais quand HA est activé, certaines méthodes de dessin ne sont simplement pas supportées. Donc, pour utiliser l'accélération, vous pouvez utiliser seulement un sous-ensemble des méthodes de dessin.

Dans votre cas, le problème est, comme dit la documentation (voir Unsupported Drawing Operations), que

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



désactivation de l'accélération matérielle.

Vous pouvez désactiver HA pour votre application entière dans votre AndroidManifest.xml

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

ou par activité

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

ou par vue que vous faites maintenant.

S'il vous plaît garder à l'esprit que il y a un bug dans Android qui a été fixé à 4.1 (voir here) et en conséquence votre setLayerType(View.LAYER_TYPE_SOFTWARE, null) appel sera ignoré dans certaines versions Android (4.0.2 par exemple).

Si vous désactivez HA pour une vue, vous n'avez pas besoin de l'activer à nouveau, car HA affecte uniquement le dessin de votre vue.

Questions connexes