canvas学习

本文介绍了Android中Canvas的基本使用,如绘制背景、轮廓和应用BitmapShader创建高级图形。此外,详细探讨了Matrix的平移变换及前乘、后乘的概念,强调了在多个效果叠加时,使用pre和post的区别。还提到了在不同设备上Matrix.mapPoints(int[])方法可能出现的问题及其解决方案。

一、概述

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知识学习

paint.setXfermode不起作用的解决方法

Android Canvas绘图详解(图文)




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值