// 设置绘制路径的效果,如点画线等
PathEffect setPathEffect(PathEffect effect);
// 设置MaskFilter,可以用不同的MaskFilter实现滤镜的效果,如滤化,立体等
MaskFilter setMaskFilter(MaskFilter maskfilter);
// 设置Typeface对象,即字体风格,包括粗体,斜体以及衬线体,非衬线体等
Typeface setTypeface(Typeface typeface);
// 设置光栅化
Rasterizer setRasterizer(Rasterizer rasterizer);
// 在图形下面设置阴影层,产生阴影效果,radius为阴影的角度,dx和dy为阴影在x轴和y轴上的距离,color为阴影的颜色
// 注意:在Android4.0以上默认开启硬件加速,有些图形的阴影无法显示。关闭View的硬件加速 view.setLayerType(View.LAYER_TYPE_SOFTWARE, null);
void setShadowLayer(float radius, float dx, float dy, int color);
// 设置文本对齐
void setTextAlign(Align align);
// 设置字体大小
void setTextSize(float textSize);
// 设置文本缩放倍数,1.0f为原始
void setTextScaleX(float scaleX);
// 设置斜体文字,skewX为倾斜弧度
void setTextSkewX(float skewX);
复制代码
Paint 高级使用
渲染
1. 绘制图像阴影效果 setShadowLayer
val paint = Paint()
paint.setStyle(Paint.Style.FILL)
paint.setColor(Color.BLACK)
// 设置透明度,要在setColor后面设置才生效
paint.setAlpha(80)
// 如果不关闭硬件加速,setShadowLayer无效
setLayerType(View.LAYER_TYPE_SOFTWARE, null)
// (阴影的半径,X轴方向上相对主体的位移,Y轴相对位移)
paint.setShadowLayer(50f, 10f, 10f, Color.RED)
paint.setTextSize(50f)
// cx和cy为圆点的坐标
val radius = 200
val offest = 40
val startX = width / 2 - radius
val startY = height / 2
canvas.drawText(“画一个圆”, width / 2 - 100f, height / 2f - 300, paint)
canvas.drawCircle(startX.toFloat(), startY.toFloat(), radius.toFloat(), paint)
paint.setStyle(Paint.Style.STROKE)
paint.setStrokeWidth(5f)
paint.setShadowLayer(50f, -20f, 10f, Color.RED)
canvas.drawCircle(startX + radius * 2 + offest.toFloat(), startY.toFloat(), radius.toFloat(), paint)
复制代码
2. 为 Bitmap 设置图形渲染 BitmapShader
class MyGradientView : View {
private var mPaint: Paint? = null
private var mBitMap: Bitmap? = null
private var mWidth: Int = 0
private var mHeight: Int = 0
private val mColors = intArrayOf(Color.RED, Color.GREEN, Color.BLUE, Color.YELLOW)
constructor(context: Context?) : super(context) {
init()
}
constructor(context: Context?, attrs: AttributeSet?) : super(context, attrs) {
init()
}
constructor(context: Context?, attrs: AttributeSet?, defStyleAttr: Int) : super(context, attrs, defStyleAttr)
private fun init() {
mBitMap = (resources.getDrawable(R.mipmap.girl_gaitubao) as BitmapDrawable).bitmap
mPaint = Paint()
mWidth = mBitMap!!.getWidth()
mHeight = mBitMap!!.getHeight()
}
override fun onDraw(canvas: Canvas) {
super.onDraw(canvas)
/**
- TileMode.CLAMP 拉伸最后一个像素去铺满剩下的地方
- TileMode.MIRROR 通过镜像翻转铺满剩下的地方。
- TileMode.REPEAT 重复图片平铺整个画面(电脑设置壁纸)
- 在图片和显示区域大小不符的情况进行扩充渲染
/
/* - 位图渲染,BitmapShader(@NonNull Bitmap bitmap, @NonNull TileMode tileX, @NonNull TileMode tileY)
- Bitmap:构造shader使用的bitmap
- tileX:X轴方向的TileMode
- tileY:Y轴方向的TileMode
*/
val bitMapShader = BitmapShader(
mBitMap!!, Shader.TileMode.MIRROR,
Shader.TileMode.MIRROR
)
//设置图片效果
mPaint!!.setShader(bitMapShader)
//抗锯齿
mPaint!!.setAntiAlias(true)
//绘制圆
canvas.drawCircle(width/2f,height/2f,mHeight.toFloat(),mPaint!!)
}
}
参数的意思我注释很详细,我就不在过多说明了。
3. 线性渲染 LinearGradient
/**线性渲染
- x0, y0, 起始点
- x1, y1, 结束点
- int[] mColors, 中间依次要出现的几个颜色
- float[] positions 位置数组,position的取值范围[0,1],作用是指定几个颜色分别放置在那个位置上,
- 如果传null,渐变就线性变化。
- tile 用于指定控件区域大于指定的渐变区域时,空白区域的颜色填充方法
*/
var linearGradient = LinearGradient(
0f, 0f, 800f, 800f,
mColors, null, Shader.TileMode.CLAMP
)
// var linearGradient = LinearGradient(0f, 0f, 400f, 400f, mColors, null, Shader.TileMode.REPEAT)
mPaint!!.setShader(linearGradient)
canvas.drawRect(0f, 0f, 800f, 800f, mPaint!!)
4. 环形渲染 RadialGradient
/**
*
- 环形渲染
- centerX ,centerY:shader的中心坐标,开始渐变的坐标
- radius:渐变的半径
- centerColor,edgeColor:中心点渐变颜色,边界的渐变颜色
- colors:渐变颜色数组
- stops:渐变位置数组,类似扫描渐变的positions数组,取值[0,1