一、概述
canvas绘制背景、轮廓或者模板形状(比如图片),也可做平移、缩放等,但是注意canvas的操作是对这个绘制空间都会起作用。
paint具体去描绘要绘制在canvas上面的形状,可设置着色器shader绘制高级图形。
二、shader
shader包括:BitmapShader, ComposeShader, LinearGradient, RadialGradient, SweepGradient。
1、BitmapShader
BitmapShader只有有一个含参的构造方法:
BitmapShader (Bitmap bitmap, Shader.TileMode tileX, Shader.TileMode tileY)顾名思义,它是给bitmap做处理的类,后面两个常量都是mode(模式),有三种模式:
CLAMP、MIRROR和REPETA。
CLAMP会将边缘的一个像素进行拉伸、扩展
MIRROR镜面翻转
REPEAT平移复制shader可设置Matrix,Matrix主要用于对图像的图形处理。
三、Matrix
Matrix是一个3 * 3的矩阵,每个像素点表达了其坐标的X,Y信息,主要用于对图像的图形处理。
Matrix的初始化矩阵,对角线为1,其余为0
Matrix主要可以对图像做4种基本变换
Translate 平移变换
Rotate 旋转变换
Scale 缩放变换
Skew 错切变换Matrix类中的方法,主要也是和这四个变换相关,只是对计算过程做了封装,Matrix作用对象是Bitmap而不是Canvas。
3.1 Translate 平移变换
红点p1平移到白点p时,坐标值
x = x1 + x0
y = y1 + y0矩阵的形式:
Matrix中提供了一个setTranslate()方法,很容易就做到平移,matrix的平移对canvas的坐标系不会造成影响,不像canvas.traslate()方法。
matrix.setTranslate(100f,100f),bitmap在x,y轴上移动了100个px。
代入到平移的公式中:
最终
x = x1 + 100
y = y1 + 100而超出了canvas的部分,则不再显示。
其他几个效果类似。
3.2 关于前乘和后乘
首先,矩阵的乘法不满足乘法的交换规律
在Matrix类中,set方法会重置矩阵中的所有值,而pre和post不会,所以多个效果同时存在时,直接使用set方法会导致前面的设置无效,后面的效果需要采用pre或post,简单记忆就是先使用后一个效果用pre,后一个效果后面作用就是post。
private void init() {
bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.test);
matrix = new Matrix();
matrix.setTranslate(100,100);
matrix.preRotate(15);
}先旋转15度,再上下平移10,注意,matrix的默认中心坐标是(0,0)。
改成
matrix.postRotate(15);
先上下平移10,再整体旋转15度。
其他
1、setXfermode不起作用的解决方法
paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.DST_OUT));这个不起作用了。
setLayerType(View.LAYER_TYPE_SOFTWARE, null);//关掉硬件加速
2、Matrix.mapPoints(int[]);方法转换坐标好像有点问题(硬件加速器已关)
小米手机转换前:365,1025
小米手机转换后:-2,0
华为手机转换前:530,1659
华为手机转换后:339,1464
导致算出的触点坐标不对
解决方案:放弃Matrix.mapPoints(int[])方法来计算,直接使用屏幕坐标减去移动的距离。
参考:
详解Paint的setShader(Shader shader)
Android 自定义View学习(八)——Matrix知识学习
本文介绍了Android中Canvas的基本使用,如绘制背景、轮廓和应用BitmapShader创建高级图形。此外,详细探讨了Matrix的平移变换及前乘、后乘的概念,强调了在多个效果叠加时,使用pre和post的区别。还提到了在不同设备上Matrix.mapPoints(int[])方法可能出现的问题及其解决方案。
964

被折叠的 条评论
为什么被折叠?



