Paint 使用

Paint 用法

先申明一下,这个只是自己想对paint有个整体滴认识,所以才整理出来滴,里面的链接其实都是同一个, 比较难滴地方,都是参考这个大神滴文章来进行滴。。。
看到这里,已经实现了引流,哈哈哈,你们可以去看大神滴文章了。

1. 关于text的方法

1.1 ascent(都是直接翻译滴,其实就是返回到基线的距离)
//根据当前的字体和文字大小返回上方(负)基线(上升)的距离。
float   ascent() 
1.2 descent
//根据当前的字体和文字大小,返回下方(正)基线(下降)的距离。
float   descent() 
1.3 breakText

1.3.1

//maxWidth 表示 可接受的最大长度,返回的int表示绘制了多少个字符,measureWidth是我们自己设置进去的,他的值表示绘制的这几个字符的实际宽度.后面有代码颜色
int breakText(char[] text, int index, int count, float maxWidth, float[] measuredWidth)

1.3.2

//测量文本,如果测量的宽度超过maxWidth,则提早停止。
// measureForwards 如果为true,则向前测量,从字符串中的第一个字符开始。 否则,向后测量,从字符串中的最后一个字符开始。
int breakText(String text, boolean measureForwards, float maxWidth, float[] measuredWidth)

代码演示

paint.setTextSize(50);
String str = "AABBCCDDEEFF";
float[] f= new float[1];
int width = paint.breakText(str, true, 200, f);
Log.i(TAG, "WIDTH = " + width + " ---str--- = " + str.length() + "---realWidth---" + f[0]);
//将结果打印出来 WIDTH = 6 ---str--- = 12---realWidth---194.0

1.3.3

//同上
int breakText(CharSequence text, int start, int end, boolean measureForwards, 
float maxWidth, float[] measuredWidth)
1.4 FontFeatureSettings

1.4.1 getFontFeatureSettings具体指参考

//返回字体设置。 具体值参考
String  getFontFeatureSettings()

1.4.2 setFontFeatureSettings

void    setFontFeatureSettings(String settings) 
1.5 FontMetrics(Metrics 文字与基线的几个值得包装类)

1.5.1 getFontMetrics

//返回字体的推荐行间距,给出paint的字体,文字大小等的设置。
float  getFontMetrics(Paint.FontMetrics metrics)

1.5.2 getFontMetrics

//返回metrics对象
Paint.FontMetrics   getFontMetrics()

1.5.3 getFontMetricsInt

//返回字体的行间距,给出Paint的字体设置,textSize等
int getFontMetricsInt(Paint.FontMetricsInt fmi)
1.6 getFontSpacing
根据当前的字体和文字大小返回推荐行间距。
float   getFontSpacing()
1.7 getFontVariationSettings(后续更新)

1.7.1

//返回字体变体设置。 api26以上 (没试过)
String  getFontVariationSettings()

1.7.2

//api26以上  不清楚有什么作用
boolean setFontVariationSettings(String fontVariationSettings) 
1.8 LetterSpacing

1.8.1

//返回文字间距。
float   getLetterSpacing()

1.8.2

//为文本设置paint的字母间距。
void    setLetterSpacing(float letterSpacing)
1.9 OffsetForAdvance

1.9.1 getOffsetForAdvance

//获取位置最接近指定水平位置的字符串中的字符偏移量。
int getOffsetForAdvance(char[] text, int start, int end, int contextStart, int contextEnd, boolean isRtl, float advance)

1.9.2 getOffsetForAdvance

//同上
int getOffsetForAdvance(CharSequence text, int start, int end, int contextStart, int contextEnd, boolean isRtl, float advance)
1.10 RunAdvance

1.10.1

//在文本运行中测量光标位置。
float   getRunAdvance(char[] text, int start, int end, int contextStart,int contextEnd, boolean isRtl, int offset)

1.10.2

//同上
float   getRunAdvance(CharSequence text, int start, int end,int contextStart, int contextEnd, boolean isRtl, int offset)
1.11 TextAlign

1.11.1

//返回字体对齐方式
Paint.Align get TextAlign()

1.11.2

void    setTextAlign(Paint.Align align)
1.12 TextBounds

1.12.1

//获取文本的宽高,通过bounds的Rect拿到整型。
void    getTextBounds(String text, int start, int end, Rect bounds)

1.12.2

//同上
void    getTextBounds(char[] text, int index, int count, Rect bounds)
1.13 TextLocale

