Microsoft.Maui.Graphics.Skia 使用 DrawString 绘制文本的坐标问题
本文记录使用 Microsoft.Maui.Graphics.Skia 的 DrawString 进行绘制文本,不同的重载方法绘制的文本的坐标不同的问题
本文开始之前,预期已经准备好了环境和基础项目,请参阅 dotnet 控制台 使用 Microsoft.Maui.Graphics 配合 Skia 进行绘图入门
在采用 void DrawString(string value, float x, float y, HorizontalAlignment horizontalAlignment) 方法进行绘制时,文本将在 x y 坐标开始,作为文本的 BaseLine 开始绘制。为了方便大家看出来效果,我在坐标点绘制一个矩形和一个文本
核心代码如下
var skiaCanvas = new SkiaCanvas();
skiaCanvas.Canvas = skCanvas;
ICanvas canvas = skiaCanvas;
canvas.Font = new Font("微软雅黑");
canvas.FontSize = 100;
canvas.DrawString("汉字", 100, 100, HorizontalAlignment.Left);
canvas.StrokeColor = Colors.Blue;
canvas.StrokeSize = 2;
canvas.DrawRectangle(100, 100, 500, 500);
如上面代码,在 100,100 的坐标开始绘制文本,同时也在此坐标绘制矩形,输出如下

可以看到文本是从 100,100 作为左上角的基线 BaseLine 开始绘制的。这里需要科普文本的 基线 BaseLine 是什么。其实大家学英语到知道四线三格吧,如下图,第三条线就是 BaseLine 基线

我将汉字换成英文,更方便大家了解
canvas.FontSize = 100;
canvas.DrawString("abcfgj", 100, 100, HorizontalAlignment.Left); // 换成英文
canvas.StrokeColor = Colors.Blue;
canvas.StrokeSize = 2;
canvas.DrawRectangle(100, 100, 500, 500);
运行代码,可以看到输出如下

但在采用的是 void DrawString(string value, float x, float y, float width, float height, HorizontalAlignment horizontalAlignment, VerticalAlignment verticalAlignment, TextFlow textFlow = TextFlow.ClipBounds, float lineSpacingAdjustment = 0F) 方法进行绘制文本,那将会让绘制的文本完全放在 float x, float y, float width, float height 这个矩形框里面,如以下代码
canvas.FontSize = 100;
canvas.DrawString("汉字", 100, 100, 500, 500, HorizontalAlignment.Left, VerticalAlignment.Top);
canvas.StrokeColor = Colors.Blue;
canvas.StrokeSize = 2;
canvas.DrawRectangle(100, 100, 500, 500);
运行代码,可以看到输出如下

可以看到文本在矩形内
接下来分别设置文本的水平和垂直方向的布局:
- 文本的水平居中
canvas.DrawString("汉字", 100, 100, 500, 500, HorizontalAlignment.Center, VerticalAlignment.Top);
运行代码,可以看到输出如下

- 文本的水平居右
canvas.DrawString("汉字", 100, 100, 500, 500, HorizontalAlignment.Right, VerticalAlignment.Top);
运行代码,可以看到输出如下

- 文本的垂直居中
canvas.DrawString("汉字", 100, 100, 500, 500, HorizontalAlignment.Left, VerticalAlignment.Center);
运行代码,可以看到输出如下

- 文本的垂直距下
canvas.DrawString("汉字", 100, 100, 500, 500, HorizontalAlignment.Left, VerticalAlignment.Bottom);
运行代码,可以看到输出如下

