利用PorterDuffXfermode绘制图片文字

简介: PorterDuffXfermode是Android中用来对图层进行操作的类,类似于数学中的交集、并集,将上层(src)和下层(dst)进行特定的方式进行混合显示。

PorterDuffXfermode是Android中用来对图层进行操作的类,类似于数学中的交集、并集,将上层(src)和下层(dst)进行特定的方式进行混合显示。

构造方法:PorterDuffXfermode(PorterDuff.Mode mode)

下图显示对应的PorterDuff.Mode所对应的效果(详细参考英勇青铜5大神的简书

img_983cb2f263d4126bc305a7ec3c3bdc93.png
模式效果

这次实现的图片文字是用的SrcIn模式,也就是先画文字然后画图,取其交集区域显示上层图层

完整代码展示

package com.yuyigufen.customview;

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.PorterDuff;
import android.graphics.PorterDuffXfermode;
import android.support.annotation.Nullable;
import android.util.AttributeSet;
import android.view.View;

/**
 * Created by Administrator on 2018/6/1 0001.
 */

public class MyTextImageView extends View {

    private Paint paint;

    public MyTextImageView(Context context) {
        this(context,null);
    }

    public MyTextImageView(Context context, @Nullable AttributeSet attrs) {
        super(context, attrs);
        paint = new Paint(Paint.ANTI_ALIAS_FLAG);
    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        setMeasuredDimension(measureWidth(widthMeasureSpec),measureWidth(heightMeasureSpec));
    }
    private int measureWidth(int width){
        int size = MeasureSpec.getSize(width);
        int mode = MeasureSpec.getMode(width);
        if(MeasureSpec.EXACTLY==mode){
            return size;
        }else {
            if(MeasureSpec.AT_MOST==mode){
                return size<200?size:200;
            }
            return 200;
        }
    }

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
    //        创建一个新画布,然后在新画布上进行绘制
        int layerId = canvas.saveLayer(0, 0, getWidth(),getHeight() , null, Canvas.ALL_SAVE_FLAG);
        paint.setTextSize(100);
    //  这里使用STROKE模式通过设置StrokeWidth增加文字的宽度
        paint.setStyle(Paint.Style.STROKE);
        paint.setStrokeWidth(8);
        float i = paint.measureText("图片文字");
        canvas.drawText("图片文字",(getWidth()-i)/2,getHeight()/2,paint);
    //        设置取交集显示
        PorterDuffXfermode porterDuffXfermode = new PorterDuffXfermode(PorterDuff.Mode.SRC_IN);
        paint.setXfermode(porterDuffXfermode);
        Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.mipmap.fff);
    //        将图片缩放为控件大小
        Bitmap scaledBitmap = Bitmap.createScaledBitmap(bitmap, getWidth(), getHeight(), true);
        canvas.drawBitmap(scaledBitmap,5,5,paint);
        paint.setXfermode(null);
    //        将绘制完的画布贴到控件上
        canvas.restoreToCount(layerId);
    }
}

效果展示

img_068979841db8d2a36066b82fb1c867ef.png
效果展示
目录
相关文章
|
22天前
|
数据安全/隐私保护
图片添加文字水印
【10月更文挑战第21天】图片添加文字水印是一种重要的保护和宣传手段。通过合理选择文字内容、设计和添加方法,可以有效地为图片添加水印,保护图片的权益和价值。同时,随着技术的发展,我们也需要不断探索和创新,以适应不断变化的需求。你还可以根据具体的行业需求和实际情况,进一步深入研究和优化文字水印的添加策略,确保图片得到更好的保护和利用。
23 0
|
3月前
在图片上的文字背景,颜色是黑色?
在图片上的文字背景,颜色是黑色?
20 0
在图片上的文字背景,颜色是黑色?
|
4月前
|
PHP 数据安全/隐私保护 计算机视觉
ThinkPHP图片处理之压缩图片大小,图片处理之图片水印(添加平铺文字水印,并设置文字之间的间距和文字的角度)
ThinkPHP图片处理之压缩图片大小,图片处理之图片水印(添加平铺文字水印,并设置文字之间的间距和文字的角度)
89 1
|
4月前
根据图片获取图片中最多的颜色
根据图片获取图片中最多的颜色
|
6月前
如何实现图片多种颜色的文字混排并且带的背景颜色范围比文字图片范围大
如何实现图片多种颜色的文字混排并且带的背景颜色范围比文字图片范围大
42 1
|
6月前
绘制文本
【5月更文挑战第9天】绘制文本。
44 3
|
6月前
|
C# 开发工具 数据安全/隐私保护
C# 给图片添加文字水印
C# 给图片添加文字水印
|
6月前
|
前端开发 API 计算机视觉
opencv绘制基本图形,在图片上添加文字
opencv绘制基本图形,在图片上添加文字
|
自然语言处理 前端开发 API
改变canvas生成的图片中文本颜色
改变canvas生成的图片中文本颜色
|
6月前
|
前端开发
canvas详解04-绘制文字
canvas详解04-绘制文字
78 2
canvas详解04-绘制文字