先看一下实现结果


直接上代码

public HollowTextView(Context context) {this(context, null);
}
public HollowTextView(Context context, @Nullable AttributeSet attrs) {this(context, attrs, 0);
}public HollowTextView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {super(context, attrs, defStyleAttr);initDate(context, attrs);initPaint();
}/**** 初始化画笔属性*/
private void initPaint() {//画文字的paintmTextPaint = new Paint();mTextPaint.setTextSize(mHollowTextSize);//这是镂空的关键mTextPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.DST_OUT));mTextPaint.setAntiAlias(true);mTextPaint.setFakeBoldText(true);
}/**** 加载所需数据* @param context*/
private void initDate(Context context, AttributeSet attrs) {TypedArray a = context.getTheme().obtainStyledAttributes(attrs, R.styleable.HollowTextView,0, 0);mHollowText = a.getString(R.styleable.HollowTextView_hollowText);mHollowTextSize = a.getDimensionPixelSize(R.styleable.HollowTextView_hollowTextSize, mHollowTextSize);mHollowBgColor = a.getColor(R.styleable.HollowTextView_hollowBgColor, mHollowBgColor);}@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {mWidth = (int) mTextPaint.measureText(mHollowText) + getPaddingLeft() + getPaddingRight();mHeight = mHollowTextSize + getPaddingTop() + getPaddingBottom();mWidth = measureDimension(mWidth, widthMeasureSpec);mHeight = measureDimension(mHeight, heightMeasureSpec);setMeasuredDimension(mWidth, mHeight);
}private int measureDimension(int defSize, int measureSpec) {int result = defSize;int specMode = MeasureSpec.getMode(measureSpec);int specSize = MeasureSpec.getSize(measureSpec);switch (specMode) {case MeasureSpec.UNSPECIFIED:result = defSize;break;case MeasureSpec.AT_MOST:result = Math.min(defSize, specSize);break;case MeasureSpec.EXACTLY:result = specSize;break;}return result;
}@Override
protected void onSizeChanged(int w, int h, int oldw, int oldh) {mContentBitmap = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888);bitMapCanvas = new Canvas(mContentBitmap);
}@Override
protected void onDraw(Canvas canvas) {drawContentBitmap();canvas.drawBitmap(mContentBitmap, 0, 0, null);
}/**** 画背景* @param canvas*/
private void drawBg(Canvas canvas) {bitMapCanvas.drawColor(mHollowBgColor);
}private void drawContentBitmap() {if (!TextUtils.isEmpty(mHollowText)) {bitMapCanvas.drawColor(Color.TRANSPARENT, PorterDuff.Mode.CLEAR);bitMapCanvas.drawColor(mHollowBgColor);Paint.FontMetrics fontMetrics = mTextPaint.getFontMetrics();float y = ((int) (mHeight - fontMetrics.ascent) >> 1) - 3;bitMapCanvas.drawText(mHollowText, getPaddingLeft(), y, mTextPaint);}
}

介绍一下主要实现的关键点 setXfermode 里面包含的16条规则和介绍
1.PorterDuff.Mode.CLEAR
所绘制不会提交到画布上。
2.PorterDuff.Mode.SRC
显示上层绘制图片
3.PorterDuff.Mode.DST
显示下层绘制图片
4.PorterDuff.Mode.SRC_OVER
正常绘制显示,上下层绘制叠盖。
5.PorterDuff.Mode.DST_OVER
上下层都显示。下层居上显示。
6.PorterDuff.Mode.SRC_IN
取两层绘制交集。显示上层。
7.PorterDuff.Mode.DST_IN
取两层绘制交集。显示下层。
8.PorterDuff.Mode.SRC_OUT
取上层绘制非交集部分。
9.PorterDuff.Mode.DST_OUT
取下层绘制非交集部分。
10.PorterDuff.Mode.SRC_ATOP
取下层非交集部分与上层交集部分
11.PorterDuff.Mode.DST_ATOP
取上层非交集部分与下层交集部分
12.PorterDuff.Mode.XOR
异或:去除两图层交集部分
13.PorterDuff.Mode.DARKEN
取两图层全部区域,交集部分颜色加深
14.PorterDuff.Mode.LIGHTEN
取两图层全部,点亮交集部分颜色
15.PorterDuff.Mode.MULTIPLY
取两图层交集部分叠加后颜色
16.PorterDuff.Mode.SCREEN
取两图层全部区域,交集部分变为透明色

