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时生效 ,设置画笔的线条两侧粗细度

图1 setStyle(Paint.Style.FILL)
图2 setStyle(Paint.Style.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

图1 setStyle(Paint.Style.FILL)
图2 setStyle(Paint.Style.STROKE)
图3 setStyle(Paint.Style.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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

周周都刷火焰猫头鹰

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值