在前面的章节中,我们已经介绍了Canvas的一些基本操作,今天我们继续讲解,Canvas类的用法,可见这个类在自定义View中是多么的重要。今天我们来着重介绍一下如何绘制图片和文字。在这一章节学习之后我们基本上对于一些简单的自定义View就可以搞定了。但是这仅仅是刚刚开始,我还会继续带领大家深入的学习下去,做出更多更炫酷的自定义控件出来。

第一、drawPicture绘制图片

上面是官网中提供的此类的方法,beginRecording()意思为开始录制,什么意思呢。看一段官网的解释再说:To record a picture, call beginRecording() and then draw into the Canvas that is returned. Nothing we appear on screen, but all of the draw commands (e.g. drawRect(Rect, Paint)) will be recorded. To stop recording, call endRecording(). After endRecording() the Canvas that was returned must no longer be used, and nothing should be drawn into it.意思是此方法开始记录一幅画,就是canvas的操作。直到endRecording()方法的调用,结束录制。注意:endRecording()调用之后此画布必须保证不再使用。什么意思呢,我们可以通俗的理解为,此方法的操作是可以记录一个画布,然后重复的使用,每次使用都是和上一次一样的。是不是这样可以大大减少我们的内存开支,只要首次加载的时候绘制一遍,之后每次都使用记录的内容就可以。后面是getHeight和getWidth两个方法,获取宽和高很简单就不说了。最后一个输出流,可以看到在API18之后已经废弃了,就先不考虑了。

 第二、Picture的使用步骤

1、初始化对象

//第一步创建Pictureprivate Picture mPicture = new Picture();

2、录制画布的操作

//开始录制绘制的内容
private void recording(){//开始录制图片,返回一个canvas,此canvas的所有操作都将会被录制。
    Canvas canvas = mPicture.beginRecording(500,500);
    //创建一个画笔
    Paint paint = new Paint();
    paint.setColor(Color.RED);
    paint.setStyle(Paint.Style.FILL);

    //位移画布中心点坐标一段距离
    canvas.translate(500,500);
    //绘制一个圆
    canvas.drawCircle(0,0,300,paint);
    //录制结束
    mPicture.endRecording();
}

3、调用

public CustomPictureText(Context context, AttributeSet attrs) {super(context, attrs);
    // 调用录制
    recording();

}

4、开始绘制

@Override
protected void onDraw(Canvas canvas) {super.onDraw(canvas);
    mPicture.draw(canvas);

}

5、结果如图

7、绘制的方法有很多,以上的方法在低版本中可能会影响Canvas的状态。下面我们来介绍Canvas为我们提供的绘制方法。来比较一下有什么差别

public void drawPicture (Picture picture)public void drawPicture (Picture picture, Rect dst)public void drawPicture (Picture picture, RectF dst)
 @Overrideprotected void onDraw(Canvas canvas) {super.onDraw(canvas);canvas.drawPicture(mPicture,new RectF(0,0,mPicture.getWidth(),200));}

效果如图:

如图所示我们的圆变成了椭圆,是什么造成的呢,这里我们的绘制的时候传入了一个矩形,这个矩形就是用来压缩我们的begin开始录制的时候返回的画布的,当时我们设置为500,500.可以看到我们这里的方法是宽保持不变,高度变为原来的二分之一一,就把原来的圆压缩为现在的椭圆了。

