Android 中的 Canvas API

安卓API指南——Canvas和Drawable 为了更好的学习和理解Canvas和Drawable,翻译了谷歌官方API指南的文章。自:http://developer.android.com/intl/zh-cn/guide/topics/graphics/2d-graphics.html 有错误欢迎指出。 安卓framework的API提供了一系列供2D绘图的API,允许用户在Canvas画布上渲染自定义的图画,或是修改已有的Vi 阅读详情

使用 Android Widget 组中不存在的自定义 UI 元素并想知道它是如何制作的?

这是 Android 中存在的 Canvas API 的魔力。我认为画布这个名字本身就定义了它是艺术家的游乐场,你必须展示你最好的艺术。

在这个博客中,我们将了解我们将如何学习,

  • 什么是 Android 中的 Canvas API?
  • 了解Canvas实现。
  • 我们如何使用 canvas API 制作自己的 UI 元素?

什么是Android 中的Canvas API?

Android 中的 Canvas API 是一个绘图框架,可帮助我们绘制自定义设计,如线条、圆形甚至矩形。使用这些我们可以根据设计制作任何我们想要的形状。

画布的绘制发生在位图中,我们在其中绘制轮廓,然后 Paint API 帮助填充颜色和我们需要的任何样式。

Canvas有助于创建骨架,而油漆有助于美化设计。

了解Canvas实现

所以,既然我们知道 Canvas 有助于设计视图,那么让我们了解一下视图的渲染方式。有一些布局方法被调用,它们是

在这里,onMeasure() - 测量视图和那里的孩子的大小,onLayout() - 有助于设置大小,而 onDraw() 是有助于在视图上绘制的。

因此,在 onDraw() 中,Canvas用于使用其预先包含的方法进行绘制,例如 drawLine、drawArc 等。但是,画布实际上是如何在屏幕上绘制自身的呢?

Canvas 遵循坐标系在屏幕上绘制自身。它将手机屏幕视为自己的坐标系。

看下图感受一下

所以在这里

  • 左上角代表坐标系中的 (0,0) 点。
  • 然后右下角是坐标系中的 (x,y) 点。
  • 因此,以这种方式,屏幕的中心由 (x/2,y/2) 点表示。

到目前为止,我们已经了解了如何使用 Canvas 以及在画布上绘图时需要注意哪些因素。现在,让我们看看如何使用画布实际绘制。

要绘制我们自己的自定义绘图,我们可以在自己的视图类中进行。在这里,我将创建自己的 CanvasView,

class CanvasView @JvmOverloads constructor(
    context: Context,
    attrs: AttributeSet? = null,
    defStyleAttr: Int = 0
) : View(context, attrs, defStyleAttr) {

    override fun onDraw(canvas: Canvas?) {
        super.onDraw(canvas)
        //here we have to use the canvas API to draw
    }
}

如您所见,在 onDraw() 中,我们将绘制我自己的设计。

现在,要在 Canvas 上绘图,我们需要视图类中的Paint对象。所以要定义油漆,

定义油漆,我将使用

private val myViewPaint =
    Paint().apply {
        isAntiAlias = true
        color = Color.BLACK
        style = Paint.Style.STROKE
    }

在这里,我已经初始化了绘制对象,并为其设置了一个自定义属性,例如颜色和样式,以存储要在画布上绘制的信息。

isAntiAlias - 用于在绘制时使边缘平滑。

现在,让我们从在画布上画一条线开始。在, onDraw() 我会写,

canvas?.drawLine(0f, 5f, 0f, 10f, myViewPaint)

在这里,drawLine() 采用两点坐标和油漆来绘制自身。在上面的代码中,0f 和 5f 是第一个点的 x 和 y 坐标,0f 和 10f 是第二个点的坐标。

同样,我们也可以使用Path()来代替通过点坐标来绘制自定义形状。

路径用于通过将形状从一个点传递到另一个点来绘制形状。要使用 Path 绘制一条线,我们必须使用,

val path = Path().apply {
    moveTo(x1, y1)
    lineTo(x2, y2)
    close()
}
canvas?.drawPath(path, myViewPaint)

在这里,在上面的代码中,我们使用了一条路径来绘制一条线。让我逐行分解以使您理解。

moveTo - 这用于将绘图尖端从一个点移动到另一个点。所以这里的绘图提示已经移动到 (x1, y1)。

