美文网首页
View绘制画布的操作

View绘制画布的操作

作者: 石器时代小古董 | 来源:发表于2019-04-16 23:01 被阅读0次
    一、canvas的几何变换

    对canvas进行平移、旋转、缩放、倾斜、裁减后,canvas将不会主动恢复原状,后续绘制的操作都会在这个改变的canvas上进行

    1.canvas的几何变换代码执行顺序是倒序的,如果想要先旋转再平移,那么平移代码要写在最上面,再写旋转的代码
    2.对canvas进行裁减后,后续的绘制内容都在裁减的范围内进行,不在裁减范围内的内容将不会被绘制
    3.反向裁减(clipOutXXX)和正向裁减相反

    canvas.translate(50, 50)
    
    /** 
     * 在X轴方向放大为原来2倍,Y轴方向方大为原来的4倍 
     * 参数1: X轴的放大倍数 
     * 参数2: Y轴的放大倍数 
     */
    canvas.scale(2, 4);
     
    /** 
     * 在X轴方向放大为原来2倍,Y轴方向方大为原来的4倍 
     * 参数1: X轴的放大倍数 
     * 参数2: Y轴的放大倍数 
     * 参数3: 原点X坐标
     * 参数4: 原点Y坐标
     */
    canvas.scale(2, 4,100,100);
    
    /** 
     * 原点为中心,旋转30度(顺时针方向为正方向 )
     * 参数: 旋转角度 
     */
    canvas.rotate(30);
     
    /** 
     * 以(100,100)为中心,旋转30度,顺时针方向为正方向 
     * 参数: 旋转角度 
     */
    canvas.rotate(30,100,100);
    
    //sx为x轴方向上倾斜的对应角度,sy为y轴方向上倾斜的对应角度,两个值都是tan值哦!
    // 都是tan值!都是tan值!比如要在x轴方向上倾斜60度,那么小数值对应:tan 60 = 根号3 = 1.732!
    canvas.skew(0.2f,-0.8f);
    
    canvas.clipRect (Rect rect, Region.Op op)
    
    二、保存和恢复画布的状态

    1.当我们向保存当前画布的状态在将来恢复到这种状态时,可以通过

    canvas.save()
    canvas.restore();
    

    2.canvas内部维护了一个任务栈来保存这些画布的状态,每次save操作都会向栈中放入一个canvas的状态,restore时会恢复栈顶的canvas状态

    例子中 (1)会恢复到b保存的状态,(2)会恢复到a保存的状态。因为b是最新进入栈的任务,它在栈顶的位置

    canvas.save()//a
    canvas.translate(50,50);
    canvas.save();//b
    canvas.restore(); (1)
    canvas.restore(); (2)
    

    3.使用图层来绘制和保存
    canvas提供了图层,可以保存这个图层的状态,并将这个状态交给canvas。

    saveLayer和restoreToCount之间对canvas的几何变换状态将被保存
    位置(3)处绘制的矩形将不完全,因为我们保存了一个500x500大小的图层,但是要绘制的矩形超过了这个图层的范围

    int layerId = canvas.saveLayer(0,0,500,500,mPaint);
    canvas.translate(50,50);
    canvas.restoreToCount(layerId);
    canvas.drawRect(100,100,800,800);(3)
    

    相关文章

      网友评论

          本文标题:View绘制画布的操作

          本文链接:https://www.haomeiwen.com/subject/azxibqtx.html