Paint 画笔
//禁用硬件加速
setLayerType(LAYER_TYPE_SOFTWARE,null);
paint = new Paint();
//设置颜色
paint.setColor(Color.RED);
// 设置填充样式 STROKE 描边 FILL 填充 FILL_AND_STROKE 填充和描边
paint.setStyle(Paint.Style.FILL_AND_STROKE);
//设置画笔的宽度
paint.setStrokeWidth(50);
//设置抗锯齿
paint.setAntiAlias(true);
//设置透明度 0 -255
paint.setAlpha(12);
//设置路径样式 圆形拐角 虚线 离散 印章 合并
paint.setPathEffect(new CornerPathEffect(4));
//笔帽样式 BUTT 无笔帽 ROUND圆形 SQUARE 方形
paint.setStrokeCap(Paint.Cap.SQUARE);
//设置路径的转角样式BEVEL 直线 MITER 锐角 ROUND圆弧
paint.setStrokeJoin(Paint.Join.ROUND);
//设置绘制图像时的抗抖动效果 两个颜色的过度色
paint.setDither(true);
//字体相关
//设置文字的大小
paint.setTextSize(25);
//设置字体是否为粗体
paint.setFakeBoldText(true);
//设置字体是否为删除线
paint.setStrikeThruText(true);
//设置字体是否为下划线
paint.setUnderlineText(true);
//设置文字的对齐方式LEFT RIGHT CENTER
paint.setTextAlign(Paint.Align.CENTER);
//水平拉伸
paint.setTextScaleX(1);
//设置字体样式
paint.setTypeface(Typeface.defaultFromStyle(Typeface.BOLD));
//设置是否打开线性文本标识
paint.setLinearText(true);
//设置阴影
//radius 模糊半径 dx 正值向右偏移 负值向左偏移
//dy 阴影纵向偏移 正值向下偏移 负值向上偏移
//shadowColor 阴影的颜色 对图片阴影无效
paint.setShadowLayer(float radius, float dx, float dy, int shadowColor)
//清除阴影
paint.clearShadowLayer();
//发光效果
//BlurMaskFilter
//radius 模糊半径
//INNER 内发光 SOLID外发光 NORMAL内外发光 OUTER仅显示发光效果
BlurMaskFilter filter = new BlurMaskFilter(50, BlurMaskFilter.Blur.OUTER);
paint.setMaskFilter(filter);
//获取文字的高度
int baseLineY = 10;
Paint.FontMetricsInt fm = paint.getFontMetricsInt();
int top = baseLineY + fm.top;
int bottom = baseLineY + fm.bottom;
int height = bottom - top;
//获取文字的宽度
float widthTxt = paint.measureText("hi");
Path
二阶贝塞尔曲线
请百度搜索 公式 已经效果
//(x1,y1) 是控制点坐标 (x2,y2) 是终点坐标
//起点 是 path.moveTo(x0,y0)
public void quadTo(float x1, float y1, float x2, float y2)
//有点类似相对的意思
// 例如 第一个坐标为 300,400 rQuadTo(100, -100, 200, 100)
//控制点坐标 300+100,400 -100
//终点坐标 300+200,400+100
public void rQuadTo(float dx1, float dy1, float dx2, float dy2)
Shader 着色器
BitmapShader
//有点类似ps中的印章工具
//bitmap 用来指定的图片
//tileX CLAMP 用于边缘色彩填充多余的空间
//REPEAT 重复原来的图填充多余空间
//MIRROR 重复使用镜像图来填充多余空间
public BitmapShader(Bitmap bitmap, TileMode tileX, TileMode tileY)
LinearGradient
//(x0,y0) 渐变的起始点
//(x1,y1) 渐变的结束点
//color0 渐变的起始色
//color1 渐变的结束色
//tile 与BitmapShader 一样
public LinearGradient(float x0, float y0, float x1, float y1,
int color0, int color1,
TileMode tile)
RadialGradient
//反射渐变
//centerX,centerY 渐变的中心点
//radius 半径
//centerColor 渐变的起始颜色
//edgeColor 渐变的结束颜色
//tile 与BitmapShader 一样
public RadialGradient(float centerX, float centerY, float radius,
int centerColor, int edgeColor, TileMode tileMode)
混合模式 PorterDuffXfermode
Xfermode 它能将两张图片无缝结合 请参考ps
//目标图像 DST
//源图像 SRC
// Xfermode 在使用时为了保险期间需要做两件事
setLayerType(View.LAYER_TYPE_SOFTWARE,null);
//新建图层
int layerId = canvas.saveLayer(0,0,getWidth(),getHeight(),null,Canvas.ALL_SAVE_FLAG);
//核心代码
Bitmap dstBmp = null;
Bitmap srcBmp = null;
canvas.drawBitmap(dstBmp,0,0,null);
paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN));
canvas.drawBitmap(srcBmp,100,100,null);
paint.setXfermode(null);
//还原图层
canvas.restoreToCount(layerId);
//颜色叠加相关模式
//PorterDuff.Mode.SRC_IN
//PorterDuff.Mode.ADD 饱和度相加
//PorterDuff.Mode.LIGHTEN 变亮
//PorterDuff.Mode.DARKEN 变暗
//PorterDuff.Mode.MULTIPLY 正片叠底
//PorterDuff.Mode.OVERLAY 叠加
//PorterDuff.Mode.SCREEN 滤色
AvoidXfermode
//Xfermode PorterDuffXfermode
public Xfermode setXfermode(Xfermode xfermode)
// Xfermode 在使用时为了保险期间需要做两件事
setLayerType(View.LAYER_TYPE_SOFTWARE,null);
//新建图层
int layerId = canvas.saveLayer(0,0,getWidth(),getHeight(),null,Canvas.ALL_SAVE_FLAG);
//核心代码
//还原图层
canvas.restoreToCount(layerId);
Canvas 图层
获取Canvas 的方法
第一种方式:
View 重写 onDraw()
ViewGroup 重写 dispatchDraw()
无论是view 还是viewGroup 绘制顺序都是 onDraw->dispatchDraw
第二种方式:
Canvas canvas = new Canvas(bitmap)
第三中方式
SurfaceHolder.lockCanvas()
创建图层
参考 ps中的图层概念 一样的道理
canvas.save();
public int saveLayer(float left, float top, float right, float bottom, Paint paint,
int saveFlags)
public int saveLayerAlpha( RectF bounds, int alpha, int saveFlags)
画布
ShapeDrawable
//ArcShape 扇行
//OvalShadow 椭圆形
//PathShape 路径
//RoundRectShape 圆角矩形
//RectShape 矩形
public ShapeDrawable(Shape s)
//使用例子
ShapeDrawable shapeDrawable = new ShapeDrawable(new RectShape());
shapeDrawable.setBounds(new Rect(50,50,200,100));
shapeDrawable.getPaint().setColor(Color.YELLOW);
shapeDrawable.draw(canvas);
//常用函数
setBounds //指定当前ShapeDrawable 在当前控件的显示位置
getPaint // 获取ShapeDrawable 画笔
setAlpha //透明度 0-255
setColorFilter //颜色过滤
setIntrinsicWidth //设置默认宽度 默认为 -1px
setPadding // 设置内边距
自定义Drawable
自定义类要继承Drawable
public class CustomDrawable extends Drawable {
@Override
public void draw( Canvas canvas) {
}
@Override
public void setAlpha(int alpha) {
}
@Override
public void setColorFilter(int color, PorterDuff.Mode mode) {
super.setColorFilter(color, mode);
}
@Override
public void setColorFilter( ColorFilter colorFilter) {
}
@Override
public int getOpacity() {
//PixelFormat.UNKNOWN 未知的
//PixelFormat.TRANSLUCENT 半透明
//PixelFormat.TRANSPARENT 透明
//PixelFormat.OPAQUE 不透明
return PixelFormat.OPAQUE;
}
}
圆角Drawable
public class CustomDrawable extends Drawable {
private BitmapShader bitmapShader;
private RectF mBound;
private Bitmap mBitmap;
private Paint mPaint;
public CustomDrawable(Bitmap bitmap){
mBitmap = bitmap;
mPaint = new Paint();
mPaint.setAntiAlias(true);
}
@Override
public void draw( Canvas canvas) {
canvas.drawRoundRect(mBound,20,20,mPaint);
}
@Override
public void setAlpha(int alpha) {
mPaint.setAlpha(alpha);
}
@Override
public void setColorFilter( ColorFilter colorFilter) {
mPaint.setColorFilter(colorFilter);
}
@Override
public int getOpacity() {
return PixelFormat.TRANSLUCENT;
}
@Override
public void setBounds(int left, int top, int right, int bottom) {
super.setBounds(left, top, right, bottom);
Bitmap bitmap = Bitmap.createScaledBitmap(mBitmap,right-left,bottom-top,true);
bitmapShader = new BitmapShader(bitmap, Shader.TileMode.CLAMP, Shader.TileMode.CLAMP);
mPaint.setShader(bitmapShader);
mBound = new RectF(left,top,right,bottom);
}
@Override
public int getIntrinsicWidth() {
return mBitmap.getWidth();
}
@Override
public int getIntrinsicHeight() {
return mBitmap.getHeight();
}
}
自定义Drawable 类似与view 没有交互功能