Paint 方法记录 +
Paint:该类保存了绘制几何图形、文本和位图的样式和颜色信息。也就是说我们可以使用Paint保存的样式和颜色,来绘制图形、文本和bitmap。
文字设置
字体风格(黑体、斜体、…)
转:https://blog.csdn.net/u012587005/article/details/51105126
Paint mp = new paint();
mp.setTypeface(Typeface.DEFAULT_BOLD)
常用的字体类型名称还有:
Typeface.DEFAULT //常规字体类型
Typeface.DEFAULT_BOLD //黑体字体类型
Typeface.MONOSPACE //等宽字体类型
Typeface.SANS_SERIF //sans serif字体类型
Typeface.SERIF //serif字体类型
除了字体类型设置之外,还可以为字体类型设置字体风格,如设置粗体:
Paint mp = new Paint();
Typeface font = Typeface.create(Typeface.SANS_SERIF, Typeface.BOLD);
p.setTypeface( font );
常用的字体风格名称还有:
Typeface.BOLD //粗体
Typeface.BOLD_ITALIC //粗斜体
Typeface.ITALIC //斜体
Typeface.NORMAL //常规
字体大小
void setTextSize(float textSize)
单位是PX
对齐方式
void setTextAlign(Align align)
Paint.Align.LEFT 左对齐
Paint.Align.CENTER 中心对齐,绘制从
Paint.Align.RIGHT 右对齐
设置粗体
setFakeBoldText(boolean fakeBoldText);
模拟实现粗体文字,设置在小字体上效果会非常差
LCD
setSubpixelText(boolean subpixelText);
设置该项为true,将有助于文本在LCD屏幕上的显示效果
X轴拉伸缩放比例
setTextScaleX(float scaleX);
设置绘制文字x轴的拉伸缩放比例,可以实现文字的拉伸缩放的效果
斜体
setTextSkewX(float skewX);
设置斜体文字,skewX为倾斜弧度
下划线
setUnderlineText(boolean underlineText);
设置带有下划线的文字效果
删除线
setStrikeThruText(boolean strikeThruText);
设置带有删除线的效果
隐藏模式
setHinting(int mode)
设置画笔的隐藏模式
字符间距
setLetterSpacing(float letterSpacing)
设置字符间的间距
线性文本
setLinearText(boolean linearText)
设置是否打开线性文本标识;由于文本想要快速绘制出来,必然是需要提前缓存在显存中的,一般而言每个文字需要一个字节的大小来存储它(当然具体需要多少字节与编码方式有关),那如果是长篇文章,可见所需的大小可想而知。我们可以通过setLinearText (true)告诉Android我们不需要这样的文本缓存。但如果我们不用文本缓存,虽然能够省去一些内存空间,但这是以显示速度为代价的。
由于这个是API 1的函数,由于当时的android手机的内存大小还是很小的,所以尽量减少内存使用是每个应用的头等大事,在当时的的环境下这个函数还是很有用的。
转:https://www.jianshu.com/p/e93481f19738
地理位置
void setTextLocale(Locale locale)
设置地理位置,比如显示中文,日文,韩文等,默认的显示Locale.getDefault()即可
倾斜角度
void setTextSkewX(float skewX)
设置文字倾斜
添加标识 FLAG 代替方法设置功能
paint.setFlags(Paint.ANTI_ALIAS_FLAG);
Paint.ANTI_ALIAS_FLAG :抗锯齿标志
Paint.FILTER_BITMAP_FLAG : 使位图过滤的位掩码标志
Paint.DITHER_FLAG : 使位图进行有利的抖动的位掩码标志
Paint.UNDERLINE_TEXT_FLAG : 下划线
Paint.STRIKE_THRU_TEXT_FLAG : 中划线
Paint.FAKE_BOLD_TEXT_FLAG : 加粗
Paint.LINEAR_TEXT_FLAG : 使文本平滑线性扩展的油漆标志
Paint.SUBPIXEL_TEXT_FLAG : 使文本的亚像素定位的绘图标志
Paint.EMBEDDED_BITMAP_TEXT_FLAG : 绘制文本时允许使用位图字体的绘图标志
转 https://blog.csdn.net/weixin_42803953/article/details/110383729
图像设置
线条宽度
void setStrokeWidth(float width)
用途:当画笔样式为STROKE或FILL_OR_STROKE时生效 ,设置画笔的线条两侧粗细度
![]() |
![]() |
线冒(线的起始和终止样式)
setStrokeCap(Paint.Cap cap);
设置画笔的线冒样式:
Paint.Cap.BUTT:无
Paint.Cap.SQUARE:方形
Paint.Cap.ROUND: 半圆形
图形结合处(线条拐点)
设置绘制时各图形的结合方式,如平滑效果等
Paint.Join.MITER: 直角的样式
Paint.Join.ROUND:圆弧
Paint.Join.BEVEL:在直角样式上切了一个小三角形
Paint的setStrokeCap、setStrokeJoin、setPathEffect:https://blog.csdn.net/lxk_1993/article/details/102936227
画笔类型(填充、描边、…)
void setStyle(Style style)
一共分为三种,填充 Paint.Style.FILL,描边 Paint.Style.STROKE,还有最后不常用的一种 Paint.Style.FILL_AND_STROKE
如图1中,效果就是填充;图2是描边,图3 是 FILL_AND_STROKE
![]() |
![]() |
![]() |
颜色
void setColor
使用数字颜色表示时,需要设置透明度
paintBg.setColor(0xC2A688);
paintBg.setAlpha((int) (0.2 * 255));
paintProgress.setColor(0xffC2A688);
setARGB(int a,int r,int g,int b);
paint.setARGB(100, 255, 0, 0);
设置绘制的颜色,a代表透明度,r,g,b代表颜色值。
渲染/渐变效果 +
BitmapShader 图形渲染
LinearGradient 线性渲染
RadialGradient 环形渲染
SweepGradient 梯度渲染(扫描渲染)
ComposeShader 组合渲染
paint.setShader(bitmapShader);
使用场景:绘制渐变
透明度
setAlpha(int a);
设置绘制图形的透明度
取值范围从0~255。值越小,约模糊
抗锯齿
paint.setAntiAlias(true);
设置是否使用抗锯齿功能,会消耗较大资源,绘制图形速度会变慢
设置抗锯齿,可以让绘制的图形更平滑,看不见像素的锯齿
使用场景:图片绘制时
抖动
setDither(boolean dither);
设定是否使用图像抖动处理,会使绘制出来的图片颜色更加平滑和饱满,图像更加清晰
使用场景:图片绘制时
双线性过滤
setFilterBitmap(boolean filter)
设置是否使用双线性过滤来绘制 Bitmap 。
图像在放大绘制的时候,默认使用的是最近邻插值过滤,这种算法简单,但会出现马赛克现象;而如果开启了双线性过滤,就可以让结果图像显得更加平滑。
使用场景:图片放大绘制时
滤镜
setMaskFilter(MaskFilter maskfilter)
BlurMaskFilter和EmbossMaskFilter,前者为模糊遮罩滤镜而后者为浮雕遮罩滤镜
BlurMaskFilter 指定了一个模糊的样式和半径来处理Paint的边缘
EmbossMaskFilter 指定了光源的方向和环境光强度来添加浮雕效果
使用场景:BlurMaskFilter 用于阴影边缘绘制;EmbossMaskFilter 用于滤镜
颜色过滤器
setColorFilter(ColorFilter colorfilter);
设置颜色过滤器,可以在绘制颜色时实现不用颜色的变换效果
ColorMatrixColorFilter 颜色矩阵过滤器 :主要用来修改颜色
LightingColorFilter 光照颜色过滤器:光可以简单的完成色彩过滤和色彩增强功能
PorterDuffColorFilter 混合模式过滤器:通过添加新图层颜色,和原图层进行拼装混排(18种混排模式)
图片转自
Android图像处理——Paint之ColorFilter:https://blog.csdn.net/allen315410/article/details/45059989
自定义控件三部曲之绘图篇(九)——Paint之setColorFilter:https://blog.csdn.net/harvic880925/article/details/51253944
记录以上两个链接备用
图像混合模式(过渡模式)
setXfermode(Xfermode xfermode);
设置图形重叠时的处理方式,如合并,取交集或并集,经常用来制作橡皮的擦除效果
方法跟我们上面讲到的setColorFilter蛮相似的。
AvoidXfermode
PixelXorXfermode
PorterDuffXfermode
太难了,不看了
https://www.cnblogs.com/tianzhijiexian/p/4297172.html
Xfermode mPdXfermode = new PorterDuffXfermode(PorterDuff.Mode.MULTIPLY);
mBgPaint.setXfermode(mPdXfermode);
轮廓线样式
setPathEffect(PathEffect effect)
单一效果的 CornerPathEffect DiscretePathEffect DashPathEffect PathDashPathEffect ,和组合效果的 SumPathEffect ComposePathEffect
自定义View:setPathEffect(PathEffect effect):https://blog.csdn.net/weixin_47623364/article/details/121597433
图片转自
详解Paint的setPathEffect(PathEffect effect):https://www.cnblogs.com/tianzhijiexian/p/4297783.html
阴影
setShadowLayer(float radius, float dx, float dy, int shadowColor)
在图形下面设置阴影层,产生阴影效果,radius为阴影的角度,dx和dy为阴影在x轴和y轴上的距离,color为阴影的颜色
setMaskFilter 也可以绘制阴影,setShadowLayer的阴影主要是为Text绘制。
在硬件加速开启的情况下, setShadowLayer() 只支持文字的绘制,文字之外的绘制必须关闭硬件加速才能正常绘制阴影
自定义View:阴影与模糊:https://blog.csdn.net/weixin_47623364/article/details/121715107
获取
测量文本长度
void getTextBounds(String text, int start, int end, Rect bounds)
将TextView 的文本放入一个矩形中, 测量TextView的高度和宽度
第一个参数 char[] text
//参数:
paintText = new Paint();
paintText.setStrokeWidth(dp2px(getContext(), 2));
paintText.setStyle(Paint.Style.FILL);
paintText.setDither(true);
paintText.setTextSize(dp2px(getContext(), 16));
paintText.setTextAlign(Paint.Align.LEFT);
paintText.setColor(getContext().getResources().getColor(R.color.colorPrimary));
String textStr = "0123456789";
//使用:
Rect mRect = new Rect();
Paint.FontMetricsInt fontMetrics = paintText.getFontMetricsInt();
paintText.getTextBounds(textStr, 0, textStr.length(), mRect);
int w = mRect.width();
int h = mRect.height();
int left = mRect.left;
int top = mRect.top;
int right = mRect.right;
int bottom = mRect.bottom;
LogUtils.i(TAG, "输出Rect ====" + "\n" +
"w ===" + w + "\n" +
"h ===" + h + "\n" +
"left ===" + left + "\n" +
"top ===" + top + "\n" +
"right ===" + right + "\n" +
"bottom ===" + bottom + "\n"
);
输出:
2020-12-04 16:46:14.207 29011-29011/com.yoshin.tspsdk I/NeusoftTspSdk----->CanvasTestView: 输出Rect ====
w ===265
h ===36
left ===2
top ===-35
right ===267
bottom ===1
获取行间距
getFontSpacing()
得到行间距
参考
拓展:Android Paint: .measureText() vs .getTextBounds():https://cloud.tencent.com/developer/ask/28191
Android Paint的使用详解 https://blog.csdn.net/abcdef314159/article/details/51720686
Android图像处理之Paint特效处理(Paint重点API方法精炼详解):https://blog.csdn.net/weixin_41101173/article/details/81807915
Android绘图篇(四)——Paint详解:https://blog.csdn.net/huxin1875/article/details/88966172