android如何实现镂空文字相关推荐

  1. Android 使用 ellipsize 实现文字横向移动效果(跑马灯效果)

    实现的效果图如下 ellipsize 可以设置跑马灯效果 具体代码设置如下 <TextViewandroid:layout_width="match_parent"andro ...

  2. android让字体左右对齐,Android 模仿微信读书文字左右对齐效果

    原标题:Android 模仿微信读书文字左右对齐效果 本文作者 作者:Amter https://www.jianshu.com/p/020786e22a6f 左右对齐的文字效果,很常见,在大多数文章 ...

  3. Android 自定义跑马灯文字

    Android 跑马灯效果文字: 效果图(真实动画很流畅,这个转gif有问题,感觉有点卡): . 代码: /*** Created by wuguangliang on 2018/12/21** 跑马 ...

  4. iOS 渐变色 以及 镂空效果的实现(Mask的妙用)以及镂空文字的实现

    实现起来也很简单,主要分3个步骤: 1.创建一个镂空的路径: UIBezierPath 有个原生的方法- (void)appendPath:(UIBezierPath *)bezierPath, 这个 ...

  5. android radiobutton 文字按钮的距离,android RadioButton 图片与文字间距问题

    在使用radiobutton  的按钮跟文字之间的间距在不同的手机上会出现间距不一致,今天学习到了如何解决这个问题: android:button=@null;//将默认的button图片清空 and ...

  6. android 文字滚动组件,Android textview 跑马灯文字滚动效果

    设置如下TextView控件文件的XML: android:id="@+id/textview" android:layout_width="match_parent&q ...

  7. php镂空窗,镂空文字效果 视频画面变成镂空文字效果制作

    今天要分享的效果呢就是,一个正常的视频画面哦,不直接全部显示,而是把画面制作成文字的效果,然后只有文字的部分才能看到视频画面的内容,怎么说呢,就是镂空文字的效果.感兴趣的可以接下去看完整篇教程学习一下 ...

  8. PPT封面反转镂空文字

    制作PPT封面转镂空文字效果,示例如下: 1.开始之前需要安装小顽简报插件,小顽简报 | AboutPPT导航 我下载的版本是最新版0.1.25,下载之后双击即可,安装完成后ppt工具栏即出现&quo ...

  9. 镂空文字、类歌词进度显示文字

    Demo详见GitHub:JXTMarkLabel 镂空文字 - JXTHollowOutLabel 镂空文字效果的实现基于drawRect重绘,具体参考了两篇帖子: Drawing a path w ...

最新文章

  1. Nature对数千篇论文提出质疑:隐藏的细菌蛋白为自然界的“电网”提供动力
  2. 国内首档程序员真人秀?这不比博人传热血?!
  3. 赶考在线执业药师,7-8月提分策略,化繁为简
  4. SQL Server 2008编写脚本时智能提示功能丢失的处理
  5. 【Karma】多环境自动测试框架 -- 基础教程
  6. Python的Django框架中forms表单类的使用方法详解2
  7. 数据结构之平衡树:红黑树的介绍与Python代码实现——17
  8. 计算机网络课程设计之基于 IP 多播的网络会议程序
  9. php读取操作大文件
  10. Zabbix Agent端配置文件说明
  11. 员工辞职,多留几天只会怠工
  12. 第三十二章 三更雪压飞狐城(五之全)
  13. App刷量刷友盟方案
  14. html名人名言页面,HTML5 纪念卡 | 名人名言卡
  15. 国内外关于文物安全的法律法规、政策、标准等公开文件收集
  16. c语言随机抽取小程序_【图片】随机颜色的小程序【c语言吧】_百度贴吧
  17. openjudge 1.5.18 鸡尾酒疗法
  18. (转)工作是一种本能?
  19. pear php linux,linux下安装PEAR、Zend Debugger和Smarty
  20. win7系统如何添加摄像头--win10专业版

热门文章

  1. 一款动态樱花背景HTML个人单页
  2. 信息摘要函数(Hash函数)的设计与性质验证
  3. js操作word套红
  4. 1902回车设置 honeywell_Honeywell条码扫描器介绍自动换行及恢复出厂设置的方法
  5. python读取usb扫码枪数据_PyUsb USB条码扫描
  6. 模仿韩剧《太阳的后裔》色调的韩式风格照片
  7. 选择困难症__牛客网
  8. 收藏:近期已上线或即将上线的热门手游盘点,射击魔幻角色扮演?总有一款适合你
  9. Windows Server 2019 + IE 11 使用Flash Player
  10. 苹果CMS/V10模板-MXoneV6.3魔改版-二开大气短视模板