关于canvas、paint的相关方法汇总

本篇介绍一些自定义里面的一些方法,对于健忘的我来说,只是一个自学笔记。

关于canvas、paint的相关方法汇总

paint 相关方法

paint.setColor();
paint.setAntiAlias (boolean aa) 设置抗锯齿
paint.setStyle(Paint.Style style)//FILL、STROKE、FILL_AND_STROKE
paint.setStrokeWidth(float width)
paint.setStrokeCap(Paint.Cap cap)//线头形状,BUTT 平头、ROUND 圆头、SQUARE 方头
paint.setStrokeJoin(Paint.Join join)//设置拐角,MITER 尖角、 BEVEL 平角和 ROUND 圆角
paint.setStrokeMiter(float miter)//setStrokeJoin() 的一个补充,它用于设置 MITER 型拐角的延长线的最大值

paint.setDither(boolean dither)//设置图像的抖动
paint.setFilterBitmap(boolean filter)//是否使用双线性过滤来绘制 Bitmap,放大绘制的时候需要

/*
 * PathEffect 分为两类,6种,
 * 单一效果的 CornerPathEffect DiscretePathEffect DashPathEffect PathDashPathEffect ,
 * 和组合效果的 SumPathEffect ComposePathEffect。  
 */
paint.setPathEffect(PathEffect effect)

paint.setShadowLayer(float radius, float dx, float dy, int shadowColor)//绘制内容下面加一层阴影

/*
 * 设置的是在绘制层上方的附加效果。MaskFilter 有两种: BlurMaskFilter(模糊效果) 和 EmbossMaskFilter(浮雕效果)。
 */
paint.setMaskFilter(MaskFilter maskfilter)//


/*
 *
 * 一般用shader的子类,注意:在设置了 Shader 的情况下, Paint.setColor/ARGB() 所
 * 设置的颜色就不再起作用。 比如:
 * LinearGradient\RadialGradient\SweepGradient 渐变相关,TileMode 一共有 3 个值可选: CLAMP, MIRROR 和 REPEAT
 * BitmapShader 用bitmap填充
 * ComposeShader 混合  mode:PorterDuff.Mode,PorterDuff.Mode.DST_IN等
 */
paint.setShader(Shader shader);

/*
 * 绘制设置颜色过滤,一般用ColorFilter的子类。比如:
 * LightingColorFilter、PorterDuffColorFilter、ColorMatrixColorFilter
 */
paint.setColorFilter(ColorFilter colorFilter);

/*
 * 
 * 
 */
paint.setXfermode(Xfermode xfermode)

paint.reset();// 重置 Paint 的所有属性为默认值。相当于重新 new 一个,性能高

paint.set(Paint src)//复制所有属性

paint.setFlags(int flags)//批量设置 flags

canvas 相关方法

canvas.drawColor/drawARGB/RGB();
canvas.drawARGB();

canvas.drawText();

canvas.drawTextOnPath()
//=======================================================================//
// paint 几种设置text的辅助方法
paint.setTypeface(Typeface typeface)//字体
paint.setFakeBoldText(boolean fakeBoldText)//加粗
paint.setStrikeThruText(boolean strikeThruText); //是否加删除线
paint.setUnderlineText(boolean underlineText)//是否加下划线
paint.setTextSkewX(float skewX)//文字倾斜度
paint.setTextScaleX(float scaleX)//文字变胖变瘦
paint.setLetterSpacing(float letterSpacing)//字符间距。默认值是 0
paint.setFontFeatureSettings(String settings)//用 CSS 的 font-feature-settings 的方式来设置文字
paint.setTextAlign(Paint.Align align)//文字的对齐方式
paint.setTextLocale(Locale locale) / setTextLocales(LocaleList locales)//绘制所使用的 Locale,简体Locale.CHINA、繁体Locale.TAIWAN
paint.setHinting(int mode)//字体微调
paint.getTextBounds(String text, int start, int end, Rect bounds)//获取文字的显示范围
floatfloat textWidth = paint.measureText(String text)
paint.getTextWidths(String text, float[] widths)//获取字符串中每个字符的宽度,并把结果填入参数 widths
paint.hasGlyph(String string)//检查指定的字符串中是否是一个单独的字形 
//=======================================================================//

canvas.clipRect()//范围裁切
canvas.clipPath()//范围裁切
//几何变化
canvas.translate(float dx, float dy) //平移
canvas.rotate(float degrees, float px, float py) //旋转
canvas.scale(float sx, float sy, float px, float py) //放缩
canvas.skew(float sx, float sy) //错切

/*
 * 使用 Matrix 来做变换
 * 1、创建 Matrix 对象:Matrix matrix = new Matrix();
 * 2、调用 Matrix 的 pre/postTranslate/Rotate/Scale/Skew() 方法来设置几何变换;
 *    matrix.postTranslate();
 * 3、使用 Canvas.setMatrix(matrix) 或 Canvas.concat(matrix) 来把几何变换应用到 Canvas。
 *    canvas.concat(matrix);
 */
Matrix matrix = new Matrix();
...
matrix.reset();  
matrix.postTranslate();  
matrix.postRotate();

canvas.save();  
canvas.concat(matrix);  //尽量用
canvas.drawBitmap(bitmap, x, y, paint);  
canvas.restore();

/*
 * 自定义多点变换setPolyToPoly
 */
Matrix matrix = new Matrix();  
float pointsSrc = {left, top, right, top, left, bottom, right, bottom};  
float pointsDst = {left - 10, top + 50, right + 120, top - 90, left + 20, bottom + 30, right + 20, bottom + 60};

...

matrix.reset();  
matrix.setPolyToPoly(pointsSrc, 0, pointsDst, 0, 4);

canvas.save();  
canvas.concat(matrix);  
canvas.drawBitmap(bitmap, x, y, paint);  
canvas.restore();

扩展:

1、关于PorterDuff.Mode的相关介绍 官方文档

2、使用drawText的时候,文字过多,越界的文字是不会绘制出来,也不会自动换行,因此,要用到StaticLayout。

StaticLayout staticLayout = new StaticLayout(CharSequence source, TextPaint paint, int width, Layout.Alignment align, float spacingmult, float spacingadd, boolean includepad);
canvas.save();
canvas.translate(50, 100);
staticLayout.draw(canvas);

3、在使用canvas进行几何变换的时候,避免影响其他view,会先使用

canvas.save();
...
canvas.restore();

4、自定义View里,除了onDraw方法外,有些情况下,还有其他的方法也可以进行绘制,例如。。。,他们的执行顺序以及相关关系为:
执行顺序:
执行顺序
相关关系:
相关关系
4.1:在 ViewGroup 的子类中重写除 dispatchDraw() 以外的绘制方法时,可能需要调用 setWillNotDraw(false);
4.2:在重写的方法有多个选择时,优先选择 onDraw(),性能更佳。
5、想起来在修改吧

参考:凯哥哥

猜你喜欢

转载自blog.csdn.net/justiceofheaven/article/details/77720425
今日推荐