自定义View的学习笔记1-1

news2024/12/24 8:25:47

这一系列主要是跟随扔物线的学习笔记。

自定义View主要是三个部分,绘制,布局,触摸反馈。

绘制是这三个部分中,最重要的一个。

先说绘制,所谓绘制,指的就是控件内容的显示。啥意思,比如我们作为程序员,控件显示什么内容肯定都是我们控制的。但是,一般情况下,我们并不是直接去操控这些内容。而是使用API对控件进行设置。然后控件自己会完成绘制过程。

例如,咱们给TextView设置了一段文字。

 

 TextView自己会负责把文字显示在合适的位置。至于里面的细节,比如文字的起始坐标在哪,从哪开始换行,换行之后,怎么保证行与行是怎么依然对齐的。这些我们都不用关注。而自定义绘制指的就是由你来接管这个绘制过程,去操作这些绘制细节。以此来显示出一些自带控件显示不出来的内容。

比如要你做一个统计的柱状图,自带控件是比较难做的。而如果是饼状图,则自带控件完全没法做了。而这些使用自定义绘制都能够很轻松的绘制出来。这个就是为啥我们要学习自定义绘制。自定义绘制一直被认为是高手的技能,所以,铁汁们,咱们必须得学会啊。

android中的绘制是在每个View的绘制方法里发生的。比如:

public class ImageView extends Vieww
{
	@Override
	绘制方法(){
		//ImageView的绘制代码
	}
}

一个View的绘制方法里写了什么代码,它就会绘制什么内容。

而自定义绘制就是通过重写绘制方法,插入你自己的绘制代码来实现。

public class MyView extends Vieww
{
	@Override
	绘制方法(){
		//MyView的绘制代码
	}
}

当然,这里是伪代码,绘制方法不是一个方法,有好几个。其中最常用的叫做onDraw()

onDraw()这个绘制方法,它负责的是View的主体的绘制。例如TextView的文字,ImageView的图像都是在onDraw()里绘制的。具体执行操作的是onDraw()里的canvas参数。

比如你画个圆:

canvas.drawCircle

那么这个canvas是什么呢?从名字来看,画布。

虽然现实中画布是一个载体,咱们把画画在画布上,但是在android中,canvas是一个绘制工具。

它唯一的功能就是绘制。上面的drawcircle只是一个例子,canvas能画的非常多。

方块,三角,图片,文字,不规则图形,统统没问题。

实际上,你所能够见到的android中的界面,几乎都是用canvas来绘制的。

除了一些游戏,一些3D游戏会用到openGL。

所以,铁汁们,只要你能掌握canvas,你就基本上能做出所有的界面了!

除了drawCircle。还有很多绘制方法,他们全部以draw开头。

我们以drawCircle为例子来学习下,其他跟他都是一个套路。

大家看,drawCircle方法里的参数,除了坐标,半径这些基本信息,还有一个参数paint。

paint的本意是颜料。颜料是用来干啥的,涂色的。

而android中的paint则是一个加强版的颜料。

它负责提供绘制所使用的颜色和风格信息。

所谓风格就是这个圆是空心还是实心。线条粗细是多少。有没有阴影。等等这些附加信息。

Paint这个类对于绘制非常关键,非常关键,非常关键。重要的事情说三遍,如果我们想掌握自定义绘制,一定要掌握Paint这个类。

除了drawCircle,paint还有drawRect,drawPath来绘制其他图形。

另外还有drawText,drawBItmap来绘制简单图形之外的东西。

但是,他们和drawCircle的本质都是一样的。

你调用需要的方法,在参数里传入基本信息和paint就行了。

以上是canvas的绘制。除了上面的直接绘制,canvas还有别的方法,他们对绘制进行辅助。

主要有2类。

一类是绘制范围的裁切。

这个好理解,就是通过裁切来把绘制限定在某个范围内。然后当你绘制的时候,超过的范围会被切掉。不会显示出来。

这些方法全部以clip开头。

 另一类就是绘制内容的几何变换。

啥是几何变换呢?举个🌰。

放大缩小就是几何变换的一种。

平移和旋转也是几何变换。

还有错切,水平错切和垂直错切。

你可以这样想,把你绘制的内容的4个顶点,任意拉扯。

绘制内容就会发生相应的变化。

这些拉扯所对应的所有形变都是几何变换。

这些奇形怪状的拉扯可别觉得没用,3D绘制的模拟就是用他们来做的。

比如像纸一样的翻起来的效果,其实啊,就是把绘制的内容的两个顶点,做了横向的拉伸以及高度的压缩。

