drawroundrect java_View绘制流程之Canvas(一)

知识点

要知道如何绘制一个View,那么我们必须知道一些关于绘制的相关知识:Canvas,Paint,Bitmap。

有一个恰当的比喻:Canvas就是一块画板,你可以在上面作画(可以没有画纸);Paint就是艺术家手里的画笔,必不可少;Bitmap:就是一张画纸,用于将成果展示给众人看。

Canvas

Canvas负责进行绘制各种各样的图形,它有一些绘制图形方法:

drawArc 绘制弧

drawBitmap 绘制位图

drawCircle 绘制圆形

drawLine 绘制线

drawOval 绘制椭圆

drawPath 绘制路径

drawPoint 绘制一个点

drawPoints 绘制多个点

drawRect 绘制矩形

drawRoundRect 绘制圆角矩形

drawText 绘制字符串

drawTextOnPath 沿着路径绘制字符串

重点api:

类似clipRect的方法,在当前的画图区域裁剪(clip)出一个新的画图区域,这个画图区域就是canvas对象的当前画图区域了。那么clipRect()方法就是裁剪出一块矩形区域,得到的矩形区域就是当前绘图的区域。

save()方法:保存当前绘图成果,剪辑到一个私有栈,保存下来。

restore()方法:用于撤销距最近一次调用save()后对该canvas对象的所有操作。也就是复原最近一次save()的状态。

translate()方法:移动当前的绘图区域至指定的(x, y)处。

rotate()方法:旋转当前绘图区域一定角度。

Paint

Paint主要负责设置绘图的风格,包括画笔的颜色,粗细,填充风格等,它的方法有:

setARGB/setColor 设置颜色

setAlpha 设置透明度

setAntiAlias 设置是否抗锯齿

setShader 设置画笔的填充效果

setShadowLayer 设置阴影

setStyle 设置画笔风格

setStrokeWidth 设置空心边框的宽度

setTextSize 设置绘制文本时文字的大小

Bitmap和Canvas的关系

在Canvas文档中有一句话:

想画一些东西的时候,你需要4个基本的组件,一个Bitmap来存储像素,一个Canvas来接收draw的调用(draw的结果是将像素给画到前面所讲的Bitmap中),

一个源,即是你想画的东西(比如矩形,路径,文本,抑或另一个位图),最后就是一个画笔(描述想画的颜色和风格等)

屏幕上的图像都是由一个个像素组成,而这些像素存储在Bitmap中。就好比我们现实生活中,在脑海中构思图像,但是不用纸,笔画下来怎么展示别人看呢。因此我们在用canvas类中的drawXXX方法绘制出来的图像最终展示都是像素,而存储像素唯一介质就是Bitmap,而canvas做不到。

实践中遇到的问题

getColor(int id)已经被废弃

在API 23中,这个方法已经被废弃了,取而代之的是getColor(int id, Theme theme)。解决方案:调用ContextCompat.getColor(Context, id)方法来获取颜色资源。此方法的源码中:

public static final int getColor(Context context, int id) {

final int version = Build.VERSION.SDK_INT;

if (version >= 23) {

return ContextCompatApi23.getColor(context, id);

} else {

return context.getResources().getColor(id);

}

}

可以看到首先进行一个Android版本的检查,根据不同的版本调用不同的方法。

版本高于23包含23时:

// ContextCompatApi23.java

public static int getColor(Context context, int id) {

return context.getColor(id);

}

//context.getColor(id)源码--Context.java

public final int getColor(int id) {

// 注:这里调用了Resource.java类中的getColor(int id, Theme theme)方法

return getResources().getColor(id, getTheme());

}

23以下的版本,调用了废弃的方法:

public int getColor(@ColorRes int id) throws NotFoundException {

return getColor(id, null);

}

getColor()时Resource.java中的方法。

ContextCompat,一个助手,以向后兼容的方式访问context在API 4以后引入的功能.(v4支持包内的)

canvas.drawRoundRect(l, t, r, b, x, y, paint)方法要求API 21以上

解决方法,调用另一个drawRoundRect()重载方法,涉及到源的理解,就是你想画的东西(RectF)。

代码效果:

8f8eeed279a7?from=timeline

TestCanvas

参考

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java中的Canvas绘图源码实例,主要是画线条、弧线、圆角矩形、三角形、文字、圆形等简单的几何图形,主要是通过创建DrawingCanvas对象canvas,为canvas设置命令监听者,实现接口CommandListener的方法,把缓冲区图像的内容绘制到画布上,画图部分代码:   int w = getWidth(); // 画布的宽度   int h = getHeight(); // 画布的高度   Image buffer = Image.createImage(w, h); // 用于绘图的缓冲图像   Graphics gc = buffer.getGraphics(); // 获取缓冲图像的图形环境   // 清除画布   public void clearScreen() {    gc.setColor(255,255,255); // 设置绘图颜色为白色    gc.fillRect(0,0,w,h); // 把缓冲图像填充为白色    gc.setColor(255,0,0); // 设置绘图颜色为红色   }   // 绘制直线   public void drawLine() {    setTitle("直线"); // 设置画布的标题    clearScreen(); // 清除画布    gc.drawLine(10,10,w-20,h-20); // 绘制黑色直线    gc.setColor(0,0,255); // 设置绘图颜色为蓝色    gc.drawLine(10,h/2,w-10,h/2); // 绘制蓝色直线   }   // 绘制弧   public void drawArc() {    setTitle("弧线和填充弧");    clearScreen();    gc.drawArc(5,5,w/2-20,h/2-20,60,216); // 绘制弧线    gc.drawArc(5,h/2-10,w/2-20,h/2-20,0,360); // 绘制圆    gc.setColor(0,0,255);    gc.fillArc(w/2,5,w/2-20,h/2-20,60,216); // 绘制填充弧线    gc.fillArc(w/2,h/2-10,w/2-20,h/2-20,0,360); // 绘制填充圆   }   // 绘制矩形   public void drawRect() {    setTitle("矩形和填充矩形");    clearScreen();    gc.drawRect(25,25,w/2-30,h/2-30); // 绘制矩形    gc.fillRect(w/2 25,25,w/2-30,h/2-30); // 绘制填充矩形   }   // 绘制圆角矩形   public void drawRoundRect() {    setTitle("圆角矩形和填充圆角矩形");    clearScreen();    gc.drawRoundRect(5,5,w-5-30,h/2-30,20,20); // 绘制圆角矩形    gc.setColor(0,0,255);    gc.fillRoundRect(5,h/2,w-30,h/2-30,20,20); // 绘制填充圆角矩形   }   // 绘制三角形   public void drawTriangle() {    setTitle("填充三角形");    clearScreen();    gc.fillTriangle(w/2, h/6, w/6, h/2, w/2, h/2);   }   // 绘制文字   public void drawText() {    setTitle("文字"); //设置标题    clearScreen();    gc.setFont(Font.getFont(Font.FACE_SYSTEM,Font.STYLE_BOLD,Font.SIZE_SMALL)); // 设置字体    gc.drawString("Hello World!",0,0,gc.TOP|gc.LEFT); // 使用当前字体绘制文字    gc.setFont(Font.getFont(Font.FACE_SYSTEM,Font.STYLE_BOLD|Font.STYLE_UNDERLINED,Font.SIZE_LARGE));    gc.drawString("Hello

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值