0

J'ai un ImageView qui montre un Drawable de mon dossier de ressources. Deuxièmement, j'ai une barre de recherche en dessous de l'ImageView. La couleur de chaque pixel doit être modifiée en fonction de la valeur de la barre de recherche. Les couleurs de chaque pixel doivent être changées de la même manière, c'est-à-dire que lorsque la barre de recherche a une valeur maximale, la valeur 'g' et 'b' de chaque pixel doit être 0, de sorte que seul le rouge est affiché. Si vous abaissez la barre de recherche, elle devrait être reconvertie. Je pense que cela est fait en convertissant le drawable en bitmap, en itérant sur le pixel et en changeant leurs valeurs de couleur en fonction de la progression actuelle de la barre de recherche et de leurs valeurs de couleurs actuelles.Modifier couleur dessinable en fonction de SeekBar dans Android

Mais c'est juste une idée. Jusqu'à présent, je n'ai pas été en mesure d'implémenter cela de manière correcte. Peut-être que certains d'entre vous peuvent donner un exemple de code, ou même avoir une bien meilleure solution pour cela. Serait heureux si quelqu'un pouvait aider.

EDIT: Avec l'aide de @pskink (voir commentaire ci-dessous), j'ai pu mettre en œuvre la chose:

float colorValue = 1 - (float) seekBar.getProgress()/100; // SeekBar has 100 as maxVal 

float[] colorMatrix = { 
    1, 0, 0, 0, 0, //red 
    0, colorValue, 0, 0, 0, //green 
    0, 0, colorValue, 0, 0, //blue 
    0, 0, 0, 1, 0 //alpha 
}; 

ColorFilter colorFilter = new ColorMatrixColorFilter(colorMatrix); 
backgroungImageView.setColorFilter(colorFilter); 

Le problème est maintenant (évidemment) que non seulement les parties rouges originales se distinguent. Tout est rouge et ce n'est pas ce que je veux. Le but que j'essaie de réaliser est que seules les parties rouges sont montrées quand la barre de recherche atteint le niveau maximum. Serait cool si cela est également possible avec un ColorMatrix mais je ne suis pas sûr. Aucune suggestion? Pourrait jouer avec l'aide de l'Alpha Channel?

+1

voir 'ColorMatrixColorFilter' – pskink

+0

merci beaucoup! cela semble être la chose dont j'ai besoin – MattLance

+0

J'espère que vous savez comment l'appliquer sur votre 'ImageView'? – pskink

Répondre

0

Si quelqu'un est intéressé, voici comment je résolu le problème avec pskinks aide:

(SeekBar a encore maxValue 100)

float pr = seekBar.getProgress()/(float) 50; 

float[] colorMatrix = { 
     1, 0, 0, 0, 0, //red 
     0, 1, 0, 0, 0, //green 
     0, 0, 1, 0, 0, //blue 
     pr/2, -pr, -pr, 1, 0 //alpha 
}; 

ColorFilter colorFilter = new ColorMatrixColorFilter(colorMatrix); 
backgroungImageView.setColorFilter(colorFilter); 

Il suffit de jouer avec les valeurs pour obtenir d'autres résultats. Jusqu'à présent, ce sont les valeurs avec lesquelles j'ai obtenu les meilleurs résultats.

+0

je confesse c'est un "noir magie "pour moi, mais ces numéros flottants magiques font un très bon travail: http://pastebin.com/Mdzbb7JY – pskink