1.13.1 getTextLocale

//获取当前文本的区域
Locale  getTextLocale()

1.13.2 setTextLocale

//设置文本的区域,比如中文,英文,一般用Local.getDefault();
void setTextLocale(Locale locale) 

1.13.3

//api 24以上 还未测试
LocaleList  getTextLocales() 

1.13.4

//api 24以上 还未测试
void    setTextLocales(LocaleList locales) 
1.16 TextPath

1.16.1

//返回指定文本的路径(轮廓)。
void    getTextPath(char[] text, int index, int count, float x, float y, Path path)

1.16.2

//同上
void    getTextPath(String text, int start, int end, float x, float y, Path path)

代码解析

//注意要电泳path.close();
Path path = new Path();
paint.getTextPath("ABCDEFgh", 0, "ABCDEFgh".length(), 100,400, path);
path.close();
paint.setStrokeWidth(5);
canvas.drawPath(path, paint);
1.17 TextScaleX

1.17.1

//返回在水平方向的比例 默认是1
float   getTextScaleX()

1.17.2

void    setTextScaleX(float scaleX)
1.18 TextSize

1.18.1

//Text的字体大小
float   getTextSize()

1.18.2

void    setTextSize(float textSize)
1.19 TextSkewX

1.19.1

//获取水平偏移
float   getTextSkewX()

1.19.2

void    setTextSkewX(float skewX)
1.20 TextWidths

1.20.1

//返回字符串中字符的宽度。
int getTextWidths(char[] text, int index, int count, float[] widths)

1.20.2

//同上
int getTextWidths(String text, float[] widths)

1.20.3

//同上
int getTextWidths(String text, int start, int end, float[] widths)

1.20.4

//同上
int getTextWidths(CharSequence text, int start, int end, float[] widths)

代码解析

 String str1 = "ABCab分机";
float[] widths = new float[str1.length()];
int num = paint.getTextWidths(str1, 0,str1.length(),  widths);
canvas.drawPaint(paint);
for (float num1: widths){
    Log.i(TAG, "WIDTH = " + num  + "---realWidth---" + num1);
}
//log
//WIDTH = 7---realWidth---8.0
//WIDTH = 7---realWidth---7.0
//WIDTH = 7---realWidth---8.0
//WIDTH = 7---realWidth---7.0
//WIDTH = 7---realWidth---7.0
//WIDTH = 7---realWidth---12.0
//WIDTH = 7---realWidth---12.0
1.21 Typeface

1.21.1

//获取paint的字体对象。默认有四种实现
//BOLD(加粗)、BOLD_ITALIC(加粗并倾斜)、ITALIC(倾斜)、NORMAL(正常)
Typeface    getTypeface()

1.21.2

Typeface    setTypeface(Typeface typeface)
1.22 hasGlyph
//确定paint上设置的字体是否具有支持字符串的字形。
boolean hasGlyph(String string)
1.23 measureText

1.23.1

//获取文字的宽度
float   measureText(char[] text, int index, int count)

1.23.2

//同上
float   measureText(CharSequence text, int start, int end)

1.23.3

//同上
float   measureText(String text, int start, int end)

1.23.4

//同上
float   measureText(String text)
1.24 FakeBoldText

1.24.1

//获取与设置文本是否仿粗体
final boolean   isFakeBoldText()

1.24.2

//获取与设置文本是否仿粗体,小字体设置效果非常差。
void    setFakeBoldText(boolean fakeBoldText)
1.25 ElegantTextHeight(目前不清楚什么作用,后续更新)

1.25.1

boolean    isElegantTextHeight()

1.25.2

void    setElegantTextHeight(boolean elegant)
1.26 LinearText

1.26.1

//getFlags()的帮助器,如果设置了LINEAR_TEXT_FLAG位,则返回true
//直接翻译的官方文档。。。不太清楚怎么用,看到一个大神的解释是获取与设置是否打开线性文本标识。因为默认Android中文本绘制需要使用一个Bitmap作为单个字符缓存,因此会使用一定的空间,为了不使用该空间则设为true即可。
final boolean   isLinearText()

1.26.2

//帮助setFlags(),设置或清除LINEAR_TEXT_FLAG位
void    setLinearText(boolean linearText)
1.27 trikeThruText

1.27.1

//删除线
final boolean   isStrikeThruText()

1.27.2

//设置是否有删除线
void    setStrikeThruText(boolean strikeThruText)
1.28 SubpixelText

