Android图像绘制相关


链接: HenCoder Android 绘制介绍.

Canvas的draw方法及paint常见使用

Canvas

方法含义举例
drawColor颜色填充,在整个绘制区域统一涂上指定的颜色drawColor(Color.BLACK);
drawCircle画圆canvas.drawCircle(300, 300, 200, paint);
drawRect画矩形
drawPoint画点
drawPoints可以画多个点
drawOval画椭圆
drawLine画线
drawLines画线(批量)
drawRoundRect画圆角矩形
drawArc绘制弧形或扇形
drawPath画自定义图形
drawBitmap绘制 Bitmap 对象
drawText绘制文字

Paint

方法含义
setStyle设置绘制模式。FILL 是填充模式,STROKE 是画线模式(即勾边模式),FILL_AND_STROKE 是两种模式一并使用:既画线又填充。
setColor设置颜色
setStrokeCap端点有圆头(ROUND)、平头 (BUTT) 和方头 (SQUARE) 三种
setStrokeWidth设置线条宽度
setTextSize设置文字大小
setAntiAlias设置抗锯齿开关

Paint详情

1 颜色

1.1 基本颜色

1.1.1 直接设置颜色
setColor(int color)
setARGB(int a, int r, int g, int b)
1.1.2 setShader(Shader shader) 设置 Shader
LinearGradient 线性渐变
RadialGradient 辐射渐变
SweepGradient 扫描渐变
BitmapShader
ComposeShader 混合着色器

1.2 setColorFilter(ColorFilter colorFilter)

  为绘制设置颜色过滤。

  它共有三个子类:LightingColorFilter PorterDuffColorFilter 和 ColorMatrixColorFilter。

意义
LightingColorFilterLightingColorFilter(int mul, int add) ,参数里的 mul 和 add 都是和颜色值格式相同的 int 值,其中 mul 用来和目标像素相乘,add 用来和目标像素相加:
PorterDuffColorFilter这个 PorterDuffColorFilter 的作用是使用一个指定的颜色和一种指定的 PorterDuff.Mode 来与绘制对象进行合成。
ColorMatrixColorFilterColorMatrixColorFilter 使用一个 ColorMatrix 来对颜色进行处理。 ColorMatrix 这个类,内部是一个 4x5 的矩阵

1.3 setXfermode(Xfermode xfermode)

  严谨地讲, Xfermode 指的是你要绘制的内容和 Canvas 的目标位置的内容应该怎样结合计算出最终的颜色。
  但通俗地说,其实就是要你以绘制的内容作为源图像,以 View 中已有的内容作为目标图像,选取一个 PorterDuff.Mode 作为绘制内容的颜色处理方案。

2 效果

2.1 setAntiAlias (boolean aa) 设置抗锯齿

2.2 setStyle(Paint.Style style)

2.3 线条形状

  设置线条形状的一共有4 个方法:setStrokeWidth(float width),setStrokeCap(Paint.Cap cap), setStrokeJoin(Paint.Join join), setStrokeMiter(float miter)

方法意义
setStrokeWidth(float width)设置线条宽度。单位为像素,默认值是0。
setStrokeCap(Paint.Cap cap)设置线头的形状。线头形状有三种:BUTT 平头、ROUND 圆头、SQUARE 方头。默认为 BUTT。
setStrokeJoin(Paint.Join join)设置拐角的形状。有三个值可以选择:MITER 尖角、 BEVEL 平角和 ROUND 圆角。默认为 MITER。
setStrokeMiter(float miter)这个方法是对于 setStrokeJoin() 的一个补充,它用于设置 MITER 型拐角的延长线的最大值。所谓「延长线的最大值」:当线条拐角为 MITER 时,拐角处的外缘需要使用延长线来补偿:

2.4 色彩优化

  Paint 的色彩优化有两个方法: setDither(boolean dither) 和 setFilterBitmap(boolean filter) 。它们的作用都是让画面颜色变得更加「顺眼」,但原理和使用场景是不同的。
2.4.1 setDither(boolean dither)
  设置图像的抖动。设置抖动来优化色彩深度降低时的绘制效果
2.4.2 setFilterBitmap(boolean filter)
  设置是否使用双线性过滤来绘制 Bitmap 。设置双线性过滤来优化 Bitmap 放大绘制的效果。

2.5 setPathEffect(PathEffect effect)

  使用 PathEffect 来给图形的轮廓设置效果。对 Canvas 所有的图形绘制有效,也就是 drawLine() drawCircle() drawPath() 这些方法。
  PathEffect 分为两类,单一效果的 CornerPathEffect DiscretePathEffect DashPathEffect PathDashPathEffect ,和组合效果的 SumPathEffect ComposePathEffect。

意义
CornerPathEffect把所有拐角变成圆角
DiscretePathEffect把线条进行随机的偏离,让轮廓变得乱七八糟
DashPathEffect使用虚线来绘制线条。
PathDashPathEffect它是使用一个 Path 来绘制「虚线」。
SumPathEffect这是一个组合效果类的 PathEffect 。它的行为特别简单,就是分别按照两种 PathEffect 分别对目标进行绘制。

2.6 setShadowLayer(float radius, float dx, float dy, int shadowColor)

  在之后的绘制内容下面加一层阴影。

