android 自定义绘画,Android自定义View——绘图API学习笔记-程序员宅基地

技术标签: android 自定义绘画  

66b52468c121889b900d4956032f1009.png

8种机械键盘轴体对比

本人程序员,要买一个写代码的键盘,请问红轴和茶轴怎么选?

Canvas.[translate,scale,rotate,skew]方法

**Matrix.**set/pre/post[translate,scale,rotate,skew]方法

平移、缩放、旋转、斜切

我们通过调用Canvas.translate等方法,可以使后续在此Canvas上绘制操作的绘制区域变化,如translate(5,0),则后续所有绘制操作的绘制区域都会向右移动5个像素。

**原理:*Canvas里有一个Matrix,Canvas上的这几个调用都会最终调用到Matrix.pre。这个Matrix保存整个变换过程。当有Canvas.draw时,要绘制的点都会经过Matrix.mapPoints方法做一个映射。于是产生我们期望的变换效果。(事实上映射的时候只需要映射关键点,其他的是插值来的)

关于Matrix

set/pre/post的区别:set是设置,冲掉以前的数据。pre是前乘,post是后乘,根本上讲就是生效顺序不同

setPolyToPoly:与mapPoints方法相反,mapPoints是通过矩阵把原始点映射为目标点。setPolyToPoly是输入原始点和映射后的目标点,计算出这个矩阵

Canvas.draw*方法

Canvas.draw-Point/s

Canvas.draw-Line/s

Canvas.draw-Rect,RoundRect,Circle,Oval,Arc,Path

Canvas.draw-Text

Canvas.draw-Bitmap,BitmapMesh

Canvas.draw-Color,Paint

这些方法都表示绘制一个区域。绘制的区域中究竟填充什么颜色,由Paint决定。

Color,Paint,Bitmap,BitmapMesh这几个则除了指定绘制区域外,还指定了填充内容。

Path功能比较强大,可自行组织成任何形状,还可以用贝塞尔曲线。

**drawBitmapMesh:**输入一个网格模型,绘制出的图片会依据网格来扭曲。

示例:假设有个30x30大小的图片,我们建立这样的网格输入:0,0, 15,0, 30,0,0,15, 15,15, 30,15,0,30, 15,30, 30,30

则图片会原样输出,没有任何扭曲。

如果我们建立这样的网格输入:0,0, 15,12, 30,0,0,15, 15,15, 30,15,0,30, 15,30, 30,30

则原本[15,0]的点会被绘制到[15,12]的位置上去。图片绘制出来后,上面部分会缺一块,形成用手把图片从上边中间位置往下拉的扭曲效果。但很锐利,上面缺的一块是个三角形而不会是半圆型,通常我们希望的是半圆型,这就需要我们把这个网格建得密一些。

填充颜色

区域里的填充颜色是由Paint来指定的。

Paint.setColor指定纯色。

Paint.setShader可指定:BitmapShader, LinearGradient, RadialGradient, SweepGradient, ComposeShader。

BitmapShader:图片填充。

LinearGradient, RadialGradient, SweepGradient:渐变填充。

ComposeShader:叠加前面的某两种。可选择PorterDuff混合模式。

ColorFilter

通过ColorFilter可以对一次绘制的所有像素做一个通用处理。

Paint.setColorFilter: LightingColorFilter, PorterDuffColorFilter, ColorMatrixColorFilter。

这可以整体上改变这一次draw的内容,比如让颜色更暗、更亮等。

这里重点介绍下ColorMatrixColorFilter。

ColorMatrix是4x5矩阵,定义其每个元素如下:

{ a, b, c, d, e,

f, g, h, i, j,

k, l, m, n, o,

p, q, r, s, t }

则ColorMatrix的最终运算方式如下:

R’ = aR + bG + cB + dA + e;

G’ = fR + gG + hB + iA + j;

B’ = kR + lG + mB + nA + o;

A’ = pR + qG + rB + sA + t;

绘图API架构

7eb825c79c5b0eeec445d7f7e59fd83e.png

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_42523543/article/details/117276643

智能推荐

elementui 表格表头竖着显示_element ui 表格表头纵向显示-程序员宅基地