上面说的就是自定义绘制的最核心的技巧。

也就是,重写onDraw方法,在ondraw方法里用canvas相关方法进行绘制。配合上范围裁切和几何变换。就可以达到我们想要的效果。

会了这些,咱们就能想画什么,就画什么。

不过,还有一个问题。

绘制顺序。

比如你写了一个自定义Layout。重写了他的ondraw。然后在里面画了一些你要的东西。之后你会发现,当添加了子view之后,绘制的内容会被子view盖住。如果你所期望的是他能盖住子view,比如你绘制了几个小红点,然后子view是一张图,你希望的是红点盖住图,这个时候,就有问题了。

那么怎么保证所有的绘制遮盖关系都复合我们的要求呢?

android中的绘制是有顺序的,先绘制的内容会被后绘制的内容所盖住。

前面说了,绘制方法不是一个,而是好几个。其中onDraw()只是用来绘制主体内容的。

还有一些方法

有负责绘制背景的。

有负责前景的。

他们在整个绘制过程中,都处于各自不同的位置。

也就是不同步骤。

如果你对遮盖关系,有你特殊的要求。

那么你就需要去了解这个步骤。

去了解这些绘制方法是处于绘制过程中的哪个位置。

然后在实际使用,你就知道,自己应该选择哪个方法来进行重写。

从而达到你想要的效果。

自定义绘制大概就是这样。

现在咱们来总结一下,总结是学习最重要的一步。

自定义绘制的方式,是重写绘制方法。

其中,最常用的是onDraw()。

绘制的关键,在于canvas的使用。他是一个绘制工具。主要有绘制,和对绘制的辅助这两类方法。

canvas的绘制是使用的以draw开头的一些列方法,重要参数是paint。它用来保存颜色和风格信息。

canvas对绘制的辅助,有2种,范围裁切(clip开头)和几何变换。

另外,除了ondraw,对遮盖关系有特殊要求,还可以重写别的方法。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/168950.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

02 技术太卷我学Apex-级联值列表

02 技术太卷我学Apex-级联值列表 0 值列表概念 就是页面输入时从下拉列表中选择固定值。 值列表可以在APEX中【共享组件】-【其它组件】-【值列表】创建,也可以也页面上自己用sql语句(一般需要级联值列表最好在页面上创建)创建。 1 创建一…

Node版本锁定

Node版本锁定问题方案一、锁定Node版本二、自动切换Node版本问题 接手项目时,不知道项目所用的Node版本同一个项目,不同人用不同的Node版本,引起编译后的未知问题 方案 一、锁定Node版本 在package.json中配置 engines,限定项目…

【微电网】基于改进粒子群算法的微电网优化调度(Matlab代码实现)

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…

云原生周刊 | 使用 ChatGPT 协助解决 Prometheus 告警

开源项目推荐 kubernetes-chatgpt-bot 这是一个适用于 Slack 的 ChatGPT 机器人,只要有监控告警发送到 Slack 频道中,你就可以通过机器人向 ChatGPT 咨询如何解决这个告警,ChatGPT 将会给出一个较为详细的解决方案。 Copacetic Copacetic …

WEB文件管理器和上传器:GleamTech FileUltimate 8.5.1.0

GleamTech FileUltimate适用于 ASP.NET Core、MVC 和 WebForms 的FileUltimate文件管理器和上传器 将文件管理器快速集成到您的 ASP.NET 应用程序或站点中。 使用访问控制浏览和管理文件。 接受具有高级上传功能的文件(上传器也可作为独立组件使用)。 提…

应用程序进程启动过程

1 应用程序进程简介 想要启动一个应用程序,首先要保证这个应用程序所需要的应用程序进程已经启动。 AMS 在启动应用程序时会检查这个应用程序所需要的应用程序进程是否已经存在,如果不存在就会请求 Zygote 进程启动需要的应用程序进程。 在 Zygote进程启…

2023牛客寒假算法基础集训营1--鸡玩炸蛋人(带权并查集) 诈骗题?

题目如下: 示例1 输入 6 4 1 2 2 3 1 3 4 6 0 0 0 0 0 0输出 14示例2 输入 6 4 1 2 2 3 1 3 4 6 0 0 0 0 2 0输出 1题目链接 题解 or 思路: 首先如果我们理解题意了,这个题是顶级诈骗。 因为是无向图,我们需要记录图中 环…

算法第十三期——BFS-双向广搜

