Canvas中drawxxx方法的使用

一:Canvas.drawxxx()系列方法以及Paint常见使用

1:移动坐标系

canvas.translate(width/2,height/2); //可以将坐标系从左上角移动到指定位置
cavas.scale(1,-1);//反转y坐标轴,反转之后向上为正,向下为负。

2:drawRect(float left, float top, float right, float bottom, Paint paint)

画矩形传入的是左上点和右下点的坐标。drawRect(左上x,左上y,右下x,右下y,paint);

3:drawPoint(float x, float y, Paint paint)

在画点的时候,需要paint.setStrokeWidth();不然点看不到。

(1):画多个点

 float [] pts={30,100,100,100,170,100,240,100,310,100};
private void init() {
    paint=new Paint(Paint.ANTI_ALIAS_FLAG);
    paint.setColor(Color.parseColor("#2bb8ed"));
    paint.setStrokeWidth(50);
    paint.setStrokeCap(Paint.Cap.ROUND);
}

@Override
protected void onDraw(Canvas canvas) {
    super.onDraw(canvas);
    canvas.drawPoints(pts,paint);
//        canvas.drawPoints(pts,2,6,paint);
}

(2):画多个点同时偏移

 float [] pts={30,100,100,100,170,100,240,100,310,100};
    private void init() {
        paint=new Paint(Paint.ANTI_ALIAS_FLAG);
        paint.setColor(Color.parseColor("#2bb8ed"));
        paint.setStrokeWidth(50);
        paint.setStrokeCap(Paint.Cap.ROUND);
    }

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
//        canvas.drawPoints(pts,paint);
        canvas.drawPoints(pts,2,6,paint);
    }

使用的数组还是之前的数组,就是在drawPoints的参数上做了调整。该方法第二个参数表示从第几个数组元素开始绘制,由于数组的元素是两个点构成一个坐标,因此偏移两个位置,即一个点。第三个参数表示一共使用几个数组元素,在本段代码中最后将原始数组进行了截取,相当于使用了下面这个新数组进行绘制。

 float [] pts={100,100,170,100,240,100};

如果我们将参数调整为

canvas.drawPoints(pts,1,7,paint);

将会显示如下,虽然取了7个元素,但是最后一个元素没有配对的y坐标,无法绘制出来。


4:drawOval(float left, float top, float right, float bottom, @NonNull Paint paint);

前两个参数可以认为是椭圆外切矩形的左上点坐标。
接下来的两个参数可以认为是椭圆外切矩形的右下点坐标。

5:画线drawLine(float startX, float startY, float stopX, float stopY,@NonNull Paint paint)

我们通过代码画了三条线,分别设置了不同的Cap,三条线除了颜色不一样和cap不一样之外,其他的都一致。

 private void init() {
    paint=new Paint(Paint.ANTI_ALIAS_FLAG);
    paint.setColor(Color.RED);
    paint.setStrokeWidth(50);
    paint.setStrokeCap(Paint.Cap.BUTT);

    paint1=new Paint(Paint.ANTI_ALIAS_FLAG);
    paint1.setColor(Color.GRAY);
    paint1.setStrokeWidth(50);
    paint1.setStrokeCap(Paint.Cap.ROUND);

    paint2=new Paint(Paint.ANTI_ALIAS_FLAG);
    paint2.setColor(Color.BLUE);
    paint2.setStrokeWidth(50);
    paint2.setStrokeCap(Paint.Cap.SQUARE);
}
@Override
protected void onDraw(Canvas canvas) {
    super.onDraw(canvas);
    canvas.drawLine(30,30,30,630,paint);
    canvas.drawLine(130,30,130,630,paint1);
    canvas.drawLine(230,30,230,630,paint2);
    }

但是从效果图中,我们看到的三条线的长度好像并不一致。从代码中我们知道我们设置的起始点y坐标是30,但是只有第一条线满足了,后面两条线不满足,长度为600,也只有第一条满足了,后面两条未满足。因为cap是指当画笔画完之后,再给任务画一个帽子,这个帽子是多出来的。

和cap类似的还有一个join

public enum Join {  
    /** 
     * The outer edges of a join meet at a sharp angle 
     */  
    MITER   (0),  
    /** 
     * The outer edges of a join meet in a circular arc. 
     */  
    ROUND   (1),  
    /** 
     * The outer edges of a join meet with a straight line 
     */  
    BEVEL   (2);  
      