文章浏览阅读6.3k次。element ui 提供了table ,根据对象数组 动态展示表格,但是实际需求中,有很多竖向展示表格的需求效果图:原本数据data: [{code: "weixin",name: "微信",icon:"src地址",isActive: false,templateInfoList: [{code: "confirmation",name: "人工确认",isConfiged: true},{c...

高中计算机学考什么时候,2020年普通高中信息技术学业水平考试工作安排出炉!...-程序员宅基地

文章浏览阅读1.5k次。(来源:贵州教育发布)原标题:2020年普通高中信息技术学业水平考试工作安排出炉!近日,省教育厅公布2020年普通高中信息技术学业水平考试相关工作安排, 明确报名时间为2020年6月8日-12日;考试时间为2020年6月28日-30日。具体安排一起来看↓↓↓一、报名条件◆ 参加2020年普通高中信息技术学业水平考试的学生为已通过“贵州普通高中学籍及考务管理系统”注册审核并获得信息技术学科所有必修学..._高中计算机学业水平考试

android 微信绑定银行卡号,android 仿微信添加银行卡时输入支付密码-程序员宅基地

文章浏览阅读176次。最近了解到了BottomSheetBehavior,感觉是个很有意思的布局,刚好项目中有实际场景可以应用,就拿它来实现了,下面是我们要实现的最终效果:gif.gif底部的键盘布局呢,就是采用的BottomSheetBehavior,我个人理解类似于抽屉的效果,可以从底部滑出划入,话不多说,开始吧。布局界面代码布局界面就是一个关闭按钮的图片,两个TextView和一个自定义的密码输入控件,下面贴上代...

dp对计算机科学的重要性,社会科学技术在计算机领域对社会发展作用及影响.pdf...-程序员宅基地

文章浏览阅读198次。科学技术在计算机领域对社会发展的作用及影响摘要:从人类进入工业文明以来,科学技术迅速发展,极大地促进了生产力的发展和社会变革。科学技术是生产力,科学是最高意义上的革命力量,技术是人类改造自然、进行生产的方法和手段,科学和技术是辩证统一的整体,对推动社会发展有着非常重要的意义。本文将结合科学技术在计算机领域的发展介绍其在社会发展的作用及影响。关键词:科学 技术 计算机领域 社会发展 生产力 经济 影..._计算机dp领域

多指触摸处理_motionevent 多指判断-程序员宅基地

文章浏览阅读430次。一.前言在开发中,我们经常会使用自定义View进行拖动和缩放,拖动一般是单指触摸,但是实际情况我们也可以使用多指进行触摸移动,如果这是我们进行抬起二.了解触摸事件2.1 了解MotionEvent中手指的index和id在MotionEvent中,存储了每个手指的index和id:Index: 每个MotionEvent在数组中存储了手指的信息,index表示手指在数组中的位置,开发中我们也是通过index作为参数来获取相关信息,比如event.getX(int pointerIndex),ev_motionevent 多指判断

OSG开发环境搭建-程序员宅基地

文章浏览阅读3k次。国庆出去了几天,今天有点时间,把上次承诺要写的osgNeHe环境搭建过程写一下,方便还不熟悉的朋友们。安装准备进行osg的开发需要安装如下的一些软件:Visual Studio 2008或者更高版本(其他版本也可以,但是考虑到Qt需要自己编译有点麻烦,建议使用VS08以上版本)Qt 4.8系列(Qt5也可以,本文以4.8系列为例)CMake 2.8.12或更高版本O

随便推点

linux里hba状态_(转)Linux主机HBA常用操作指南-程序员宅基地

文章浏览阅读696次。本文阐述了Linux系统下HBA卡的常用基本操作,包括如何通过命令或日志查找HBA,如何查找WWN以及设置永久绑定,以及HBA卡安装完成之后如何识别存储设备。主机外接存储的准备工作:HBA卡与操作系统的安装顺序决定了主机外接存储的操作步骤。如果HBA安装在操作系统之前,那么连接磁盘还是比较简单的。安装程序检测到发现的硬件并准备所需模块。如果适配器安装于操作系统之后,或在操作系统安装之后有变更,则用..._linux down hba口

MATLAB中unzip出错,UNZIP命令出错END-OF-CENTRAL-DIRECTORY SIGNATURE NOT FOUND-程序员宅基地

文章浏览阅读820次。data.zip文件有4G多,解压的时候出问题了.Archive: data.zipEnd-of-central-directory signature not found. Either this file is nota zipfile, or it constitutes one disk of a multi-part archive. In thelatter case the cent..._matlab运行unzip报错

ls与linux文件属性_联合属性ls-程序员宅基地

文章浏览阅读1.1k次。ls与文件属性ls:代表list,显示文件的文件名与相关属性选项: -a:列出所有的文件及目录的详细权限及属性 -l:每个文件用单行输出 -d:仅显示目录名 其他的用到时再补充 如图所示,为用ls -l列出的文件属性,共有七列,下面将逐一介绍每列的含义: 第一列:文件的类型与权限。共10个字符。 第一个字符:代表这个文件的属性–目录、文件或链接文件 d:目录 -:文件..._联合属性ls

mips架构linux启动分析(四)(接收bios信息和环境初始化)_prom_init-程序员宅基地

文章浏览阅读1.2k次。老样子先看函数把.void __init prom_init(void){//初始化命令 prom_init_cmdline();//初始化环境 prom_init_env();//这里所作的是把桥片进行了一些配置 if (loongson_pch) loongson_pch->early_config();#ifdef CONFIG_NUMA prom_init_n_prom_init

Vue v-show/v-if绑定的数据改变时,无法监听数据变化_vue3 v-if监听不到数据变化-程序员宅基地

文章浏览阅读1.4w次。原因:向对象中新增属性时,Vue无法监听新增的属性的数据变化,从而无法触发视图的改变 解决:使用 Vue.set() 来新增属性Vue.set( target, key, value ) 参数: {Object | Array} target {string | number} key {any} value 返回值:设置的值。 ..._vue3 v-if监听不到数据变化

pyqt生成 android,PyQt on Android-程序员宅基地

文章浏览阅读2.1k次。问题I'm working on PyQt now, and I have to create the application on Android, I've seen the kivy library, but it's too crude.Is there any way now to run an application on Android made on PyQt?回答1:Androi..._pyqt android

推荐文章

热门文章

相关标签