API Paint - MaskFilter (masque)


Introduction à cette section :

Dans le Tutoriel d'introduction de base Android - 8.3.1 Explication détaillée de trois classes d'outils de dessin, il existe une telle méthode dans la méthode Paint :

setMaskFilter(MaskFilter maskfilter): Définissez MaskFilter, vous pouvez utiliser différents MaskFilter pour obtenir des effets de filtre, tels que le filtrage, la stéréoscopie, etc. ! Nous n'utilisons généralement pas ce MaskFilter directement, mais utilisons ses deux sous-classes :

BlurMaskFilter : spécifie un style de flou et un rayon pour traiter les bords de Paint.

EmbossMaskFilter : Spécifie la direction de la source de lumière et l'intensité de la lumière ambiante pour ajouter un effet de gaufrage. Écrivons un exemple pour l'essayer ~ !

Documentation officielle de l'API :
BlurMaskFilter;
EmbossMaskFilter)


Que signifie le filtre stéréo? savez-vous comment le faire ? Voir les vraies connaissances pour des exemples :

Exemples de code

 :

Exécution de rendus :

Code d'implémentation1.png :

Ici, nous créons une vue personnalisée, finissons de dessiner à l'intérieur !

BlurMaskFilterView.java

:
/**
 * Created by Jay on 2015/10/21 0021.
 */
public class BlurMaskFilterView extends View{

    public BlurMaskFilterView(Context context) {
        super(context);
    }

    public BlurMaskFilterView(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public BlurMaskFilterView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }

    @Override
    protected void onDraw(Canvas canvas) {

        BlurMaskFilter bmf = null;
        Paint paint=new Paint();
        paint.setAntiAlias(true);          //抗锯齿
        paint.setColor(Color.RED);//画笔颜色
        paint.setStyle(Paint.Style.FILL);  //画笔风格
        paint.setTextSize(68);             //绘制文字大小,单位px
        paint.setStrokeWidth(5);           //画笔粗细

        bmf = new BlurMaskFilter(10f,BlurMaskFilter.Blur.NORMAL);
        paint.setMaskFilter(bmf);
        canvas.drawText("最喜欢看曹神日狗了~", 100, 100, paint);
        bmf = new BlurMaskFilter(10f,BlurMaskFilter.Blur.OUTER);
        paint.setMaskFilter(bmf);
        canvas.drawText("最喜欢看曹神日狗了~", 100, 200, paint);
        bmf = new BlurMaskFilter(10f,BlurMaskFilter.Blur.INNER);
        paint.setMaskFilter(bmf);
        canvas.drawText("最喜欢看曹神日狗了~", 100, 300, paint);
        bmf = new BlurMaskFilter(10f,BlurMaskFilter.Blur.SOLID);
        paint.setMaskFilter(bmf);
        canvas.drawText("最喜欢看曹神日狗了~", 100, 400, paint);
        
        setLayerType(View.LAYER_TYPE_SOFTWARE, null);     //关闭硬件加速
    }
}

D'accord, à partir de l'exemple de code ci-dessus, nous pouvons constater que nous utilisons ce BlurMaskFilter, rien de plus que, Instanciez dans le constructeur :

BlurMaskFilter(10f,BlurMaskFilter.Blur.NORMAL);

Ce que nous pouvons contrôler, ce sont ces deux paramètres :

Le premier paramètre

 : spécifie le rayon du bord flou ;

Le deuxième paramètre : spécifie le style de flou ; les valeurs facultatives sont :

. BlurMaskFilter.Blur.NORMAL

 : flou intérieur et extérieur
  • BlurMaskFilter.Blur.OUTER : flou extérieur
  • BlurMaskFilter.Blur.INNER : Flou interne
  • BlurMaskFilter.Blur.SOLIDE : Flou interne gras et externe
  • peut encore être un peu flou , trouvons une image à essayer :

Ici, nous modifions le rayon de flou à 50, ce qui le rend plus évident~

2.png

2. (effet de gaufrage)


Comme mentionné, ajoutez un effet de gaufrage en spécifiant la direction et l'intensité de la source de lumière ambiante. De même, écrivons un exemple pour voir l'effet :