2.7 setMaskFilter(MaskFilter maskfilter)

  设置的是在绘制层上方的附加效果。

意义
BlurMaskFilter模糊效果的 MaskFilter。
EmbossMaskFilter浮雕效果的 MaskFilter。

2.8 获取绘制的 Path

2.8.1 getFillPath(Path src, Path dst)
2.8.2 getTextPath(String text, int start, int end, float x, float y, Path path) / getTextPath(char[] text, int index, int count, float x, float y, Path path)

3 drawText() 相关

3.1 Canvas 绘制文字

方法意义举例
drawText(String text, float x, float y, Paint paint)drawText() 是 Canvas 最基本的绘制文字的方法:给出文字的内容和位置, Canvas 按要求去绘制文字
drawTextRun()
drawTextOnPath()沿着一条 Path 来绘制文字
StaticLayoutStaticLayout 支持换行,它既可以为文字设置宽度上限来让文字自动换行,也会在 \n 处主动换行。

3.2 Paint 对文字绘制的辅助

3.2.1 设置显示效果类

方法意义
setTextSize(float textSize)设置文字大小。
setTypeface(Typeface typeface)设置字体。
setFakeBoldText(boolean fakeBoldText)是否使用伪粗体。
setStrikeThruText(boolean strikeThruText)是否加删除线。
setUnderlineText(boolean underlineText)是否加下划线。
setTextSkewX(float skewX)设置文字横向错切角度。其实就是文字倾斜度。
setTextScaleX(float scaleX)设置文字横向放缩。也就是文字变胖变瘦。
setLetterSpacing(float letterSpacing)设置字符间距。默认值是0。
setFontFeatureSettings(String settings)用CSS 的 font-feature-settings 的方式来设置文字。
setTextAlign(Paint.Align align)设置文字的对齐方式。一共有三个值:LEFT CETNER 和 RIGHT。默认值为 LEFT。
setTextLocale(Locale locale) / setTextLocales(LocaleList locales)设置绘制所使用的 Locale。
setHinting(int mode)设置是否启用字体的hinting (字体微调)。
setElegantTextHeight(boolean elegant)设置是否开启文字的elegant height 。开启之后,文字的高度就变了。
setSubpixelText(boolean subpixelText)是否开启次像素级的抗锯齿(sub-pixel anti-aliasing )。

3.2.2 测量文字尺寸类

方法意义
float getFontSpacing()获取推荐的行距。即推荐的两行文字的baseline 的距离。
FontMetircs getFontMetrics()获取 Paint 的 FontMetrics。
getTextBounds(String text, int start, int end, Rect bounds)获取文字的显示范围。参数里,text 是要测量的文字,start 和 end 分别是文字的起始和结束位置,bounds 是存储文字显示范围的对象。方法在测算完成之后会把结果写bounds。
float measureText(String text)测量文字的宽度并返回。
getTextWidths(String text, float[] widths)获取字符串中每个字符的宽度,并把结果填入参数 widths。
int breakText(String text, boolean measureForwards, float maxWidth, float[] measuredWidth)这个方法也是用来测量文字宽度的。但和 measureText() 的区别是, breakText() 是在给出宽度上限的前提下测量文字的宽度。如果文字的宽度超出了上限,那么在临近超限的位置截断文字。

4 初始化类

4.1 reset()

  重置 Paint 的所有属性为默认值。相当于重新 new 一个,不过性能当然高一些啦。

4.2 set(Paint src)

  把 src 的所有属性全部复制过来。相当于调用 src 所有的 get 方法,然后调用这个 Paint 的对应的 set 方法来设置它们。

4.3 setFlags(int flags)

  批量设置flags。相当于依次调用它们的 set 方法。

Cancas——范围裁剪和几何变换

1 范围裁剪

方法意义
clipRect()范围裁切
clipPath()范围裁切

2 几何变换

2.1 canvas常见的二维变换

方法意义
translate平移
rotate旋转
scale放缩
skew错切

2.2 matrix的二维变换

2.2.1 使用 Matrix 来做常见变换
  Matrix 做常见变换的方式:
1.创建 Matrix 对象;
2.调用 Matrix 的 pre/postTranslate/Rotate/Scale/Skew() 方法来设置几何变换;
3.使用 Canvas.setMatrix(matrix) 或 Canvas.concat(matrix) 来把几何变换应用到 Canvas。

2.2.2 使用 Matrix 来做自定义变换
  Matrix 的自定义变换使用的是 setPolyToPoly() 方法。

2.3 camera的三维变换

2.3.1 Camera.rotate*() 三维旋转
  Camera 和 Canvas 一样也需要保存和恢复状态才能正常绘制。
  如果你需要图形左右对称,需要配合上 Canvas.translate(),在三维旋转之前把绘制内容的中心点移动到原点,即旋转的轴心,然后在三维旋转后再把投影移动回来。

2.3.2 Camera.translate(float x, float y, float z) 移动
  它的使用方式和 Camera.rotate*() 相同,而且我在项目中没有用过它,所以就不贴代码和效果图了。

2.3.3 Camera.setLocation(x, y, z) 设置虚拟相机的位置

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值