如果文本的实际渲染大小超过给定的矩形范围,可以通过 TextFlow 参数决定是裁剪还是允许超过范围。横排文本布局的超过范围是在 Y 坐标上超过边界。默认参数是超过给定的范围就裁剪
更多的 MAUI 相关博客,还请参阅我的 博客导航
可以通过如下方式获取本文的源代码,先创建一个空文件夹,接着使用命令行 cd 命令进入此空文件夹,在命令行里面输入以下代码,即可获取到本文的代码
git init
git remote add origin https://gitee.com/lindexi/lindexi_gd.git
git pull origin 042fcb09fe9ce6c3d16ebab6d7432b6bc92c7c4e
以上使用的是 gitee 的源,如果 gitee 不能访问,请替换为 github 的源。请在命令行继续输入以下代码
git remote remove origin
git remote add origin https://github.com/lindexi/lindexi_gd.git
git pull origin 042fcb09fe9ce6c3d16ebab6d7432b6bc92c7c4e
获取代码之后,进入 SkiaSharp\RulawnaloyerKairjemhemwemlayca 文件夹
我建立了一个 SkiaSharp 的群: 788018852 欢迎大家加入讨论
Microsoft.Maui.Graphics.Skia 使用 DrawString 绘制文本的坐标问题的更多相关文章
- dotnet 控制台 使用 Microsoft.Maui.Graphics 配合 Skia 进行绘图入门
本文将告诉大家如何在 dotnet 的控制台模式下,采用 MAUI 自绘库 Microsoft.Maui.Graphics 进行绘图,设置 Microsoft.Maui.Graphics 底层调用 M ...
- 使用GDI绘制文本
/// <summary> /// 定义一个绘制文本 /// </summary> public void Texts() ...
- 『备注』GDI+ 绘制文本有锯齿,透明背景文本绘制
背景: GDI+ 绘制文本 时,如果 背景是透明的 —— 则会出现 锯齿. //其实,我不用这三个 属性 好多年了 //而且,这三个属性 在关键时刻还有可能 帮倒忙 //关键是:这三个属性,鸟用都没有 ...
- 使用WebBrowser控件时在网页元素上绘制文本或其他自定义内容
原文:使用WebBrowser控件时在网页元素上绘制文本或其他自定义内容 第一次在CNBlogs上发Post是提出一个有关使用WebBrowser控件时对SELECT网页元素操作的疑惑,这个问题至今也 ...
- Qt绘制文本一
QPainterPath,使用 drawText且设置字体,再使用painter.drawText方式 效果图: void WgtText::paintEvent(QPaintEvent *event ...
- Win10系列:VC++绘制文本
20.7.2小节介绍了如何使用Direct2D在应用窗口中绘制图片,本小节将基于20.7.2小节的项目进一步介绍如何实现文本的绘制.打开D2DBasicAnimation.h头文件,并在D2DBasi ...
- Qt之图形(绘制文本)
简述 前面我们讲解了Qt图形的基本绘制,其中包括: 绘制文本.直线.直线.矩形.弧线.椭圆.多边形.图片,以及其它一些高级用法,比如:渐变.转换等. 本节我们来详细讲解文字的绘制.主要通过QPaint ...
- html5 canvas 笔记三(绘制文本和图片)
绘制文本 fillText(text, x, y [, maxWidth]) 在指定的(x,y)位置填充指定的文本,绘制的最大宽度是可选的. strokeText(text, x, y [, ma ...
- FontMetrics ----- 绘制文本,获取文本高度
Canvas 绘制文本时,使用FontMetrics对象,计算位置的坐标. public static class FontMetrics { /** * The maximum distance a ...
- Quartz2D 之 绘制文本
1. 基础概念 1.1. 字体(Font) 同一大小.同一样式的字形的集合. 1.2. 字符(Character) 字符表示信息本身,一般指某种编码,如Unicode编码. 1.3. 字形(Glyph ...
随机推荐
- 记录--TS类型写不好?一起来训练提升吧!
这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 前期准备 本篇文章的编写目的是为了提升TS类型的书写质量,高质量的类型可以提高项目的可维护性并避免一些潜在的漏洞; 在学习本篇之前需要有一 ...
- mybatis xml 文件 sql include 的用法
mybatis xml 文件中对于重复出现的sql 片段可以使用标签提取出来,在使用的地方使用标签引用即可具体用法如下: <sql id="Base_Column_List" ...
- archlinux修改btrfs文件系统大小出现ERROR: unable to retrieve fs info
提权sudo就可以了 例: sudo btrfs filesystem resize max /
- .NET开源、免费、跨平台的Git可视化管理工具
前言 俗话说得好"工欲善其事,必先利其器",合理的选择和使用可视化的管理工具可以降低技术入门和使用的门槛.今天大姚给大家分享一款.NET Avalonia开源.免费.跨平台.快速的 ...
- #莫队,bitset#洛谷 3674 小清新人渣的本愿
题目 分析 只要做到\(O(n\sqrt{n})\)的时间复杂度就可以了 考虑莫队,首先乘号就是枚举\(x\)的约数\(d\), 判断\(d\)和\(\frac{x}{d}\)是否同时出现, 再考虑差 ...
- OHOS IDE和SDK的安装方法
参照OpenHarmony应用开发环境安装流程,下载安装OHOS的IDE,过程中需要全程联网. IDE,安装至D:\Tools\Huawei\DevEcoStudio. IDE安装成功之后,按照提示下 ...
- 深究可见性,原子性,有序性的解决方案之volatile源码解析
上节java内存模型(jmm)概念初探大致了解了由于cpu的快速发展,导致的越来越复杂的内存模型诞生,java内存模型相当于是底层内存模型的映射(实际并不是一一映射,但可以借鉴理解),也是衍生出并发三 ...
- RabbitMQ 11 死信队列
死信队列 概述 消息队列中的数据,如果迟迟没有消费者来处理,就会一直占用消息队列的空间. 比如抢车票的场景,用户下单高铁票之后,会进行抢座,然后再进行付款,但是如果用户下单之后并没有及时的付款,这张票 ...
- IE8页面失去焦点,动态删除element
当页面失去焦点(切换到其他标签页 / 切换到其他软件),触发失焦事件,然后动态删除element 兼容IE8 if(window.ActiveXObject){ window.attachEvent( ...
- win10上鼠标右键怎么进入cmd
背景: 在win7上有个很好的功能,在文件夹空白区域,按住 " ctrl + 鼠标右键 " 可以直接打开 cmd 窗口 但是在win10上同样的操作方法,打开的窗口却是 power ...