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的坐标变换

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Android中,可以使用Canvas的drawArc()方法来绘制圆弧。首先,需要创建一个Paint对象来设置画笔的属性,比如颜色、宽度等。在绘制圆弧之前,可以调用setAntiAlias()方法取消锯齿,可以使用setStyle()方法来设置画笔的样式,例如填充、描边等。然后,定义一个RectF对象来确定圆弧所在的矩形区域。最后,调用canvas的drawArc()方法来绘制圆弧。 下面是一个示例代码,展示了如何在自定义的View中使用Canvas绘制圆弧: ```java public class CustomProgress extends View { private Paint mPaint; private int mCircleWidth = 3; public CustomProgress(Context context) { this(context, null); } public CustomProgress(Context context, AttributeSet attrs) { this(context, attrs, 0); } public CustomProgress(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); mPaint = new Paint(); } @Override protected void onDraw(Canvas canvas) { mPaint.setAntiAlias(true); mPaint.setStyle(Paint.Style.FILL); mPaint.setStrokeWidth(mCircleWidth); mPaint.setColor(Color.CYAN); float x = (getWidth() - getHeight() / 2) / 2; float y = getHeight() / 4; RectF oval = new RectF(x, y, getWidth() - x, getHeight() - y); canvas.drawArc(oval, 360, 140, true, mPaint); } } ``` 以上代码展示了一个自定义的View类CustomProgress,在onDraw()方法中使用Canvas绘制了一个圆弧。在绘制圆弧之前,先设置了画笔的属性,然后定义了一个矩形区域,最后调用drawArc()方法绘制了圆弧。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [Android 画圆弧canvas.drawArc() 详解](https://blog.csdn.net/csdn_aiyang/article/details/71616979)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *3* [Android 绘图基础Canvas画布——自定义View基础绘制表盘、矩形、圆形、弧、渐变)](https://blog.csdn.net/YllP_1230/article/details/129321090)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值