当测量好了一个View之后,我们就可以简单地重写onDraw()方法,并在Canvas对象上来绘制所需要的图形。首先我们来了解一下利用系统2D绘图API所必须要使用到的Canvas对象。

要想在Android的界面中绘制相应的图像,就必须在Canvas上进行绘制。Canvas就像是一个画板,使用Paint就可以在上面作画了。通常需要通过继承View并重写它的onDraw()方法来完成绘图(注意这个思路,后面经常使用到了)。

那什么是Canvas呢?一般情况下,可以使用重写View类中的onDraw()方法来绘图,onDraw()中有一个参数,就是Canvas canvas对象。使用这个Canvas对象就可以进行绘图了,而在其他地方,通常需要使用代码创建一个Canvas对象,代码如下所示。

Canvas canvas = new Canvas(bitmap);
  • 当创建一个Canvas对象时,为什么要传进去一个bitmap对象呢?如果不传进入一个bitmap对象,IDE编译虽然不会报错,但是一般我们不会这样做。
  • 这是因为传进去的bitmap与通过这个bitmap创建的Canvas画布是紧紧联系在一起的,这个过程我们称之为装载画布。
  • 这个bitmap用来存储所有绘制在Canvas上的像素信息。
  • 所以当你通过这种方式创建了Canvas对象后,后面调用所有的Canvas.drawXXX方法都发生在这个bitmap上。
  • 在View类的onDraw()方法中,通过下面这段代码,我们可以了解到canvas与bitmap直接的关系。首先在onDraw方法中绘制两个bitmap,代码如下所示。
canvas.drawBiimap(bitmap1, 0, 0, null);
canvas.drawBitmap(bitmap2, 0, 0, null);

而对于bitmap2,我们将它装载到另一个Canvas对象中,代码如下所示。

Canvas mCanvas=new Canvas(bitmap2);

在其他地方使用Canvas对象的绘图方法在装载bitmap2的Canvas对象上进行绘图,代码如下所示。

mCanvas.drawXXX
  • 通过mCanvas将绘制效果作用在了bitmap2上,再刷新View的时候,就会发现通过onDraw()方法画出来的bitmap2已经发生变化,这就是因为bitmap2承载了在mCanvas上所进行的绘图操作。
  • 虽然我们也使用了Canvas的绘制API,但其实并没有将图形直接绘制在onDraw()方法指定的那块画布上,而是通过改变bitmap,然后让View重绘,从而显示改变之后的bitmap。这一过程对初学者来说可能非常难以理解,但是却非常重要,这对后续进行深入地学习和提升绘图技巧非常有帮助。
      在理解了Canvas对象后,我们就可以调用Canvas所提供的绘图方法,来绘制自己想要的图形了。不管是多么复杂、精美的控件,它都可以被拆分成一个个小的图形单元,我们要做的正是找到这些小的绘图单元并将它们绘制出来。

内容参考自Blankj

3.3 自定义控件基础 之 View的绘制相关推荐

  1. View的绘制-draw流程详解

    目录 作用 根据 measure 测量出的宽高,layout 布局的位置,渲染整个 View 树,将界面呈现出来. 具体分析 以下源码基于版本27 DecorView 的draw 流程 在<Vi ...

  2. Android官方开发文档Training系列课程中文版:创建自定义View之View的绘制

    原文地址:http://android.xsoftlab.net/training/custom-views/custom-drawing.html#draw 自定义View最重要的部分就是它的样子了 ...

  3. Android View的绘制流程

    View的绘制和事件处理是两个重要的主题,上一篇<图解 Android事件分发机制>已经把事件的分发机制讲得比较详细了,这一篇是针对View的绘制,View的绘制如果你有所了解,基本分为m ...

  4. 从Android 6.0源码的角度剖析View的绘制原理

    在从Android 6.0源码的角度剖析Activity的启动过程和从Android 6.0源码的角度剖析Window内部机制原理的文章中,我们分别详细地阐述了一个界面(Activity)从启动到显示 ...

  5. HenCoder Android 开发进阶:自定义 View 1-5 绘制顺序

    这期是 HenCoder 自定义绘制的第 1-5 期:绘制顺序 之前的内容在这里:  HenCoder Android 开发进阶 自定义 View 1-1 绘制基础  HenCoder Android ...

  6. Android View的绘制流程(1) -- 测量onMeasure

    鉴于是首篇讲解自定义view流程,之前也在网上搜了一些博主的博客看了看,都是大同小异,今天抽时间自己总结一下,分享一下自己的感悟,也算是一篇笔记. (本篇为开头篇,稍微讲述一下有关的东西) View的 ...

  7. Android中View(视图)绘制不同状态背景图片原理深入分析以及StateListDrawable使用详解...

    2019独角兽企业重金招聘Python工程师标准>>> 今天继续给大家分享下View的相关知识,重点有一下两点:   1.View的几种不同状态属性            2.如何根 ...

  8. Android 中View的绘制机制源代码分析 三

    到眼下为止,measure过程已经解说完了,今天開始我们就来学习layout过程.只是在学习layout过程之前.大家有没有发现我换了编辑器,哈哈.最终下定决心从Html编辑器切换为markdown编 ...

  9. Android之View的绘制流程解析

    转载请标明出处:[顾林海的博客] 个人开发的微信小程序,目前功能是书籍推荐,后续会完善一些新功能,希望大家多多支持! ##前言 自定义View在Android中占据着非常重要的地位,因此了解View的 ...

  10. Android O: View的绘制流程(二):测量

    在前一篇博客Android O: View的绘制流程(一): 创建和加载中,  我们分析了系统创建和加载View的过程,这部分内容完成了View绘制的前置工作. 本文开始分析View的测量的流程. 一 ...

最新文章

  1. 交替最小二乘+ALS+推荐+Spark
  2. MYsql可以做独立数据库_mysql-用于独立应用程序Winforms的数据库
  3. kubernetes日志采集与解析
  4. Java中子类对象赋值给父类变量
  5. Java历史,Java跨平台
  6. 新特性AAtitti css3 新特性attilax总结titti css
  7. BZOJ4543[POI2014]Hotel加强版——长链剖分+树形DP
  8. 最新30套Java项目实战
  9. Android开发——小技巧(二)修改APP图标和名字
  10. 【Firefox设置百度搜索引擎】
  11. lookAhead和RAdam 真香
  12. LeetCode.714.买卖股票的最佳时机含手续费
  13. curl指定代理_如何使用cURL指定用户代理
  14. Java工作小组组名,起组名和口号大全
  15. ar vr mr 计算机技术,VR、AR、MR、还有云计算,他们到底是什么?
  16. vsphere之vmotion精华
  17. 法制日报:要在法律上“悉心关照”百度
  18. 对ORBslam2前端ORBextractor点提取的理解(理解每行代码在干啥)
  19. Python 成绩统计
  20. 各位集美兄得看过来! 利用AI给青春有你2的选手们做数据分析挖掘(一):基于PaddlePaddle爬虫选手信息

热门文章

  1. 写shell工具类,一个常用实例
  2. PrintService类打印
  3. postgresql 模式与用户,及跨库访问
  4. html table 表格
  5. Power Tools for TFS 11 Beta
  6. 在个人机上发布web项目
  7. 虚拟机IP更换后 weblogic无法启动 java.net.BindException: 无法指定被请求的地址
  8. 关于http-server的备选方案-- browser-sync
  9. sed修炼系列(二):sed武功心法(info sed翻译+注解)
  10. xtrabackup之Innobackupex全备数据库