3.3 自定义控件基础 之 View的绘制
当测量好了一个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的绘制相关推荐
- View的绘制-draw流程详解
目录 作用 根据 measure 测量出的宽高,layout 布局的位置,渲染整个 View 树,将界面呈现出来. 具体分析 以下源码基于版本27 DecorView 的draw 流程 在<Vi ...
- Android官方开发文档Training系列课程中文版:创建自定义View之View的绘制
原文地址:http://android.xsoftlab.net/training/custom-views/custom-drawing.html#draw 自定义View最重要的部分就是它的样子了 ...
- Android View的绘制流程
View的绘制和事件处理是两个重要的主题,上一篇<图解 Android事件分发机制>已经把事件的分发机制讲得比较详细了,这一篇是针对View的绘制,View的绘制如果你有所了解,基本分为m ...
- 从Android 6.0源码的角度剖析View的绘制原理
在从Android 6.0源码的角度剖析Activity的启动过程和从Android 6.0源码的角度剖析Window内部机制原理的文章中,我们分别详细地阐述了一个界面(Activity)从启动到显示 ...
- HenCoder Android 开发进阶:自定义 View 1-5 绘制顺序
这期是 HenCoder 自定义绘制的第 1-5 期:绘制顺序 之前的内容在这里: HenCoder Android 开发进阶 自定义 View 1-1 绘制基础 HenCoder Android ...
- Android View的绘制流程(1) -- 测量onMeasure
鉴于是首篇讲解自定义view流程,之前也在网上搜了一些博主的博客看了看,都是大同小异,今天抽时间自己总结一下,分享一下自己的感悟,也算是一篇笔记. (本篇为开头篇,稍微讲述一下有关的东西) View的 ...
- Android中View(视图)绘制不同状态背景图片原理深入分析以及StateListDrawable使用详解...
2019独角兽企业重金招聘Python工程师标准>>> 今天继续给大家分享下View的相关知识,重点有一下两点: 1.View的几种不同状态属性 2.如何根 ...
- Android 中View的绘制机制源代码分析 三
到眼下为止,measure过程已经解说完了,今天開始我们就来学习layout过程.只是在学习layout过程之前.大家有没有发现我换了编辑器,哈哈.最终下定决心从Html编辑器切换为markdown编 ...
- Android之View的绘制流程解析
转载请标明出处:[顾林海的博客] 个人开发的微信小程序,目前功能是书籍推荐,后续会完善一些新功能,希望大家多多支持! ##前言 自定义View在Android中占据着非常重要的地位,因此了解View的 ...
- Android O: View的绘制流程(二):测量
在前一篇博客Android O: View的绘制流程(一): 创建和加载中, 我们分析了系统创建和加载View的过程,这部分内容完成了View绘制的前置工作. 本文开始分析View的测量的流程. 一 ...
最新文章
- 交替最小二乘+ALS+推荐+Spark
- MYsql可以做独立数据库_mysql-用于独立应用程序Winforms的数据库
- kubernetes日志采集与解析
- Java中子类对象赋值给父类变量
- Java历史,Java跨平台
- 新特性AAtitti css3 新特性attilax总结titti css
- BZOJ4543[POI2014]Hotel加强版——长链剖分+树形DP
- 最新30套Java项目实战
- Android开发——小技巧(二)修改APP图标和名字
- 【Firefox设置百度搜索引擎】
- lookAhead和RAdam 真香
- LeetCode.714.买卖股票的最佳时机含手续费
- curl指定代理_如何使用cURL指定用户代理
- Java工作小组组名,起组名和口号大全
- ar vr mr 计算机技术,VR、AR、MR、还有云计算,他们到底是什么?
- vsphere之vmotion精华
- 法制日报:要在法律上“悉心关照”百度
- 对ORBslam2前端ORBextractor点提取的理解(理解每行代码在干啥)
- Python 成绩统计
- 各位集美兄得看过来! 利用AI给青春有你2的选手们做数据分析挖掘(一):基于PaddlePaddle爬虫选手信息
热门文章
- 写shell工具类,一个常用实例
- PrintService类打印
- postgresql 模式与用户,及跨库访问
- html table 表格
- Power Tools for TFS 11 Beta
- 在个人机上发布web项目
- 虚拟机IP更换后 weblogic无法启动 java.net.BindException: 无法指定被请求的地址
- 关于http-server的备选方案-- browser-sync
- sed修炼系列(二):sed武功心法(info sed翻译+注解)
- xtrabackup之Innobackupex全备数据库