利用PorterDuffXfermode绘制图片文字
2019-01-28 21:52
405 查看
PorterDuffXfermode是Android中用来对图层进行操作的类,类似于数学中的交集、并集,将上层(src)和下层(dst)进行特定的方式进行混合显示。
构造方法:PorterDuffXfermode(PorterDuff.Mode mode)
下图显示对应的PorterDuff.Mode所对应的效果
这次实现的图片文字是用的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); } }
效果展示
相关文章推荐
- 利用 2D 图形和 PorterDuffXferMode 等实现被遮罩的图片
- 基于PorterDuffXfermode或Shader绘制圆角图片
- Android Canvas绘制图片层叠处理方式porterduff xfermode
- PorterDuffXfermode实例,将自定义View变为图片
- 利用PorterDuffXfermode 对Bitmap的特殊处理
- 图形绘制中的PorterDuffXfermode
- 【Android】PorterDuffXfermode使用(通过消除背景层与重叠部分绘制组合图形)
- PorterDuffXfermode合成圆形图片显示不正确
- PorterDuffXfermode图片重叠过渡模式
- 使用PorterDuffXferMode实现自定义的圆角图片
- 关于android中图片裁剪以及PorterDuffXfermode的使用经验小结
- 安卓图片--PorterDuffXfermode并制作圆形图片
- Android图片遮罩模式PorterDuffXfermode的使用
- Xfermode和PorterDuff详解、自定义View的属性、涂鸦和悬浮球绘制
- Android学习研究(四)通过PorterDuffXfermode形成简单的圆角和圆形图片
- 实现仿微信聊天时发送图片的形状(NinePatch+PorterDuffXfermode)
- 自定义View通过PorterDuffXfermode实现图片遮罩效果
- 图形绘制中的PorterDuffXfermode
- PorterDuffXfermode无法合成图片
- android PorterDuffXfermode ,PorterDuff.Mode 使用 以及Porter-Duff规则详解