常用方法

从上面方法的名字看来我们可以知道Canvas可以绘制的对象有:弧线(arcs)、填充颜色(argb和color)、 Bitmap、圆(circle和oval)、点(point)、线(line)、矩形(Rect)、图片(Picture)、圆角矩形 (RoundRect)、文本(text)、顶点(Vertices)、路径(path)
常用操作
1.绘制内容保存到Bitmap
Bitmap b = Bitmap.createBitmap(100, 100, Bitmap.Config.ARGB_8888);
Canvas c = new Canvas(b);
2.Canvas平移
/**
* 画布向(100,50)方向平移
*
* 参数1: 向X轴方向移动100距离
* 参数2: 向Y轴方向移动50距离
*/
canvas.translate(100, 50);
3.Canvas缩放
/**
* 在X轴方向放大为原来2倍,Y轴方向方大为原来的4倍
* 参数1: X轴的放大倍数
* 参数2: Y轴的放大倍数
*/
canvas.scale(2, 4);
/**
* 在X轴方向放大为原来2倍,Y轴方向方大为原来的4倍
* 参数1: X轴的放大倍数
* 参数2: Y轴的放大倍数
* 参数3: 原点X坐标
* 参数4: 原点Y坐标
*/
canvas.scale(2, 4,100,100);
4.Canvas旋转
/**
* 原点为中心,旋转30度(顺时针方向为正方向 )
* 参数: 旋转角度
*/
canvas.rotate(30);
/**
* 以(100,100)为中心,旋转30度,顺时针方向为正方向
* 参数: 旋转角度
*/
canvas.rotate(30,100,100);
5.斜拉
//sx,sy倾斜度:X轴方向上倾斜60度,tan60=根号3
canvas.skew(1.73f, 0);
canvas.drawRect(r, paint);
6.Region区域
Region是绘制中的区域的意思。使用Region可以对图形有很多操作,比如区域的合并,取交集,取抑或等.
要绘制指定的Region需要使用RegionIterator类来绘制,RegionIterator类看名字能看出来,是一个迭代器,它的作用主要是从指定的Region中获取rect,也就是矩形
构造方法:
public Region()
public Region(Region region)
public Region(Rect r)
public Region(int left, int top, int right, int bottom)
SetPath():
boolean setPath (Path path, Region clip)
该方法的作用是将path区域和clip区域取交集
区域操作:
public final boolean union(Rect r)
public boolean op(Rect r, Op op) {
public boolean op(int left, int top, int right, int bottom, Op op)
public boolean op(Region region, Op op)
public boolean op(Rect rect, Region region, Op op)
union主要是取并集,后面的op方法的含义是operation,操作的意思,那么进行何种操作,则由方法中的op参数来决定,Op是一个枚举类,取值如下
DIFFERENCE(0), //取补集
INTERSECT(1), // 交集
UNION(2), //并集
XOR(3), //异并集
REVERSE_DIFFERENCE(4), //反转补集
REPLACE(5); //后者区域替代前者
样例:
mPaint.setStyle(Paint.Style.STROKE);
mPaint.setStrokeWidth(1);
Path path1 = new Path();
Path path2 = new Path();
path1.addCircle(500, 500, 300, Path.Direction.CW);
path2.addCircle(500, 800, 300, Path.Direction.CW);
mPaint.setColor(Color.RED);
canvas.drawPath(path1,mPaint);
canvas.drawPath(path2,mPaint);
Region region = new Region();
Region region2 = new Region();
region.setPath(path1, new Region(0, 0, 1500, 1500));
region2.setPath(path2, new Region(0, 0, 1500, 1500));
region.op(region2, Region.Op.REPLACE);
//绘制
mPaint.setColor(Color.BLUE);
mPaint.setStyle(Paint.Style.FILL);
RegionIterator iterator = new RegionIterator(region);
Rect rect = new Rect();
while (iterator.next(rect)) {
canvas.drawRect(rect, mPaint);
}
7.裁剪画布clip
RectF r = new RectF(200, 200, 400, 500);
canvas.drawRect(r, paint);
paint.setColor(Color.BLUE);
canvas.clipRect(new Rect(250, 250, 300, 400));
canvas.drawColor(Color.YELLOW);
8.Canvas保存和还原
1.当canvas执行drawXXX的时候就会新建一个新的画布图层
2.虽然后面新建了一个画布图层,但是还是会沿用之前设置的平移变换。不可逆的。(save和restore,restoreToCount(int saveCount)来解决)
3.我们在对Canvas进行平移、旋转、放大等操作时候,可以调用save()方法,将当前修改过的Canvas状态进行保存,调用restore() 方法后,会将Canvas还原成最近的一个save() 的状态
canvas.translate(100,100); // 平移(100,100)
int save1 = canvas.save(); // 保存Canvas状态(状态1)
canvas.scale(2, 2); // 放大2倍
int save2 = canvas.save(); // 保存Canvas状态(状态2)
canvas.restore(); // 返回最新的save状态,即状态2
canvas.restoreToCount(save1);// 手动指定的返回到 状态1
网友评论