<. 🎜 >
Exemple de code

 :

Exécution de rendus :

Code d'implémentation

 : 3.png

/**
 * Created by Jay on 2015/10/22 0022.
 */
public class EmbossMaskFilterView extends View{

    public EmbossMaskFilterView(Context context) {
        super(context);
    }

    public EmbossMaskFilterView(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public EmbossMaskFilterView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }

    @Override
    protected void onDraw(Canvas canvas) {
        float[] direction = new float[]{ 1, 1, 3 };   // 设置光源的方向
        float light = 0.4f;     //设置环境光亮度
        float specular = 8;     // 定义镜面反射系数
        float blur = 3.0f;      //模糊半径
        EmbossMaskFilter emboss=new EmbossMaskFilter(direction,light,specular,blur);

        Paint paint = new Paint();
        paint.setAntiAlias(true);          //抗锯齿
        paint.setColor(Color.BLUE);//画笔颜色
        paint.setStyle(Paint.Style.FILL);  //画笔风格
        paint.setTextSize(70);             //绘制文字大小,单位px
        paint.setStrokeWidth(8);           //画笔粗细
        paint.setMaskFilter(emboss);

        paint.setMaskFilter(emboss);
        canvas.drawText("最喜欢看曹神日狗了~", 50, 100, paint);


        Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.mipmap.ic_bg_meizi1);
        canvas.drawBitmap(bitmap, 150, 200, paint);

        setLayerType(View.LAYER_TYPE_SOFTWARE, null);     //关闭硬件加速
    }
}

D'après les rendus, nous pouvons voir certains des effets d'EmbossMaskFilter, modifiant la lumière pour former un effet de relief ~ la fille n'est pas évidente, Le texte montre très clairement la texture ! Comme BlurMaskFilter, les réglages associés sont effectués dans la méthode de construction !

EmbossMaskFilter(float[] direction, float ambient, float specular, float blurRadius)Les paramètres sont :

direction : tableau à virgule flottante, utilisé pour contrôler la direction de la source lumineuse des axes x, y, z

ambiante : Réglez la luminosité de la lumière ambiante, entre 0 et 1

spéculaire : Coefficient de réflexion spéculaire

blurRadius : Rayon de flou

Vous pouvez modifier ces valeurs et essayer différents effets. Par exemple, si je modifie ce qui précède, cela le fera. être un autre Cet effet :

//Par souci de clarté, il est changé en vert

4.png


3. Notes

Lors de l'utilisation de MaskFilter, veuillez noter que lorsque notre targetSdkVersion >= 14, MaskFilter Cela n'aura aucun effet car Android a activé l'accélération matérielle par défaut dans les versions API 14 et supérieures, qui sont entièrement activées. Utiliser les caractéristiques du GPU rend le dessin plus fluide, mais cela consommera plus de mémoire ! D'accord, désactivons l'accélération matérielle. Voilà, vous pouvez activer ou désactiver l'accélération matérielle à différents niveaux. Généralement, elle est désactivée~

  • Application : Ajoutez dans le nœud application du fichier de configuration : android:hardwareAccelerated="true"
  • Activity : Ajoutez-le au nœud d'activité du fichier de configuration android:hardwareAccelerated="false"
  • View : Appelé après l'obtention de l'objet View, ou défini directement dans la méthode onDraw() de la View : view.setLayerType(View.LAYER_TYPE_HARDWARE, null);

Téléchargement d'un exemple de code :

MaskFilterDemo.zip


Résumé de cette section :

Cette section démontre une API de Paint, setMaskFilter(MaskFilter maskfilter), apprise L'utilisation de base des deux sous-classes de MaskFilter : BlurMaskFilter (effet de flou) et EmbossMaskFilter (effet de relief), C'est relativement simple. Si vous en apprenez davantage, cela ne nous fera pas de mal de personnaliser les commandes dans la partie avancée. Merci~5.gif

Au fait, j'ai oublié de mentionner qu'il y a en fait une classe dans l'exemple du SDK qui démontre ces deux utilisations :

samplesandroid-xxlegacyApiDemossrccomexampleandroidapisgraphics Répertoire : FingerPaint.java fichier~