自定义控件扫盲-canvas

简介: 自定义控件扫盲-canvas

Canvas使用



旋转

围绕指定点旋转
public final void rotate(float degrees, float px, float py) 
复制代码


围绕坐标原点旋转
public void rotate(float degrees)
复制代码


平移

public void translate(float dx, float dy)
复制代码

dx dy单位是像素


缩放

sx:x轴缩放的大小

sy:y轴缩放的大小

public void scale(float sx, float sy)
复制代码


px:x轴的缩放点

py:y轴的缩放点

public final void scale(float sx, float sy, float px, float py)
复制代码


保存和恢复

canvas.svae():保存画布

canvas.restore(): 释放画布

代码示例:
override fun onDraw(canvas: Canvas?) {
        super.onDraw(canvas)
        canvas?.save()//保存画布
        canvas?.translate(measuredWidth/2f,measuredHeight/2f)
        for (i in 0..360 step 60){
            canvas?.drawCircle(100f,0f,20f,paint)
            canvas?.rotate(60f)
        }
        canvas?.restore()//释放画布
        canvas?.drawCircle(100f,100f,100f,paint)
    }
复制代码


本例的代码中,save和restore中间的操作将画布移动到了屏幕中央,然后围绕屏幕中央绘制了六个圆。restore后canvas状态复原,再次画圆的参考点变为了左上角,圆绘制在了左上角

代码实现效果:

image.png


画圆

cx:圆心x坐标

cy:圆心y坐标

radius:圆半径

public void drawCircle(float cx, float cy, float radius, @NonNull Paint paint) 
复制代码


画线

startX:绘制起点x坐标

startY:绘制起点y坐标

stopX:绘制终点x坐标

stopY:绘制终点y坐标


一次绘制一条线
public void drawLine(float startX, float startY, float stopX, float stopY,
            @NonNull Paint paint) 
复制代码


一次性绘制多条线
public void drawLines(@Size(multiple = 4) @NonNull float[] pts, int offset, int count,
            @NonNull Paint paint)
复制代码


绘制多个点的代码
override fun onDraw(canvas: Canvas?) {
        super.onDraw(canvas)
        canvas?.translate(measuredWidth / 2f, measuredHeight / 2f)
        val lines = floatArrayOf(-200f, 200f, 200f, 200f, 200f, -200f, -200f, -200f)
        canvas?.drawLines(lines, paint)
    }
复制代码


这段代码的效果就是,绘制两条线:

第一条:  (-200,200)--(200,200),

第二条线:(200,-200)--(-200,-200)

绘制效果

image.png


画椭圆

画椭圆需要构建一个RectF对象

RectF oval = new RectF(150, 200, 500, 400);// 画一个椭圆  
canvas.drawOval(oval, p);
复制代码


画弧形

api
public void drawArc(@NonNull RectF oval, float startAngle, float sweepAngle, boolean useCenter,
            @NonNull Paint paint)
复制代码


绘制代码
val oval = RectF(200f, 200f, 500f, 500f)
    override fun onDraw(canvas: Canvas?) {
        super.onDraw(canvas)
        canvas?.drawArc(oval, 0f, 120f, false, paint)
        canvas?.translate(0f,400f)
        canvas?.drawArc(oval, 0f, 120f, true, paint)
    }
复制代码


绘制效果

image.png


画矩形

api
public void drawRect(float left, float top, float right, float bottom, @NonNull Paint paint) 
复制代码
public void drawRoundRect(@NonNull RectF rect, float rx, float ry, @NonNull Paint paint)
复制代码


绘制代码
override fun onDraw(canvas: Canvas?) {
        super.onDraw(canvas)
        canvas?.apply {
            drawRect(rect, paint)
            translate(0f,500f)
            drawRoundRect(rect,60f,80f,paint)
        }
    }
复制代码
绘制效果

image.png


画多边形

通过Path绘制多边行,path篇有过介绍了


画贝塞尔曲线

通过Path绘制贝塞尔曲线,path篇有过介绍了


画点

api

绘制一个点

public void drawPoint(float x, float y, @NonNull Paint paint)
复制代码

绘制多个点

public void drawPoints(@Size(multiple = 2) float[] pts, int offset, int count,
            @NonNull Paint paint)
复制代码