1.28.1

//不明白这是什么,有人说是在LCD屏幕显示有比较好的效果
final boolean   isSubpixelText()

1.28.2

void    setSubpixelText(boolean subpixelText)
1.29 UnderlineText

1.29.1

//下划线
final boolean   isUnderlineText()

1.29.2

void    setUnderlineText(boolean underlineText)

2. 关于paint的方法(感觉可以称为通用方法,比如颜色设置什么滴)

2.1 Alpha

2.1.1

int getAlpha()

2.1.2

void    setAlpha(int a)
2.2 Color

2.2.1

int getColor()

2.2.2

void    setColor(int color)

2.2.3

void    setARGB(int a, int r, int g, int b)

2.2.4 (听说是很强大很强大很强大滴东西,不过需要ColorMatrix来支持,所以先去看看Matrix吧,这样才能更好理解,反正我是准备去看了 xiaokulian)
请跟着大神滴角步走

//获取颜色过滤器(可能为null)。
ColorFilter getColorFilter()

2.2.5

//设置或清除paint的颜色过滤器,返回参数。听说很重要,等下再分析
ColorFilter setColorFilter(ColorFilter filter)
2.3 Flags

2.3.1

//Return the paint's flags.
int getFlags()

2.3.2

void    setFlags(int flags)
2.4 Hinting

2.4.1

//返回paint的模式。 返回HINTING_OFF或HINTING_ON。
//官方直译,不知道什么效果。。。。
int getHinting()

2.4.2

void    setHinting(int mode)
2.5 MaskFilter

骚年,赶紧走吧走吧,不要留着这里,这里不适合你
2.5.1

//获取paint的maskfilter对象。
MaskFilter  getMaskFilter()

2.5.2

//设置或清除maskfilter对象。
MaskFilter  setMaskFilter(MaskFilter maskfilter)
2.6 StrokeWidth

2.6.1

// 返回线的宽度 比如 画一个空心圆, 就是返回空心圆的线条宽度
float   getStrokeWidth()

2.6.2

void    setStrokeWidth(float width)
2.7 Style

2.7.1

//设置填充的模式
Paint.Style getStyle()

2.7.2

void    setStyle(Paint.Style style)
2.8 StrokeMiter(没搞明白)

2.8.1

// 获取画笔的倾斜度???
float   getStrokeMiter()

2.8.2

// 设置画笔的倾斜度
void    setStrokeMiter(float miter)
2.9 Xfermode(这个有点复杂,不过跟着官方文档看,就比较清晰了,用的时候查文档)

文档地址
2.9.1

Xfermode    getXfermode()

2.9.2

Xfermode    setXfermode(Xfermode xfermode)
2.10 AntiAlias

2.10.1

//是否打开抗锯齿 默认是没打开,一般情况下需要打开
final boolean   isAntiAlias()

2.10.2

void    setAntiAlias(boolean aa)
2.11 Dither

2.11.1

//获取与设定是否使用图像抖动处理,会使绘制出来的图片颜色更加平滑和饱满、图像更加清晰。
final boolean   isDither()

2.11.2

void    setDither(boolean dither)
2.12 FilterBitmap(不懂,没用过。。。)

2.12.1

//位图过滤器是否被激活。
final boolean   isFilterBitmap()

2.12.2

void    setFilterBitmap(boolean filter)
2.13 reset
//重置
void    reset()
2.14 set(Paint src)
//利用另外一个paint来设置这个paint
void    set(Paint src)
2.15 Shader

这个比较重要,比如平铺,镜像翻转什么的 都可以用这个实现
具体的看这里
2.15.1

Shader  getShader()

2.15.2

Shader  setShader(Shader shader)
2.16 ShaderLayer(设置阴影)

2.16.1

//这将在主层下面绘制一个阴影层,具有指定的偏移和颜色以及模糊半径。
void    setShadowLayer(float radius, float dx, float dy, int shadowColor)

2.16.2

void    clearShadowLayer() // 清除阴影扩散效果
2.17 StrokeCap(不太明白,可以去大神滴文章看看,反正目前我还没有弄清楚)

2.17.1

Paint.Cap   getStrokeCap()

2.17.2

void    setStrokeCap(Paint.Cap cap)
2.18 StrokeJoin

2.18.1

//获取与设置画笔画线等连接处的轮廓样式
//三种样式 Join.MITER  Join.ROUND, Join.BEVEL
Paint.Join  getStrokeJoin()

