整理Android绘图时图形变换方法

本文详细介绍了Android中的图形变换方法,包括平移、旋转、缩放和错切等操作,并展示了如何使用Canvas、Matrix和Camera三种方式进行图形变换。还提供了一些实际应用的例子。

Android提供了很丰富的绘图方法,包括图形变换控制,颜色变控制,图形合成等好多内容,这里只简单整理下图形变的控制方法。

首先要知道我们在用画布Canvas进行绘图,Canvas中包含了一个图形变换矩阵Matrix,图形变换都是通过控制Matrix的变换来实现的,包括平移、旋转、缩放和错切等变换。网上关于Matrix矩阵变换的原理很多,搜一下就有了,有高数底子理解起来更容易。再进行变换前先设置几种属性:

// X轴缩放比例
private float scaleX = 1;
// Y轴缩放比例
private float scaleY = 1;
// 顺时针旋转角度
private int rotate;
// X轴旋转角度
private int rotateX;
// Y轴旋转角度
private int rotateY;
// Z轴旋转角度
private int rotateZ;
// X轴平移
private int translateX;
// Y轴平移
private int translateY;
// Z轴平移
private int translateZ;
// X轴错切
private float skewX = 0;
// Y轴错切
private float skewY = 0;
来看下屏幕3D坐标图,参考别人画的:



需要注意的就是Z轴方向是垂直面向屏幕往下,X、Y轴都很熟悉了。

Canvas变换

@Override
protected void onDraw(Canvas canvas) {
    canvas.translate(translateX, translateY);
    // 设置以中点为基准点,默认图形左上角为原点坐标
    canvas.rotate(rotate, getWidth() / 2, getHeight() / 2);
    canvas.scale(scaleX, scaleY, getWidth() / 2, getHeight() / 2);
    // canvas的错切方法不提供设置某个点为基准点
    canvas.skew(skewX, skewY);
    super.onDraw(canvas);
}
Matrix变换
@Override
protected void onDraw(Canvas canvas) {
    canvas.getMatrix(mMatrix);
    mMatrix.preRotate(rotate, getWidth() / 2, getHeight() / 2);
    mMatrix.preScale(scaleX, scaleY, getWidth() / 2, getHeight() / 2);
    mMatrix.preSkew(skewX, skewY, getWidth() / 2, getHeight() / 2);
    mMatrix.postTranslate(translateX, translateY);
    // concat()方法合并当前canvas中的Matrix和所设置的Matrix
    canvas.concat(mMatrix);
    super.onDraw(canvas);
}
Camera变换
@Override
protected void onDraw(Canvas canvas) {
    mCamera.save();
    mCamera.translate(translateX, translateY, translateZ);
    mCamera.rotate(rotateX, rotateY, rotateZ);
    mCamera.getMatrix(mMatrix);
    // 先将旋转的基准点平移到中点,旋转完后再还原
    mMatrix.preTranslate(-getWidth() / 2, -getHeight() / 2);
    mMatrix.postTranslate(getWidth() / 2, getHeight() / 2);
    mCamera.restore();
    // concat()方法合并当前canvas中的Matrix和所设置的Matrix
    canvas.concat(mMatrix);
    super.onDraw(canvas);
}
一般用法

比较常见的用法是,用Camera控制3D变换,其它变换直接用Canvas变换,错切见的比较少,比如:

@Override
protected void onDraw(Canvas canvas) {    
    canvas.translate(translateX, translateY);
    // 设置以中点为基准点,默认图形左上角为原点坐标
    canvas.rotate(rotate, getWidth() / 2, getHeight() / 2);
    canvas.scale(scaleX, scaleY, getWidth() / 2, getHeight() / 2);
    if (rotateX != 0 || rotateY != 0) {
        mCamera.save();
        mCamera.rotateX(rotateX);
        mCamera.rotateY(rotateY);
        mCamera.getMatrix(mMatrix);
        // 先将旋转的基准点平移到中点,旋转完后再还原
        mMatrix.preTranslate(-getWidth() / 2, -getHeight() / 2);
        mMatrix.postTranslate(getWidth() / 2, getHeight() / 2);
        mCamera.restore();
        // concat()方法合并当前canvas中的Matrix和所设置的Matrix
        canvas.concat(mMatrix);        
    }
    super.onDraw(canvas);
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值