Android Canvas : 2 基础绘制

目录

2.1 基础图元绘制

2.2 Paint设置

2.3 Bitmap

2.4 旋转/平移/缩放/斜切

2.4.1 旋转(rotate)

2.4.2 平移(translate)

2.4.3 缩放(scale)

2.4.4 斜切(skew)


2.1 基础图元绘制

由Canvas的draw相关的API可以看到其可以绘制一些基础图元如点、线、圆、矩形、圆角矩形、弧形、文字、Bitmap,当然也能绘制某一颜色。由方法名即可知道其绘制的内容。参见Demo BaseDrawAty.

2.2 Paint设置

若将Canvas比作画家的画布,那么Paint就是画笔,可以用来设置所需要常见的颜色、透明度、抗锯齿、混合模式、画笔宽等属性。

颜色setColor setARGB
透明度setAlpha
抗锯齿setAntiAlias
混合模式setBlendMode
画笔宽

setStrokeWidth

填充模式setStyle

2.3 Bitmap

在2.1中我们已经看到有绘制Bitmap了,然后Android还提供其他几种API以供不同场景使用。Demo DrawBitmapAty

        private var mTempBmp: Bitmap? = null
        private var mBitmapRect = Rect()
        private val rectF = RectF(0f, 600f, 400f, 800f)
        private var mMatrix = Matrix()

        init {
            mTempBmp = BitmapFactory.decodeResource(resources, R.drawable.karen).apply {
                mBitmapRect = Rect(0, 0, width, height)
            }
            mMatrix.postScale(1.2f, 1.4f)
            mMatrix.postTranslate(0f, 1100f)
        }

        override fun onDetachedFromWindow() {
            mTempBmp?.apply {
                if (!isRecycled) recycle()
            }
            super.onDetachedFromWindow()
        }

        override fun onDraw(canvas: Canvas?) {
            mTempBmp?.let {
                canvas?.apply {
                    //1.绘制bitmap原图
                    drawBitmap(it, mBitmapRect.left.toFloat(), mBitmapRect.top.toFloat(), null)
                    //2.1 将bitmap映射到某个区域
                    drawBitmap(it, mBitmapRect, rectF, null)
                    //2.2 选取bitmap中的某一部分映射到某个区域
                    mBitmapRect.inset(100, 100)//原Bitmap中的一部分区域(左右上下全部向内缩小100像素后的区域)
                    rectF.offset(0f, 250f)
                    drawBitmap(it, mBitmapRect, rectF, null)
                    //2.3使用Matrix对图片实现形变后再进行显示
                    drawBitmap(it, mMatrix, null)
                }
            }
        }//end of onDraw

2.4 旋转/平移/缩放/斜切

此处的变换主要指Canvas的旋转、平移、缩放、斜切

首先需要指出的是,Canvas的坐标原点在View的左上方(不是手机屏幕),以上变换操作的对象是Canvas的坐标系。如下图,红色部分是手机屏幕绘制图标坐标系,而绿色是则是Canvas的坐标系。

2.4.1 旋转(rotate)

Canvas的旋转以顺时针为正角,默认绕原点旋转,也可以设置绕某一点旋转。详见Demo CanvasRotateAty

public void rotate(float degrees)

public final void rotate(float degrees, float px, float py)

2.4.2 平移(translate)

Canvas进行平移后,整个坐标系都会做平移运动,平移后其坐标原点不一定在View的左上角。Demo CanvasTranslateAty

public void translate(float dx, float dy)

2.4.3 缩放(scale)

Canvas缩放默认以原点为中心进行缩放,当然也可以像旋转一样,一某点为中心进行缩放。Demo CanvasScaleAty

public void scale(float sx, float sy)

public final void scale(float sx, float sy, float px, float py)

我们可以从源码看到,以某点为中心的缩放会经过一下步骤:将Canvas坐标系平移至中心点(坐标原点变换了);以中心点进行缩放;在将坐标系平移至左上角(坐标原点又回到了View的左上角)

public final void scale(float sx, float sy, float px, float py) {
    if (sx == 1.0f && sy == 1.0f) return;
    translate(px, py);
    scale(sx, sy);
    translate(-px, -py);
}

2.4.4 斜切(skew)

斜切,有些地方叫错切,是一种特殊类型的线性变换。Demo CanvasSkewAty

public void skew(float sx, float sy)

参数含义:
float sx:将画布在x方向上倾斜相应的角度,sx倾斜角度的tan值,
float sy:将画布在y轴方向上倾斜相应的角度,sy为倾斜角度的tan值.

X = x + sx * y

Y = sy * x + y

Android之玩转View(七):Canvas的坐标变换

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值