lineTo - 用于从 (x1,y1) 到 (x2, y2) 画一条线。当我们移动到 (x1, y1) 时,这将是我们画线的起点。

PS。使用路径,您可以绘制您想要的任何类型的形状。

现在,为了使用路径画线,我们需要使用 canvas.drawPath 而不是之前代码中使用的 canvas.drawLine。

同样,要画一个圆,我们使用

canvas?.drawCircle(x,y,radius,myViewPaint)

其中 x 和 y 是该点的坐标,我们通过圆的半径。

现在,为了最终在屏幕上绘制它,我们在视图的 onDraw 中调用 invalidate()。

要在 Activity 中使用上述 View 类,我们只需在 XML 文件中使用以下内容,

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent">

    <app.himanshu.playground.CanvasView
            android:layout_width="match_parent"
            android:layout_height="match_parent" />
</LinearLayout>

要记住的要点,

  • 由于绘制发生在主 UI 线程上,请避免在同一部分重新绘制时间过长。
  • 不要在 onDraw() 中进行大量计算
  • 画布适用于像素而不是 dp。
Office 365部分安装及同时安装Visio的方法 From MWeb Win版本的Office 365安装包默认安装所有组件,没有选择的页面,在安装Office 365后再安装下载的Visio 2016专业版时,会显示计算机上已经安装了即插即用Office,Visio不可安装,因此可以考虑使用Office部署工具来解决这两个问题。 下载安装Office365和Visio 下载Office部署工具 修改配置 部署工具使用方法... 阅读详情

相关推荐

ESP32内存优化实战:关闭WiFi/LWIP功能释放37KB IRAM的隐藏技巧

本文针对ESP32开发中IRAM内存不足的难题,提供了一种通过关闭WiFi和LWIP协议栈的IRAM优化功能来释放宝贵内存空间的实战技巧。该方法最高可释放约37KB的IRAM,有效解决复杂项目(如WiFi+BLE+语音识别)的编译失败问题,并详细阐述了配置步骤、性能权衡与测试验证方法。

redis7keeper的博客 131

关于Canvas 常用API汇总

Canvas是什么 Canvas英文画布,是HTML5出的一个可以在上面绘制一系列图像的元素。 Canvas的使用场景 可以用于动画、游戏画面、数据可视化、图片编辑以及实时视频处理等方面。 基本使用方法 在HTML文件中 <canvas id="canvasBox" width="" height=""></canvas> <!-- 注解: canvas必须是闭合标签</canvas>不可省,如果省略文档的其他内容将不会显示 只有两个属性width和height如

qq_39923034的博客 8122

Arduino软串口实战:用TTL转RS485模块解决电机通信难题(附完整代码)

本文针对Arduino Uno硬串口与RS485半双工通信不兼容导致电机控制无响应的问题,提供了基于软串口(SoftwareSerial)的完整解决方案。详细讲解了TTL转RS485模块的选型、硬件连接避坑(推荐引脚8和7),并附带了完整的代码实现与调试指南,帮助开发者稳定实现Arduino与电机驱动器的RS485通信控制。

5f4d3s2a1q的博客 781

canvas系列 — canvas常用API介绍

1. Canvas API Canvas API 提供了一个通过JavaScript 和 HTML的<canvas>元素来绘制图形的方式。它可以用于动画、游戏画面、数据可视化、图片编辑以及实时视频处理等方面。 在html里的形式是: <canvas id="canvas"></canvas> js里: Document.getElementById() 方法获取HTML <canvas> 元素的引用。接着,HTMLCanvasElement.getConte

haoyanyu_的博客 6672

数电发票“乐企直连”服务平台建设方案

数字化电子发票“乐企直连”服务平台建设方案

m0_73174802的博客 4853

人大金仓数据库Kingbase FlySync同步程序安装

Kingbase FlySync同步程序(以下简称 KFS)是面向异地容灾、数据集中共享的场景推出的具备在异构数据平台间实现实时、增量数据同步的工具类产品,主要采用了物理日志解析技术,帮助用户解决不同数据平台的数据间可实现任意方向实时移动流转的问题,并保证此过程中数据不丢失,状态可监控,流转数据量可统计。KFS 需要安装的主要组件有 2 个,分别是后端同步程序和管理控制平台,另外KFS的部署方式也有2种,为分离部署何集中部署•集中部署:KFS与数据库部署在同一机器上。