    private Join(int nativeInt) {  
        this.nativeInt = nativeInt;  
    }  
    final int nativeInt;  
}
图片来自gcsSloop

6:drawRoundRect(float left, float top, float right, float bottom, float rx, float ry, Paint paint)

圆角矩形

7:drawArc(float left, float top, float right, float bottom, float startAngle, float sweepAngle, boolean useCenter, Paint paint)

扇形或者弧形或者弧线。是否填充全在于paint.setStyle(Paint.Style.);

三点钟方向为0度。

顺时针为正方向。

useCenter表示在两边是否用线连接到圆心。如果连接就是弧形,不连接就是扇形。

 private void init() {
    paint=new Paint(Paint.ANTI_ALIAS_FLAG);
    paint.setColor(Color.RED);
    paint.setStrokeWidth(10);
    paint.setStrokeCap(Paint.Cap.BUTT);
    paint.setStyle(Paint.Style.STROKE);

    paint1=new Paint(Paint.ANTI_ALIAS_FLAG);
    paint1.setColor(Color.GRAY);
    paint1.setStrokeWidth(50);
    paint1.setStrokeCap(Paint.Cap.ROUND);

    paint2=new Paint(Paint.ANTI_ALIAS_FLAG);
    paint2.setColor(Color.BLUE);
    paint2.setStrokeWidth(10);
    paint2.setStrokeCap(Paint.Cap.SQUARE);
}
@Override
protected void onDraw(Canvas canvas) {
    super.onDraw(canvas);
    canvas.drawArc(0, 0, 200, 200, 50, 100, false, paint); 
    canvas.drawArc(0, 200, 300, 400, -360, 100, true, paint); 
    canvas.drawArc(0, 500, 400, 700, -150, 100, false, paint1); 
    canvas.drawArc(400, 500, 500, 600, -150, 100, true, paint1); 

    }

8:drawPath

path有两种方法,一类是直接描述路径,一类是辅助设置或计算

(1):addCircle/addOval/addArc/addRect/addRoundRect。

最后一个参数dir表示方向,有两个选项,一个是cr顺时针,一个是ccr逆时针。

lineTo/rLineTo 前者是绝对坐标。后者是相对坐标。都是画直线。
使用path画粗线的时候,比如直方图的粗线,一定要把style设置为stroke。

画线的方向就是方向。

quadTo/rQuadTo 画二次贝塞尔曲线。


二阶贝塞尔曲线图片来自网络

cubicTo/rCubicTo 画三次贝塞尔曲线


三阶贝塞尔曲线图片来自网络
四阶贝塞尔曲线图片来自网络
五阶贝塞尔曲线图片来自网络

moveTo/rMoveTo 移动到目标位置开始画起点

moveTo :移动到下一次操作的起点位置
setLastPoint 设置之前操作的最后一个点位置。这会取消之前的终点位置。如图所示:

图片来自gcsSloop

那么在3d旋转的时候,能不能通过setLastPoint来旋转一个点达到效果呢?
重点
arcTo 只画弧形不画扇形。forceMoveTo参数表示是否留下画笔的移动痕迹。

addArc()表示forceMoveTo=true的简化版arcTo。

close()封闭当前图形。终点到起点的连线。当画笔为fill的时候,会自动封闭。

在画心形的时候,不要抬笔,也就是不要将forceMoveTo设置为true,因为true就以为着是一个新的If true, always begin a new contour with the arc。那么在封闭的时候,只能封闭当前的contour,而不能封闭之前的contour了。

 path.arcTo(200,100,400,300,150, 210,false);
 path.arcTo(400,100,600,300,180, 210,false);
 path.lineTo(400, 442);

(2):辅助设置或计算 Path.setFillType(Path.FillType ft)


图片来自hencoder

参考:
gcsSloop的博客
Hencoder的博客

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 200,612评论 5 471
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,345评论 2 377
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 147,625评论 0 332
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,022评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,974评论 5 360
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,227评论 1 277
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,688评论 3 392
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,358评论 0 255
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,490评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,402评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,446评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,126评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,721评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,802评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,013评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,504评论 2 346
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,080评论 2 341

推荐阅读更多精彩内容