画图片

绘制图片代码
override fun onDraw(canvas: Canvas?) {
        super.onDraw(canvas)
        canvas?.drawBitmap(bitmap, 300f, 300f, paint)
    }
复制代码
绘制效果

image.png



相关文章
|
存储 编解码 安全
现代IM系统中聊天消息的同步和存储方案探讨
本文原作者:木洛,阿里云高级技术专家,内容有删减和修订,感谢原作者。 1、前言 IM全称是『Instant Messaging』,中文名是即时通讯。在这个高度信息化的移动互联网时代,生活中IM类产品已经成为必备品,比较有名的如钉钉、微信、QQ等以IM为核心功能的产品。
5445 0
|
11月前
|
SQL Java 数据库连接
【潜意识Java】MyBatis中的动态SQL灵活、高效的数据库查询以及深度总结
本文详细介绍了MyBatis中的动态SQL功能,涵盖其背景、应用场景及实现方式。
1270 6
|
消息中间件 前端开发 数据库
RocketMQ实战教程之MQ简介与应用场景
RocketMQ实战教程介绍了MQ的基本概念和应用场景。MQ(消息队列)是生产者和消费者模型,用于异步传输数据,实现系统解耦。消息中间件在生产者发送消息和消费者接收消息之间起到邮箱作用,简化通信。主要应用场景包括:1)应用解耦,如订单系统与库存系统的非直接交互;2)异步处理,如用户注册后的邮件和短信发送延迟处理,提高响应速度;3)流量削峰,如秒杀活动限制并发流量,防止系统崩溃。
|
11月前
|
人工智能 自然语言处理 算法
通义智文:文档应用赋能千行百业
通义智文是阿里巴巴推出的大规模文档处理技术体系,旨在提升生产力效率。最初作为阅读工具发布,现已发展为涵盖文档解析、理解、生成等多方面的技术平台。通义智文支持超长文档处理、多模态文本解析,并在法律、教育等领域提供专业服务。其创新算法如VGT版面分析和Layout-LM多模态模型,显著提升了文档处理精度。应用场景包括PPT创作、故事绘本生成及法律文书审查等,赋能千行百业。
|
存储 分布式计算 Java
存算分离与计算向数据移动:深度解析与Java实现
【11月更文挑战第10天】随着大数据时代的到来,数据量的激增给传统的数据处理架构带来了巨大的挑战。传统的“存算一体”架构,即计算资源与存储资源紧密耦合,在处理海量数据时逐渐显露出其局限性。为了应对这些挑战,存算分离(Disaggregated Storage and Compute Architecture)和计算向数据移动(Compute Moves to Data)两种架构应运而生,成为大数据处理领域的热门技术。
460 2
|
JavaScript 前端开发 C++
如何理解 QML_ELEMENT QML_SINGLETON staic Foo *create(QQmlEngine *, QJSEngine *){return s instance; }
如何理解 QML_ELEMENT QML_SINGLETON staic Foo *create(QQmlEngine *, QJSEngine *){return s instance; }
262 2
|
存储 缓存 安全
解决Edge浏览器提示“此网站已被人举报不安全”
【8月更文挑战第19天】如果Edge浏览器提示“此网站已被人举报不安全”,首先确认网站可信度及安全证书有效性,避免访问可疑网站。检查浏览器是否需要更新,并确保自动更新功能已开启。可暂时关闭Microsoft Defender SmartScreen(不建议长期关闭),清除缓存和Cookies,或检查第三方安全软件设置。若问题持续,考虑重置Edge浏览器设置,保留重要数据。如仍无法解决,联系网站管理员或微软支持。
2836 7
|
Android开发
Android 中选项菜单(Option menu)的用法
Android 中选项菜单(Option menu)的用法
436 0
|
Ubuntu 安全 测试技术
如何在Ubuntu 14.04上安装和配置Postfix作为仅发送的SMTP服务器
如何在Ubuntu 14.04上安装和配置Postfix作为仅发送的SMTP服务器
269 0
|
安全 Linux Shell
Linux服务器配置SSH免密码登录后,登录仍提示输入密码(一次真实的问题排查解决记录)
Linux服务器配置SSH免密码登录后,登录仍提示输入密码(一次真实的问题排查解决记录)
1021 0