weixin_44312518的博客 1179

canvas的api总结整理

canvas知识整理

林达浪学前端 1359

三相直流无刷电机(带HALL传感器)BLDC控制一

本案例选择TIM0的CH0/CH1/CH2三个通道接入三路原始hall输出信号。三路TIM_CHx(48)通过配置存入到NIP寄存器(new input pattern,3 bits)内。未完待续。

m0_69929716的博客 407

H5--Canvas使用以及API

Canvas前端绘图工具,Canvas API 提供了一个通过JavaScript 和 HTML的元素来绘制图形的方式。它可以用于动画、游戏画面、数据可视化、图片编辑以及实时视频处理等方面。返回的CanvasGradient对象的addColorStop(offset, color)添加渐变颜色。canvas 搭配video。

coding... 2007

17|CI/CD 集成与质量门禁:让精准测试进入发布流水线

本文讲解精准测试如何接入 CI/CD 流水线,并通过质量门禁辅助发布决策。测试开发工程师。Java 后端开发工程师。质量平台 / DevOps 平台建设者。想了解精准测试落地方法的技术负责人。

专注 AI 精准测试平台实战落地,分享从代码 Diff 到回归决策的完整工程闭环。主张“先建数据链路,再上 AI 智能”,让测试从“靠经验”走向“基于风险”。 68

DaVinci配置DID之三:代码实现

本系列主要基于DaVinCi工具链来展开具体DID读写的配置以及最终实现。1,CDD准备2,工具链配置3,代码实现4,验证结果本文讲述流程3话不多说,走你~博主是AutoSar小白,如果哪里表达的有问题,还请大佬们指点指点哈。接下来,让我们在下章关于测试验证的博文再相会哈~

weixin_48498880的博客 5364

【Android】Canvas 相关API

【代码】【Android】Canvas 相关API。

健忘的鱼的博客 235

【AUTOSAR-COM】-10.5-APP CAN Frame/PDU“发送周期不准“的影响因素

一个Tx PDU在COM模块中的数据流; Tx APP CAN Frame/PDU"发送周期不准"的影响因素;

「汽车电子助手」的博客 2388

android canvas 详解,Android基础—Canvas API详解

本节引言:我们可供调用的一些方法,我们分下类:drawXxx方法族:以一定的坐标值在当前画图区域画图,另外图层会叠加, 即后面绘画的图层会覆盖前面绘画的图层。clipXXX方法族:在当前的画图区域裁剪(clip)出一个新的画图区域,这个 画图区域就是canvas对象的当前画图区域了。比如:clipRect(new Rect()), 那么该矩形区域就是canvas的当前画图区域getXxx方法族:获...

weixin_39797693的博客 572

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

Android Canvas API 详细说明与示例

本文介绍了Android中Canvas绘制的基本图形、路径、文字、位图以及变换和图层操作的方法。通过示例代码详细展示了如何绘制直线、矩形、圆角矩形、圆形、三角形等基本图形,以及如何使用Path类绘制贝塞尔曲线。此外,还介绍了文字绘制、位图绘制以及平移、旋转、缩放等变换操作。最后,讲解了如何创建和操作图层。掌握这些API的使用方法和参数含义,可以帮助开发者在自定义View时实现复杂的绘制效果。

居然是阿松的博客 798

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

Android Paint,Canvas api 详解

