Android2D绘图二


注意:Android手机的屏幕的上边位x轴,左边为y轴坐上顶点为原点(0,0)

Canvas Sample 及常用函数

常用方法

  • drawARGB / drawRGB / drawColor 使用单一的颜色填充画布。
 canvas.drawColor(Color.BLUE);

  • drawArc 在一个矩形区域的两个角之间绘制一个弧。
// 参数依次为:弧线所使用的矩形区域大小、开始角度、扫过的角度、是否使用中心
canvas.drawArc(rect, 0, 90, false, paint); 

// 参数依次为:弧线所使用的矩形区域大小、开始角度、扫过的角度、是否使用中心
canvas.drawArc(rect, 0, 90, true, paint); 
  • drawBitmap 在画布上绘制一个位图。可以通过指定目标大小或者使用一个矩阵来改变目标位图的外观。

  • drawBitmapMesh 使用一个mesh(网)来绘制一个位图,它可以通过移动网中的点来操作目标的外观。

  • drawCircle 以给定的点为圆心,绘制一个指定半径的圆。
canvas.drawCircle(100, 100, 90, paint);
  • drawLine(s) 在两个点之间画一条(多条)直线。
 canvas.drawLine(10, 10, 100, 100, paint);
闭合区域的绘制
Paint paint=new Paint();
paint.setColor(Color.RED);  //设置画笔颜色
paint.setStyle(Style.STROKE);//填充样式改为描边
paint.setStrokeWidth(5);//设置画笔宽度

Path path = new Path();

path.moveTo(10, 10); //设定起始点
path.lineTo(10, 100);//第一条直线的终点,也是第二条直线的起点
path.lineTo(300, 100);//画第二条直线
path.lineTo(500, 100);//第三条直线
path.close();//闭环

canvas.drawPath(path, paint);

矩形路径

//先创建两个大小一样的路径  
//第一个逆向生成  
Path CCWRectpath = new Path();  
RectF rect1 =  new RectF(50, 50, 240, 200);  
CCWRectpath.addRect(rect1, Direction.CCW);  

//第二个顺向生成  
Path CWRectpath = new Path();  
RectF rect2 =  new RectF(290, 50, 480, 200);  
CWRectpath.addRect(rect2, Direction.CW);  

//先画出这两个路径   
canvas.drawPath(CCWRectpath, paint);  
canvas.drawPath(CWRectpath, paint);  

//依据路径写出文字  
String text="风萧萧兮易水寒,壮士一去兮不复返";  
paint.setColor(Color.GRAY);  
paint.setTextSize(35);  
canvas.drawTextOnPath(text, CCWRectpath, 0, 18, paint);//逆时针生成  
canvas.drawTextOnPath(text, CWRectpath, 0, 18, paint);//顺时针生成
drawOval 以指定的矩形为边界,画一个椭圆。
//定义一个矩形区域
RectF oval =newRectF(0,0,200,300);
//矩形区域内切椭圆
canvas.drawOval(oval, paint);
  • drawPaint 使用指定的Paint填充整个Canvas
  • drawPath 绘制指定的Path。Path对象经常用来保存一个对象中基本图形的集合。
Path path =newPath();//定义一条路径
path.moveTo(10, 10);//移动到 坐标10,10
path.lineTo(50, 60);
path.lineTo(200,80);
path.lineTo(10, 10);
canvas.drawPath(path, paint);
  • drawPicture 在指定的矩形中绘制一个Picture对象。
  • drawPosText 绘制指定了每一个字符的偏移量的文本字符串。
//按照既定点 绘制文本内容   
canvas.drawPosText("Android777",newfloat[]{   
        10,10,//第一个字母在坐标10,10   
        20,20,//第二个字母在坐标20,20   
        30,30,//....   
        40,40,   
        50,50,   
        60,60,   
        70,70,   
        80,80,   
        90,90,   
        100,100   
}, paint);
  • drawRect 绘制一个矩形。
RectF rect =newRectF(50, 50, 200, 200);
canvas.drawRect(rect, paint);  
  • drawRoundRect 绘制一个圆角矩形。
 RectF rect =newRectF(50, 50, 200, 200);
