自定义View 二&Matrix

Matrix类

顾名思义,名字为矩阵。

但是在这里是对自定义View的一个强大工具。

首先在绘制方面,拥有缩放scale平移translate旋转rotate错切skew操作,主要就是对矩阵的数值进行改变。参考文章:具体概念点这里

在学习了过后,首先需要知道矩阵是什么?就是一个n*m的行列式(通俗点)。
但是在线性代数里面,它叫:矩阵。

所以,这里我们有用到线性代数的知识。

咳咳,扯远了,关于线性代数的知识详情请找度娘。


方法:讲道理,一般情况都会有set,get方法,但是矩阵这里有一个前乘,后乘的存在。

Matrix方法表

方法类别相关API摘要
基本方法equals hashCode toString toShortString比较、 获取哈希值、 转换为字符串
数值操作set reset setValues getValues设置、 重置、 设置数值、 获取数值
数值计算mapPoints mapRadius mapRect mapVectors计算变换后的数值
设置(set)setConcat setRotate setScale setSkew setTranslate设置变换
前乘(pre)preConcat preRotate preScale preSkew preTranslate前乘变换
后乘(post)postConcat postRotate postScale postSkew postTranslate后乘变换
特殊方法setPolyToPoly setRectToRect rectStaysRect setSinCos一些特殊操作
矩阵相关invert isAffine isIdentity求逆矩阵、 是否为仿射矩阵、 是否为单位矩阵 …

这里主要讲一下数值计算、特殊方法。


数值计算

  • mapPoints();

    重构方法如下

    public void mapPoints(float[] pts);
    public void mapPoints(float[] dst, float[] src)
    public void mapPoints(float[] dst, int dstIndex, float[] src, int srcIndex, int pointCount)
    

    第一个是对点进行计算,并且将计算后的值赋给pts;
    第二个是对src进行计算,计算后的值赋给dst,src的值不变;
    第三个是通过下标进行点的计算,注意是下标,不是第几个点。
    例如:

    float[] src = new float[]{0, 0, 80, 100, 400, 300};
    float[] dst = new float[6];
    // 调用map方法计算(最后一个2表示两个点,即四个数值,并非两个数值)
    matrix.mapPoints(dst, 0, src, 2, 2);
    

    每个的计算都是matrix.preXXX() or matrix.postXXX()操作后进行mapPoints得到的值。

  • mapRadius();

    float mapRadius (float radius)
    

    测量半径,由于圆可能会因为画布变换变成椭圆,所以此处测量的是平均半径。

    实例

    float radius = 100;
    float result = 0;
    
    // 构造一个matrix,x坐标缩放0.5
    Matrix matrix = new Matrix();
    matrix.setScale(0.5f, 1f);
    
    Log.i(TAG, "mapRadius: "+radius);
    
    result = matrix.mapRadius(radius);
    
    Log.i(TAG, "mapRadius: "+result);
    

    结果:

    mapRadius: 100.0
    mapRadius: 70.71068
    

    注意,是平均值,可以想象一下,一个矩形宽缩小了一半,高不变,得到的结果是,圆变成了内切的椭圆。

  • mapRect 和 mapVector用用看看值的数值理解。

特殊方法

  • setPolyToPoly
    主要的参数如下:

        boolean setPolyToPoly (
        float[] src,    // 原始数组 src [x,y],存储内容为一组点
        int srcIndex,   // 原始数组开始位置
        float[] dst,    // 目标数组 dst [x,y],存储内容为一组点
        int dstIndex,   // 目标数组开始位置
        int pointCount) // 测控点的数量 取值范围是: 0到4
    

    这是一个常用的方法,可以实现一些emmm类似于3d(自我感觉)的效果譬如:(搬运工)

    实例图

    主要的概念看这里setPolyToPoly

  • setRectToRect

        boolean setRectToRect (RectF src,           // 源区域
            RectF dst,                  // 目标区域
            Matrix.ScaleToFit stf)      // 缩放适配模式
    

    简单来说就是将源矩形的内容填充到目标矩形中,然而在大多数的情况下,源矩形和目标矩形的长宽比是不一致的,到底该如何填充呢,这个填充的模式就由第三个参数 stf 来确定。

    ScaleToFit 是一个枚举类型,共包含了四种模式:

    CENTER 居中,对src等比例缩放,将其居中放置在dst中。

    START 顶部,对src等比例缩放,将其放置在dst的左上角。

    END 底部,对src等比例缩放,将其放置在dst的右下角。

    FILL 充满,拉伸src的宽和高,使其完全填充满dst。

-其他方法请自我了解点击

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值