双向广搜 应用场景:有确定的起点s和终点t;把从起点到终点的单向搜索,变换为分别从起点出发和从终点出发的“相遇”问题。操作:从起点s(正向搜索)和终点t(逆向搜索)同时开始搜索,当两个搜索产生…

编程太难不适合女生学?来看 N 多小姐姐的回应!

某女程序员:我要去互联网公司做程序员?网友:你疯了?程序员很累的... 女生不适合做程序员,还是去做产品经理吧。画外音:我去,产品经理不累吗?并不是女生不适合写代码,也不…

python cairosvg 库专题博客,10分钟掌握 cairosvg

cairosvg 库用于将 SVG 图像转换为其他图片格式。它使用 Cairo 库来绘制 SVG 图像,并支持将 SVG 图像转换为 PNG、PDF、PS、SVG 和 GIF 格式。 python cairosvgPython cairosvg 上手案例cairosvg 直接将 svg 图像转换为二进制数据cairosvg 库函数清单总结Python cai…

趣味三角——第1章——角

平面角是平面内相交但不在一条直线上的两条直线之间的倾角(A plane angle is the inclination to one another of two lines in a plane which meet one another and do not lie in a straight line.)。 ——Euclid(欧几里得), 元素(The Elements),定义8。 几何实体…

【C++】Hash开散列,unordered_set(map) 的封装以及迭代器的实现

上一篇博客我们使用闭散列的方式实现了 Hash,其实在STL库unordered_set、unordered_map中底层是开散列的方式实现的Hash,所以,本篇博客就再使用开散列的方式实现Hash,并将unordered_set、unordered_map进行封装。 目录 一、开散…

C 数据结构1 —— 线性表-顺序表\单链表\双链表

文章目录1. 线性表1.1 定义1.2 特点2. 顺序表(顺序存储结构)2.1 定义(存储结构代码描述)2.2 插入元素2.2.1 图形演示2.2.2 代码表示2.3 删除元素2.3.1 图形演示2.3.2 代码表示2.4 完整代码2.5 动态分配数组3. 单链表(链式存储结构)3.1 定义(存储结构代码描述)3.2 单链表的读取3…

COCO_04 展示COCO格式数据集 目标框与分割mask

文章目录1 前言2 绘制GT2.1 绘制目标框与类别2.2 绘制分割mask3 AppendixA. mask polygon格式转化为图片格式参考1 前言 上篇文章介绍了如何制作COCO个数数据集的Dataset与Dataloader,并绘制了dataloader->batch的返回的信息,https://blog.csdn.net/…

【打卡】医学搜索Query相关性判断学习赛

入坑传送门 赛事介绍 文本匹配拥有广泛的应用场景,可以用于去除重复问题和文本相似度中。在本次学习中我们将学习: 如何计算文本之间的统计距离如何训练词向量 & 无监督句子编码BERT模型搭建和训练 上述步骤都是一个NLP算法工程师必备的基础&…

【GD32F427开发板试用】02-ADC规则组连续采样

本篇文章来自极术社区与兆易创新组织的GD32F427开发板评测活动,更多开发板试用活动请关注极术社区网站。作者:Stark_GS ADC 简介及特点 器件中集成了一个 12 位 2.6 MSPS 多通道 ADC。 一共有19个多路复用通道:16个外部通道,1个…

office365删除错误发送的邮件

微软喜欢变,office365删个邮件真是不容易。 --管理员登录 Connect-IPPSSession -UserPrincipalName adminmydomain.onmicrosoft.com --创建一个 "deleteemail"的搜索项目,项目名可以任意起,这个名称后面在office365安全合规门户里…

libcurl简介及其编程应用

本文为学习笔记,整合课程内容以及下列文章: 其中,libcurl函数库常用字段解读部分: 参考博文:原文地址 作者:冬冬他哥哥 目录 libcurl简介 libcurl的使用 学会开源包使用的一般步骤 包的解读 重点是看…

Spark 核心编程

文章目录Spark 核心编程一、RDD1、分布式计算模拟(1) 搭建基础的架子(2) 客户端向服务器发送计算任务Spark 核心编程 Spark 计算框架为了能够进行高并发和高吞吐的数据处理,封装了三大数据结构,用于处理不同的应用场景。三大数据结构分别是:…

【数据结构与算法理论知识点】1.1基本概念

1.1基本概念 为什么要学习数据结构与算法? AlgorithmsData StructuresPrograms---- Niklaus Wirth ( Pascal程序设计语言之父、结构化程序设计首创者、图灵奖获得者) 计算机程序:使用计算机求解问题算法是求解问题的步骤的描述:从蛮力到策…