概述我们通过在画布上绘画进行类比,如下:Canvas:相当于画布,Bitmap提供内存,绘的画会保存在Bitmap中。 Paint:相当于画笔。有了画笔和画笔我们就可以绘画了。Paint 类常用方法设置颜色/** * 参数一:Android内部定义的有Color类包含了一些常见颜色定义 * Color.RED 或者 getResources().getColor(android.R.color

amoscxy的博客 1650

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

Android Canvas API总结和使用方法

转自  http://blog.youkuaiyun.com/shell812/article/details/49783487   Android Canvas API总结和使用方法 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 2

u013134722的博客 1930

安卓中Canvas,paint的Api详解

安卓中Canvas,paint的Api详解概述两种坐标系Canvas保存和还原paint的常用设置设置颜色设置不透明度设置是否抗锯齿设置文本缩放倍数设置字体大小设置下划线设置实心还是空心设置画笔的粗细画图画文字 概述 我们通过在画布上绘画进行类比,如下: Canvas:相当于画布,Bitmap提供内存,绘的画会保存在Bitmap中。 Paint:相当于画笔。 有了画笔和画笔我们就可以绘画了。 两种坐标系 Canvas绘图中牵扯到两种坐标系:Canvas坐标系与绘图坐标系。 Canvas坐标系 Canva

Barryjacket的博客 333

Android Path, Region, Paint, Canvas API篇

Android,Path,Region,Paint,Canvas API介绍。方便查阅。

旧路 1万+

Android基础入门教程——8.3.16 Canvas API详解(Part 1)

前面我们花了13小节详细地讲解了Android中Paint类大部分常用的API,本节开始我们来讲解 Canvas(画板)的一些常用API,我们在Android基础入门教程——8.3.1 三个绘图工具类详解 中已经列出了我们可供调用的一些方法,我们分下类: drawXxx方法族:以一定的坐标值在当前画图区域画图,另外图层会叠加, 即后面绘画的图层会覆盖前面绘画的图层。 clipXXX方法族:在当前的画图区域裁剪

Coder-Pig的猪栏 3万+

Android 之 Canvas API 详解 (Part 1)

结果真是喜闻乐见,毕竟实践出真知,可能是Canvas改过吧,或者其他原因,这里 要看源码才知道了,时间关系,这里我们知道下restore的次数可以比save多就好了, 但是还是建议restore的次数还是少于save,以避免造成不必要的问题~ 至于进栈和出栈的流程我就不话了,笔者自己动笔画画,非常容易理解!方法的时候,会恢复之前Canvas的状态,而此时Canvas的图层栈 会弹出栈顶的那个Layer,后继的Layer来到栈顶,此时的Canvas回复到此栈顶时保存的Canvas状态!

leyang0910的博客 449

Android Canvas的简单的api

一个Canvas对象有四大基本要素: 1、一个用来保存像素的Bitmap 2、一个Canvas在Bitmap上进行绘制操作 3、绘制的东西 4、绘制的画笔Paint 1丶如何获取一个Canvas的对象 Canvas对象的获取方式有三种: 第一种我们通过重写View.onDraw方法,View中的Canvas对象会被当做参数传递过来,我们操作这个Canvas,效果会直接反应在View中。

默默丶遗忘 503

android[api] canvas.saveLayerAlpha

Canvas 在一般的情况下可以看作是一张画布,所有的绘图操作如drawBitmap, drawCircle都发生在这张画布上,这张画板还定义了一些属性比如Matrix,颜色等等。 但是如果需要实现一些相对复杂的绘图操作,比如多层动画,地图(地图可以有多个地图层叠加而成,比如:政区层,道路层,兴趣点层)。 Canvas提供了图层(Layer)支持,缺省情况可以看作是只有一个图层Laye

u014346514的专栏 1279

android canvas 异步_Android Canvas方法总结最全面详解API(小结)

本篇文章主要介绍了Android Canvas方法总结最全面详解API,分享给大家,具体如下:常用方法drawXxx方法族:以一定的坐标值在当前画图区域画图,另外图层会叠加, 即后面绘画的图层会覆盖前面绘画的图层。clipXXX方法族:在当前的画图区域裁剪(clip)出一个新的画图区域,这个 画图区域就是canvas对象的当前画图区域了。比如:clipRect(new Rect()), 那么该矩形...

weixin_39548490的博客 154

android bitmap 描边,Android 绘图之Canvas相关API使用

Android 自定义控件或多或少都会用到Canvas,那么我们就需要熟悉它的API。Canvas给我们提供了大量的的DrawXXX方法,通过这些方法我们就可以绘制出我们想要的效果。接下来看看官方是怎么说的:The Canvas class holds the "draw" calls. To draw something, you need 4 basic components: A Bitma...

weixin_33998219的博客 519

android之canvas相关API

public void translate(float dx, float dy) 平移 如:canvas.translate(160, 10); //把当前画布的原点(默认为0,0)移到(160,10),后面的操作都以(160,10)作为参照点 public void drawCircle(float cx, float cy, float radius, Paint p...

信阳农夫的专栏 326
上一篇: 在Android应用程序中查找退出的原因
下一篇: 在 Android 中实现气泡
不秃头de程序猿
博客等级 码龄5年 4089粉丝 1478原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值