Introduction à cette section :
Je me demande si ces deux choses du titre vous sont familières. Si vous avez déjà implémenté vous-même des coins arrondis ou des images circulaires, je pense que ces deux termes ne vous sont pas inconnus. Vous ne vous en souvenez pas sur le moment ? Pas grave, avez-vous déjà vu l'image ci-dessous ?
PS : Les gens en ligne disent tous que cette image peut être trouvée sous : \samples\android-XX\legacy\ApiDemos\src\com\example\android\apis\graphics, mais elle n'y est en fait pas. Je ne sais pas si c'est parce que mon exemple est android-22 ; je n'ai trouvé qu'unXfermodes.javaFichier Java ici ! Je vais directement coller celui que j'ai trouvé en ligne~
Bon, revenons à nos moutons. Je crois que la plupart des amis ont vu cette image. Sinon, ce n'est pas grave ; dans cette section, nous allons apprendre cette chose pas à pas avec tout le monde~, en revenant à notre précédentTutoriel de base Android - 8.3.1 Explication détaillée de trois classes d'outils de dessin
setXfermode(Xfermode xfermode) : Définit la méthode de traitement lorsque les formes se chevauchent, comme la fusion, l'intersection ou l'union, souvent utilisée pour créer un effet de gomme !
Allons voir la documentation officielle :Xfermode, nous découvrons qu'il a trois fils :
Dans cette section, découvrons ses deux premiers fils~
Fils aîné : AvoidXfermode
Eh bien, comme les deux sous-classes de MaskFilter que nous avons vues précédemment, il ne prend pas en charge l'accélération matérielle. Donc, si c'est l'API 14 ou supérieure, vous devez désactiver l'accélération matérielle pour qu'il prenne effet ! Comment la désactiver ? Consultez la section précédente vous-même~
Regardons le constructeur qu'il fournit ! Documentation officielle de l'API :AvoidXfermode
Il y a trois paramètres, dans l'ordre :
opColor: Une valeur de couleur hexadécimale avec alpha, telle que 0x00C4C4 ;
tolerance: Valeur de tolérance. Si vous avez étudié Photoshop, vous avez peut-être utilisé l'outil Baguette magique ; il définit la plage de sélection des valeurs de couleur. Par exemple, avec une tolérance de 0, vous sélectionnez un petit point de noir pur ; lorsque la tolérance est réglée à 40, la plage s'étend à un grand bloc de noir ! Si vous ne comprenez toujours pas bien, plus tard lorsque nous écrirons du code, vous comprendrez !
mode: mode AvoidXfermode, il y a deux types :TARGETetAVOID
Mode 1 : AvoidXfermode.Mode.TARGET
Ce mode déterminera s'il y a des couleurs sur le canevas qui sont différentes de la valeur de couleur que nous avons définie. Si c'est le cas, il teindra ces zones avec une couche de la couleur définie par Paint ; les autres zones restent non teintées ! Ci-dessous, nous écrivons du code pour le démontrer, et aussi permettre à chacun de ressentir la valeur de tolérance !
Exemple d'utilisation du code:
Capture d'écran du résultat:
Eh bien, voici d'abord l'image originale. Matériel provenant degank.io:

Ensuite, utilisons un sélecteur de couleur pour choisir une couleur à un endroit sur le mur, puis écrivons une simple View !
PS : Vous devez ajouter le paramètre de désactivation de l'accélération matérielle dans le nœud application de AndroidManifest.xml :android:hardwareAccelerated="false"
/**
* Created by Jay on 2015/10/22 0022.
*/
public class AvoidXfermodeView1 extends View {
private Paint mPaint;
private Bitmap mBitmap;
private AvoidXfermode avoidXfermode;
public AvoidXfermodeView1(Context context) {
super(context);
init();
}
public AvoidXfermodeView1(Context context, AttributeSet attrs) {
super(context, attrs);
init();
}
public AvoidXfermodeView1(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
init();
}
private void init() {
mPaint = new Paint(Paint.ANTI_ALIAS_FLAG); //抗锯齿
avoidXfermode = new AvoidXfermode(0XFFCCD1D4, 0, AvoidXfermode.Mode.TARGET);
mBitmap = BitmapFactory.decodeResource(getResources(), R.mipmap.iv_meizi);
}
@Override
protected void onDraw(Canvas canvas) {
canvas.drawBitmap(mBitmap, 50, 50, mPaint);
mPaint.setARGB(255, 222, 83, 71);
mPaint.setXfermode(avoidXfermode);
canvas.drawRect(50, 50, 690, 1010, mPaint);
}
}
Effet après exécution:

Vous voyez ce tas de rouge menstruel sur le mur ? L'effet est incroyable. Ici, notre valeur de tolérance n'a pas joué de rôle ; changeons-la et transformons les vêtements blancs de la fille en rouge menstruel !
Changeons le contenu du constructeur AvoidXfermode ci-dessus en :
avoidXfermode = new AvoidXfermode(0XFFD9E5F3, 25, AvoidXfermode.Mode.TARGET);
Alors, les vêtements blancs de la fille deviennent rouge menstruel...
, plein de culpabilité...

Mode 2 : AvoidXfermode.Mode.AVOID
C'est l'opposé du mode TARGET ci-dessus. Ci-dessus, la couleur n'est changée que lorsqu'elle est identique ; ici, elle est changée lorsqu'elle est différente. La valeur de tolérance apporte également le résultat opposé. Lorsque la tolérance est 0, l'image ne sera teintée que lorsque la valeur de couleur du pixel est complètement différente de la valeur de couleur définie. Lorsque la tolérance atteint le maximum de 255, la moindre différence de couleur la fera teinter ! Nous devons simplement modifier l'exemple ci-dessus. C'est-à-dire modifier le contenu du constructeur AvoidXfermode ! Nous le changeons en la phrase suivante :
avoidXfermode = new AvoidXfermode(0XFFD9E5F3,230, AvoidXfermode.Mode.AVOID);
Capture d'écran du résultat:

Deuxième fils : PixelXorXfermode
Il s'agit d'un autre mode de fusion d'images. Comparé au fils aîné, il est plus simple. Son constructeur est le suivant :
Documentation officielle de l'API :PixelXorXfermode
Analyse des paramètres :
Ce n'est qu'une valeur de couleur hexadécimale avec alpha. Quant à la fonction de cette valeur, il existe un algorithme : PixelXorXfermode calcule en interne selon l'algorithme XOR "opColor ^ src ^ dst", obtenant une valeur de couleur opaque (alpha = 255) et l'insérant dans l'image ! Bon, c'est ce que j'ai trouvé en ligne ; je ne le connais pas précisément non plus. Écrivons un exemple et voyons l'effet~
Exemple de code:
Capture d'écran du résultat:

Code d'implémentation:
/**
* Created by Jay on 2015/10/22 0022.
*/
public class PixelXorXfermodeView1 extends View{
private Paint mPaint;
private Bitmap mBitmap;
private PixelXorXfermode pixelxorXfermode;
public PixelXorXfermodeView1(Context context) {
super(context);
init();
}
public PixelXorXfermodeView1(Context context, AttributeSet attrs) {
super(context, attrs);
init();
}
public PixelXorXfermodeView1(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
init();
}
private void init() {
mPaint = new Paint(Paint.ANTI_ALIAS_FLAG); //抗锯齿
pixelxorXfermode = new PixelXorXfermode(0XFFD9E5F3);
mBitmap = BitmapFactory.decodeResource(getResources(), R.mipmap.iv_meizi);
}
@Override
protected void onDraw(Canvas canvas) {
canvas.drawBitmap(mBitmap, 50, 50, mPaint);
mPaint.setARGB(255, 222, 83, 71);
mPaint.setXfermode(pixelxorXfermode);
canvas.drawRect(50, 50, 690, 1010, mPaint);
}
}
Téléchargez le code d'exemple de cette section :
XfermodeDemo.zip
Résumé de cette section :
Eh bien, plein de culpabilité. Une belle fille a fini comme ça à cause de ma démo. Ne m'en veuillez pas,
Oh, c'est vrai, j'ai oublié de mentionner que le fils aîné et le deuxième fils de Xfermode sont décédés (obsolètes). Ils sont obsolètes depuis l'API 16. C'est-à-dire que cette section est pratiquement inutile...
On ne peut pas dire ça non plus. Apache a été castré dans les versions après la 4.4, mais il y a encore des gens qui utilisent HttpClient, ou des frameworks de requêtes HTTP écrits avec cette bibliothèque~ Bien sûr, ces gens sont très, très peu nombreux ! Mais en apprendre plus ne fait jamais de mal, n'est-ce pas ? Le troisième fils dans la section suivantePorterDuffXfermoden'est pas obsolète, et est aussi très important. Bon, ne vous inquiétez pas, il ne ruinera plus les photos ! Voilà, c'est tout ce que j'avais à dire, merci~




Oh, c'est vrai, j'ai oublié de mentionner que le fils aîné et le deuxième fils de Xfermode sont décédés (obsolètes). Ils sont obsolètes depuis l'API 16. C'est-à-dire que cette section est pratiquement inutile...