8.将Picture包装成为PictureDrawable,使用PictureDrawable的draw方法绘制。

 @Overrideprotected void onDraw(Canvas canvas) {super.onDraw(canvas);//包装成drawablePictureDrawable drawable = new PictureDrawable(mPicture);//设置绘制的区域drawable.setBounds(0,0,500,mPicture.getHeight());drawable.draw(canvas);}

注意这里的setBounds方法,来设置的是绘制区域,设置的是现在onDraw方法里边的画布,而不是我们picture的画布。设置的区域为左边左上角0,0.到500,图片高度。这里将会展示出来一个四分之一的圆。

第三、drawBitmap绘制图片

一提到Bitmap可能大多数的小伙伴都会有一种莫名其妙的不知所措,什么内存溢出了,内存泄漏了,好像很多都是和Bitmap有关的,但是今天我们不会深入的去研究这里边的原理,今天我们先介绍一下,使用drawBitmap来绘制我们的图片资源。既然是绘制Bitmap那么我们肯定需要先获取到Bitmap才对。获取Bitmap我们使用BitmapFactory来获取,他可以获取,手机存储卡,资源文件,网络图片转换为我们使用的Bitmap。其实还有其他的两种方法,但是今天我们就先介绍BitmaoFactory这个最常用的。

1、通过资源文件获取Bitmap(drawable/mipmap/raw)

Bitmap bitmap = BitmapFactory.decodeResource(mContext.getResources(),R.drawable.dafenqi);

2、通过assets获取

 //从assets中获取资源文件Bitmap bitmap = null;try {InputStream inputStream = mContext.getAssets().open("dafenqi.png");bitmap = BitmapFactory.decodeStream(inputStream);inputStream.close();} catch (IOException e) {e.printStackTrace();}

3、通过内存卡

Bitmap bitmap = BitmapFactory.decodeFile("/sdcard/bitmap.png");

4、通过网络

 // 此处省略了获取网络输入流的代码Bitmap bitmap = BitmapFactory.decodeStream(is);is.close();

5、下面我们将itmap绘制到我们的界面上

第一种方法中后两个参数(matrix, paint)是在绘制的时候对图片进行一些改变,如果只是需要将图片内容绘制出来只需要如下操作就可以了:

第二种方法就是在绘制时指定了图片左上角的坐标(距离坐标原点的距离):

注意:此处指定的是与坐标原点的距离,并非是与屏幕顶部和左侧的距离, 虽然默认状态下两者是重合的,但是也请注意分别两者的不同。

 canvas.drawBitmap(bitmap,200,500,new Paint());

第三种方法比较有意思,上面多了两个矩形区域(src,dst),这两个矩形选区是干什么用的?

// 将画布坐标系移动到画布中央canvas.translate(mWidth/2,mHeight/2); //将画布的中心圆点移动到中心位置// 指定图片绘制区域(左上角的四分之一)Rect src = new Rect(0,0,bitmap.getWidth()/2,bitmap.getHeight()/2);// 指定图片在屏幕上显示的区域Rect dst = new Rect(0,0,200,200);// 绘制图片canvas.drawBitmap(bitmap,src,dst,null);

详解:

上面是以绘制该图为例,用src指定了图片绘制部分的区域,即下图中红色方框标注的区域。

然后用dst指定了绘制在屏幕上的绘制,即下图中蓝色方框标注的区域,图片宽高会根据指定的区域自动进行缩放。

自定义View起步:Canvas之绘制图片相关推荐

  1. 【5年Android从零复盘系列之十七】Android自定义View(12):手势绘制及GestureOverlayView事件详解(图文)

    [5年Android从零复盘系列之十七]Android自定义View(12):手势绘制及GestureOverlayView事件浅析 1.基础 掌握View体系事件分发与处理,参考Android自定义 ...

  2. 自定义View之Canvas(画布)的详解

    接下来学习一下自定义View之Canvas(画布)的详解 先来看看Canvas常用方法: 功能分类 Canvas常用方法 备注 绘制颜色 drawARGB 通过设置ARGB值绘制颜色 drawRGB ...

  3. html5canvas绘制图片源码,HTML5 CANVAS:绘制图片

    HTML5 CANVAS:绘制图片 通过前面的学习,我们现在已经可以在HTML5 canvas中绘制图形和文字,并给它们设置一些样式.我们还可以在中绘制图片.用于在作为绘制源的图片可以是下面的几种元素 ...

  4. 前端html生成图片,HTML5 Canvas:绘制图片

    通过前面的学习,我们现在已经可以在HTML5 canvas中绘制图形和文字,并给它们设置一些样式.我们还可以在中绘制图片.用于在作为绘制源的图片可以是下面的几种元素类型: HTMLImageEleme ...

  5. 微信小程序canvas 2d 绘制图片与文字 导出图片

    wxml内容 如下 <canvas id="myCanvas" type="2d"style="width: {{ canvas.width } ...

  6. 小程序 canvas 2d 绘制图片并保存

    获取canvas实例,使用的官方的代码.用一个变量canvas保存实例,后续保存时会调用. data () {return {canvas: null // 实例} }, onReady() {con ...

  7. 安卓自定义View进阶-Canvas之图片文字

    在上一篇文章Canvas之画布操作中我们了解了画布的一些基本操作方法,本次了解一些绘制图片文字相关的内容.如果你对前几篇文章讲述的内容熟练掌握的话,那么恭喜你,本篇结束之后,大部分的自定义View已经 ...

  8. 自定义View将圆角矩形绘制在Canvas上

    前几天,公司一个项目中,头像图片需要添加圆角,这样UI效果会更好看,于是写了一个小的demo进行圆角的定义,该处主要是使用BitmapShader进行了渲染(如果要将一张图片裁剪成椭圆或圆形显示在屏幕 ...

  9. Android自定义View之Canvas绘制基本图形(二)-- 自定义时钟

    前言 前面一篇主要是巩固Cavas绘制基本图形(如直线,矩形,点等等),今天同样是复习Cavas画圆,圆弧,等等,但是今天会多了一个path,以及Canvas画布的旋转.缩放.平移等等,画布的保存(s ...

最新文章

  1. Recyclerview 添加一个数组
  2. 应用内设置语言不重启方法
  3. Pandas中兼并数组和字典功能的Series 2013-03-24 11:24:00 分类: Python/Ruby In [2]: # 这段代码用于并排显示多个Series对象 from it
  4. JS 版的pnp in_array($str,$arr)
  5. Linux下Makefile学习笔记
  6. jupyter安装出现问题:安装后无法打开
  7. MFC匿名管道原理详解、函数总结、调用实例(用MFC的匿名管道读取CMD输出内容)(C++语言)
  8. php改vue,修改.vue · 柳鑫鹏/1702phpA - Gitee.com
  9. android listview快速定位,【转】android中ListView的定位:使用setSelectionFromTop实现ListView的position的保持...
  10. ArcGIS for Desktop入门教程_第八章_Desktop学习资源 - ArcGIS知乎-新一代ArcGIS问答社区...
  11. Dx11DemoBase 基类(三) 实例应用 【已实现】【附带源码】
  12. Oracle 11g 完全卸载
  13. 【回环检测】如何理解loopClosing中的连续性检测
  14. 学计算机的写论文题目,经典本科计算机论文选题 本科计算机论文题目怎样取...
  15. 2017年油价调整时间表
  16. 电脑重装系统后c盘数据能恢复吗?
  17. 作业python 内部小卖铺
  18. cobbler部署与示例
  19. 浏览器网页视频怎么快速下载到本地?
  20. 【古典入门】巴洛克音乐

热门文章

  1. 使用canvas给图片添加水印
  2. 手机支付安全解决方案演进
  3. emqttd的启动脚本
  4. 常用的十大算法-迪杰斯特拉算法
  5. 黑马程序员-自学笔记-CSS基础
  6. 名词解释(普通二极管)
  7. Swift tips 017 - Speeding up Swift package tests
  8. 想当厨子的司机,不是好司机
  9. SAPABAP金色传说:关于导入和导出Excel时反复弹窗提示 SAP GUI安全性问题的解决方法
  10. 下拉框中select的onclick和onchange两个事件的区别