canvas.drawRoundRect(rect,   
                        30,//x轴的半径   
                        30,//y轴的半径   
                        paint);   
  • drawText 在Canvas上绘制一个文本串。文本的字体、大小和渲染属性都设置在用来渲染文本的Paint对象中。如:Paint.setTextSize(Size)
  • drawTextOnPath 在一个指定的path上绘制文本。
    • drawVertices 绘制一系列三角形面片,通过一系列顶点来指定它们。
    • drawPoint
      单个点
    Paint paint=new Paint();  
    paint.setColor(Color.RED);  //设置画笔颜色      
    paint.setStyle(Style.FILL);//设置填充样式   
    paint.setStrokeWidth(15);//设置画笔宽度    
    canvas.drawPoint(100, 100, paint);
Path path =newPath();//定义一条路径
path.moveTo(10, 10);//移动到 坐标10,10
path.lineTo(50, 60);
path.lineTo(200,80);
path.lineTo(10, 10);
canvas.drawTextOnPath("Android777开发者博客", path, 10, 10, paint);  

多个点

void drawPoints (float[] pts, Paint paint)
void drawPoints (float[] pts, int offset, int count, Paint paint)
  • 1
  • 2
Paint paint=new Paint();  
paint.setColor(Color.RED);  //设置画笔颜色      
paint.setStyle(Style.FILL);//设置填充样式   
paint.setStrokeWidth(15);//设置画笔宽度  

float []pts={10,10,100,100,200,200,400,400};  
canvas.drawPoints(pts, 2, 4, paint);

Sample示例:

paint.setAntiAlias(true);
paint.setStyle(Style.STROKE);
canvas.translate(canvas.getWidth()/2, 200);//将位置移动画纸的坐标点:150,150
canvas.drawCircle(0, 0, 100, paint);//画圆圈

//使用path绘制路径文字
canvas.save();
canvas.translate(-75, -75);
Path path =newPath();
path.addArc(newRectF(0,0,150,150), -180, 180);
Paint citePaint =newPaint(paint);
citePaint.setTextSize(14);
citePaint.setStrokeWidth(1);
canvas.drawTextOnPath("http://www.android777.com", path, 28, 0, citePaint);
canvas.restore();

Paint tmpPaint =newPaint(paint);//小刻度画笔对象
tmpPaint.setStrokeWidth(1);

float y=100;
int count = 60;//总刻度数

for(int i=0 ; i <count ; i++){
    if(i%5 == 0){
        canvas.drawLine(0f, y, 0, y+12f, paint);
        canvas.drawText(String.valueOf(i/5+1), -4f, y+25f, tmpPaint);
    }else{
        canvas.drawLine(0f, y, 0f, y +5f, tmpPaint);
    }
    canvas.rotate(360/count,0f,0f);//旋转画纸
}   

    //绘制指针   
    tmpPaint.setColor(Color.GRAY);   
    tmpPaint.setStrokeWidth(4);   
    canvas.drawCircle(0, 0, 7, tmpPaint);   
    tmpPaint.setStyle(Style.FILL);   
    tmpPaint.setColor(Color.YELLOW);   
    canvas.drawCircle(0, 0, 5, tmpPaint);   
    canvas.drawLine(0, 10, 0, -65, paint); 


Canvas 变换

一个Canvas对象有四大基本要素:1、一个用来保存像素的Bitmap2、一个Canvas在Bitmap上进行绘制操作3、绘制的内容4、绘制的画笔PaintCanvas还提供了一系列位置转换的方法:rorate、scale、translate、skew(扭曲)等。这些变换影响的是绘图时相对于承载像素的 bitmap 的相对位置
canvas.drawColor(Color.BLUE);

canvas.save();
Paint paint = new Paint();
paint.setColor(Color.RED);
paint.setStyle(Paint.Style.FILL);
canvas.translate(20, 20);
canvas.drawRect(0, 0, 20, 20, paint);
canvas.restore();

canvas.save();
canvas.translate(60, 0);
canvas.scale(0.5f, 1);
canvas.drawRect(0, 0, 20, 20, paint);
canvas.restore();

canvas.drawRect(0, 0, 20, 20, paint);


Canvas的保存和回滚

为了方便一些转换操作,Canvas还提供了保存和回滚属性的方法(save和restore),比如你可以先保存目前画纸的位置(save),然后旋转90度,向下移动100像素后画一些图形,画完后调用restore方法返回到刚才保存的位置





  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值