View绘制系列(10)-Canvas基础变换

Canvas基础变换

前面学习了Canvas相关的一些绘制方法,不知道大家发现没?我们都是根据左上角(0,0)点算出来新的坐标,然后再绘制,这样明显不符合我们平常基于坐标原点绘制的习惯,那么我们能不能直接在原点绘制图形,然后通过操作Canvas来实现移动到目标位置呢?答案是肯定的,这就需要用到Canvas变换方法了。

Canvas变换方法总体分为四类:平移,旋转,放缩,错切。

平移

代码如下:

@Override
protected void onDraw(Canvas canvas) {
    super.onDraw(canvas);
    //移动画布坐标原点到View几何中心
    canvas.translate(getWidth()/2,getHeight()/2);

    Paint paint = new Paint();
    paint.setStyle(Paint.Style.STROKE);
    paint.setColor(Color.BLUE);
    paint.setStrokeWidth(20);

    canvas.drawCircle(0,0,200,paint);
    //保存当前绘制
    canvas.save();

    //恢复画布到绘制圆的状态
    canvas.restore();
}

绘制效果:

View绘制系列(10)-Canvas基础变换


旋转

代码如下:

Paint paint = new Paint();
paint.setStyle(Paint.Style.STROKE);
paint.setColor(Color.BLUE);
paint.setStrokeWidth(20);
//旋转画布30度,中心旋转,以顺时针方向为正,逆时针方向为负
canvas.rotate(30);
canvas.drawRect(600,600,1000,900,paint);
canvas.save();
canvas.restore();

运行效果:

View绘制系列(10)-Canvas基础变换

放缩

代码如下:

Paint paint = new Paint();
paint.setStyle(Paint.Style.STROKE);
paint.setStrokeWidth(20);paint.setColor(Color.GRAY);
//绘制原始圆环
canvas.drawCircle(600,600,400,paint);
canvas.scale(0.5f,0.5f);
paint.setColor(Color.BLUE);
//绘制缩放0.5f的圆环
canvas.drawCircle(600,600,400,paint);
canvas.save();
canvas.restore();

绘制效果:

View绘制系列(10)-Canvas基础变换

错切

代码如下:

Paint paint = new Paint();
paint.setStyle(Paint.Style.STROKE);
paint.setStrokeWidth(20);

paint.setColor(Color.GRAY);
//绘制原始圆环
canvas.drawRect(100,0,600,600,paint);
canvas.save();
//y轴逆时针旋转45度,x轴不变
canvas.skew(1,0);
paint.setColor(Color.BLUE);
//绘制缩放0.5f的圆环
canvas.drawRect(100,0,600,600,paint);
canvas.save();
canvas.restore();

运行效果:

View绘制系列(10)-Canvas基础变换

对于canvas.skew(float sx,float sy)方法而言,sx及sy分别表示画布在x及y方向上倾斜角度对应的tan值,当不需要旋转时,值取。

当sx=1时,表示将画布向X正方向旋转45度,其实就是X轴不变,Y轴逆时针旋转45度

当sy=1时,表示将画布向Y正方向旋转45度,其实就是Y轴不变,X轴顺时针旋转45度

如下图所示:

View绘制系列(10)-Canvas基础变换

在错切作用下,用于坐标轴夹角发生变化,所以原始图形和变换后图形并不一定落在同一个左顶点,修改上述代码中左顶点坐标为(100,100),运行效果如下图所示:

View绘制系列(10)-Canvas基础变换

具体造成原因如下图:

View绘制系列(10)-Canvas基础变换


原文始发于微信公众号(小海编码日记):View绘制系列(10)-Canvas基础变换

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/67918.html

(0)
小半的头像小半

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!