2.18.2

void    setStrokeJoin(Paint.Join join)
2.19 getFillPath
//将任何/全部效果(patheffect,抚摸)应用于src,将结果返回到dst(这一段来自google翻译)
//我的理解就是将src的属性复制到dst里面,是的dst在几何视角上与src有一样的展示
boolean getFillPath(Path src, Path dst)
2.20 PathEffect (设置路径绘制效果,有好几种模式)

详解看这里
2.20.1

//获取paint的patheffect对象。
PathEffect  getPathEffect()

2.20.2

//设置或清除patheffect对象。
PathEffect  setPathEffect(PathEffect effect)

3.常量(都是tm什么鬼哟,就用过几个,好吧我承认都是google翻译的)

3.1 ANTI_ALIAS_FLAG 抗锯齿标志
3.2 DITHER_FLAG 启用此标志会对目标的颜色空间比源更受约束的任何blit操作应用抖动。
3.3 EMBEDDED_BITMAP_TEXT_FLAG 绘制标记,可以在绘制文本时使用位图字体。
禁用此标志将阻止文本绘制操作在字体中使用嵌入式位图冲击,从而导致具有可缩放轮廓和位图冲突的字体仅绘制可缩放轮廓,并且仅使用位图冲击的字体无法绘制。
3.4 FAKE_BOLD_TEXT_FLAG 绘制标志,其对绘制文本应用合成加粗效果。
3.5 FILTER_BITMAP_FLAG 绘制标志,可在缩放位图上实现双线性采样。
3.6 HINTING_OFF 字体hinter选项禁用字体提示。
3.7 HINTING_ON 字体hinter选项启用字体提示。
3.8 LINEAR_TEXT_FLAG 绘制标志,使文本能够平滑线性缩放。
3.9 STRIKE_THRU_TEXT_FLAG绘制标志,将穿透装饰应用于绘制文本。
3.10
SUBPIXEL_TEXT_FLAG启用该标志会导致以子像素精度计算字形进步。
这可以与LINEAR_TEXT_FLAG一起使用,以防止文本在平滑缩放转换期间抖动。
3.11
UNDERLINE_TEXT_FLAG` 绘制标记,其将下划线装饰应用于绘制文本。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Qt是一个跨平台的C++应用程序开发框架,它提供了丰富的GUI(图形用户界面)和功能组件,其中包括自绘控件。自绘控件是指通过重写绘制函数来实现自定义外观和行为的控件。 在Qt中,自绘控件通常是从QWidget类派生而来的子类。要使用自绘控件,你需要重写QWidget的paintEvent()函数,并在其中进行绘制操作。paintEvent()函数会在控件需要重新绘制时被调用,你可以在该函数中使用Qt提供的绘图工具进行绘制。 以下是使用paintEvent()函数自绘控件的基本步骤: 1. 创建一个继承自QWidget的子类,并重写其paintEvent()函数。 2. 在paintEvent()函数中,创建一个QPainter对象,并使用该对象进行绘制操作。 3. 使用QPainter提供的绘图函数(如drawRect()、drawText()等)来实现你想要的外观效果。 4. 根据需要,可以在其他事件处理函数中添加交互逻辑,例如鼠标点击事件等。 下面是一个简单的示例代码,展示了如何使用paintEvent()函数自绘一个简单的矩形控件: ```cpp #include <QtWidgets> class MyWidget : public QWidget { public: MyWidget(QWidget *parent = nullptr) : QWidget(parent) {} protected: void paintEvent(QPaintEvent *event) override { Q_UNUSED(event); QPainter painter(this); painter.setRenderHint(QPainter::Antialiasing); // 设置抗锯齿 painter.fillRect(rect(), Qt::blue); // 绘制蓝色背景 painter.setPen(Qt::white); // 设置画笔颜色为白色 painter.drawRect(rect().adjusted(10, 10, -10, -10)); // 绘制带边距的矩形 } }; int main(int argc, char *argv[]) { QApplication app(argc, argv); MyWidget widget; widget.resize(200, 200); widget.show(); return app.exec(); } ``` 这个示例中,我们创建了一个名为MyWidget的自定义控件,重写了其paintEvent()函数,在其中使用QPainter对象绘制了一个带有蓝色背景和白色边框的矩形。在main()函数中,我们创建了一个应用程序对象,并显示了这个自定义控件。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值