首页
学习
活动
专区
圈层
工具
发布

dotnet 简单聊聊 Skia 里的 SKFontMetrics 的各项属性作用

基线是排版里面一个重要的概念,基线(Baseline)是字母(拉丁字母、希腊字母、西里尔字母)放置的水平线。排版里面对齐基线非常重要 在各个文本、字体渲染引擎里面,都会将基线当成 0 点。...这个值通常是负的,因为大多数字形的底部在基线以下。 Leading:表示字体的行间距(leading),即每行文字之间的额外空间。它是上一行 descent 到下一行 ascent 之间的间距。...它通常用于调整字体大小和行高,以确保小写字母的清晰显示 由此可以看到和 DriectX 的 DWRITE_FONT_METRICS 结构体比较相似 在 Skia 里面,通过 DrawText 方法绘制文本时...兼容的方法只好取 SKFontMetrics 的 Leading 来参与计算 本文代码放在 github 和 gitee 上,可以使用如下命令行拉取代码。...我整个代码仓库比较庞大,使用以下命令行可以进行部分拉取,拉取速度比较快 先创建一个空文件夹,接着使用命令行 cd 命令进入此空文件夹,在命令行里面输入以下代码,即可获取到本文的代码 git init git

37010
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    dotnet 读 WPF 源代码笔记 聊聊 OpenType 定义的字体特性

    本文记录我读 WPF 源代码的 OpenType 字体特性标签 OpenType Feature Tags 的笔记内容 本文部分内容由 AI 辅助记录和整理 在 WPF 里面,关于 Feature Tag...在 WPF 代码里面,直接给出的是整数,但在注释里面写明了对应的字符 整个 OpenType 规范里定义的字体特性可以被分为几个大类,比如通用排版、数字相关、大小写相关、连字相关、东亚文字(中日朝、印度文字相关...ContextualAlternates(calt):上下文替代字形,根据相邻字符自动替换字形,比如手写体里同一个字母在不同位置写法不一样,就是这个特性控制,默认大部分排版场景开启。...CapitalSpacing(cpsp):大写字母间距,专门调整全大写文本的字符间距,让大写文本更透气易读。...,避免空隙过大或重叠 ContextualAlternates calt 上下文替代字形,默认开启,根据相邻字符自动替换字形(比如手写体中同一个字母在词首/词中写法不同) StandardLigatures

    10610

    latex 引用文献_latex引用多个参考文献

    LaTeX插入参考文献,简单高效 Latex参考文献的引用 Latex中用Bibtex来引用文献 Latex能改变单独一篇参考文献字体的颜色吗?...可以在\begin{thebibliography}{}后添加\addtolength{\itemsep}{-1.5ex}来缩小行间距。-1.5ex表示每行缩小1.5ex。...其实细心观察可以发现,thebibliography其实是一个枚举环境,因此对于itemize和enumerate,可以用同样的方法缩小行间距。 使用thebibliography十分繁琐。...有没有什么更好的方法呢?答案是:有的。那就是bibte!...(xys在使用mdpi模板过程中,并没有采用这个步骤,也是可以的) Step2:添加引用配置 在Latex文档里面添加BibTex库的引用,要在哪里显示参考文献,就在哪里添加如下内容 (一般引用文献都在文章末尾

    4.3K10

    探究WPF中文字模糊的问题:TextOptions的用法

    有网友问WPF中一些文字模糊是什么问题。...像素对齐和抗锯齿 我们经常听到WPF具有分辨率无关性这个说法,因为WPF使用的是与设备无关的绘图系统,为字体和形状等内容指定大小或者尺寸的数值并不是真实的像素,在WPF中称之为设备无关单位。...两种模式都有各自的优势和缺点,Ideal模式可以提供最佳的字形和间距,减少用户阅读疲劳,但是在较小的字体情况下,文字渲染会模糊。...Ideal模式在大于15pt的字体情况下,和Display模式渲染的文字一样清晰,且具有更好的字形和间距。此外以下三种情况也应选择Ideal模式。...WPF中ClearType可以朝Y轴方向抗锯齿,使文本字符中平缓曲线的顶端和底端变得平滑。

    1.5K10

    文字如何实现完美UI?文本排版设计告诉你

    1,什么是文本排版? “文本排版,“又称“文字设计”,是一种涉及对字体、字号、缩进、行间距、字符间距进行设计、安排等方法来进行排版的一种工艺。...此外,在设计手机端字体大小时,需要留意设计字体大小要比常规、使用在桌面端的略大一些。 ? 2. 间距 1) 行间距 行间距是一排文字和另一排文字之间的空间。...你可能会认为,在一个段落里,字距调整可能不是一个必要问题。但如果您足够细心,您可能会注意到,这通常出现在英文文本中,大写字母与小写字母之间的空间和两个小写字母之间的空间不尽相同。...3) 全文本字间距 上面不是刚提了字距吗?这里是否重复了呢?当然不是,字距在两个文字间和全文本的字间距并不是完全一样的概念。这两者往往可能会使设计师产生迷惑,但它们类似却不同。...接下来可以做什么?确保用户可以轻松地执行操作。功能性文本需要突出,可点击的元素应该足够大,以便用户可以点击它们。 ? 8. 对齐 通常,文本对齐方式有4种:左,右,中或两端对齐。

    3.2K70

    「Adobe国际认证」再优秀的设计师,也无法避免的 9 个,平面设计错误!

    简而言之,字距调整是您写作中字母之间的间距。 看看下面的图片。你能看出有和没有字距调整的设计区别吗? 字距调整后文本在视觉上看起来更有吸引力,不是吗?...确保在字母之间添加同样感知的空间 眯着眼睛或交叉你的眼睛,这样你就可以看到字母之间的空间,而不会被字符分散注意力 同样注意单词之间的间距,而不仅仅是字母之间的间距 考虑“桌面优先” 认为桌面优先是一个巨大的错误...研究还证实,留白最多可以提高 20% 的理解力。 例如,请注意空格的使用如何使第二段中的文本比下面第一段中的文本更具可读性: 将留白视为与字体或颜色一样重要的设计元素。不要害怕使用它!...所以你知道你必须做什么,对吗?为您的用户设计。 如何避免这种设计错误?...随时了解与设计相关的 AI 的所有流行发展 密切关注您可以学习的示例,例如 Nutella 和 Netflix 通过探索如何使用它们来改进您的设计来拥抱新的变化 从表面上看,设计似乎很简单,但在这个过程中有很多想法

    82920

    pdf转换为word为什么变得乱七八糟

    为什么 pdf 和 word 存储文档方式不同 pdf 将页面保存为固定的绘图, 把每个字母和图片放在页面的某个位置, word 把文本保存为段落, 样式和会随字体或页面大小变化的对象, 因为 pdf...字体, 间距和字符定位 pdf 可以嵌入字体或使用精确的字符间距, 转换器可能找不到精确的字体而替换成别的字体, 不同字体会改变换行和间距, 还有些 pdf 把文本作为单个字符或小组绘制以控制精确位置,..., 转换这些需要光学字符识别 ocr, ocr 常常误读字母和布局, 磨针工具软件 可以提醒需要手动校对的部分, 这是普通人觉得方便的地方....常见问题(FAQ)  任何工具都能完美转换 pdf 吗 不能, 有些工具在带标签或简单布局的 pdf 上表现更好, 复杂页面, 大量图形或扫描件很少能在不人工修复的情况下完美转换.  ...为什么单词会被拆分或出现多余空格 因为有些 pdf 为了控制布局把字符单独放置, 转换器在解释这些分离片段为单词或行时可能插入空格或换行.

    23910

    WPF面试题大全,秒杀面试官必备

    为什么在WPF会使用它? 6、WPF中什么是样式? 7、阐述WPF中什么是模板? 8、阐述WPF视觉树VS 逻辑树? 9、解释—下ResourceDictionary ?...14、简述WPF会取代DirectX吗 ? 15、在WPF项目什么是App.xaml? 16、简述什么是WPF中的值转换器 ?...18、你用过WPF中的触发器吗?触发器有哪几种? 19、在WPF中,什么是DataContext?它的作用是什么? 20、WPF中的MVVM模式是什么?它的优势是什么?...为什么在WPF中使用依赖属性: • 数据绑定和样式:依赖属性天生支持数据绑定和样式,使开发人员可以轻松地实现动态更新和样式化的UI元素。...7、阐述WPF中什么是模板? 答:WPF中的模板是一种用于定义控件外观的机制。它可以使用XAML或代码来定义。在XAML中,模板可以定义在Template元素中。

    4.5K11

    【愚公系列】2023年11月 WPF控件专题 RepeatButton控件详解

    在WPF中,RepeatButton控件继承自ButtonBase类,可以通过设置RepeatButton的属性和事件来实现控件的行为和外观。...这样可以让用户方便地调节某个值或进行某个操作,不需要频繁点击或拖动。在WPF中,RepeatButton控件非常常见,可以用于各种需求中。...在我们的MainWindow.xaml.cs代码文件中,我们需要实现一个RepeatButton_Click方法,该方法将在用户按下RepeatButton按钮时被调用。...在这个方法中,我们可以编写逻辑来增加或减少计数器的值,并将该值显示在标签控件上。...最后,我们将更新后的值显示在标签控件上。这是一个简单的例子,说明如何使用WPF中的RepeatButton控件。通过使用该控件,您可以方便地实现许多功能,例如增加和减少值,调整音量等。

    1.6K12

    【转】使用DirectUI技术实现QQ界面

    也就是说,这个1/3的代码都可以由xml+javascript替代! 同理,如果网页开发时,每个图片都需要由web程序绘制,你能想象一个网页的代码量有多少吗?...最近的Office2007 Ribbon界面,如果使用Spy++查看,可以见到一个名为"NetUI"的窗口,其实这也是微软内部DirectUI的一个变种。...具体来说:只要界面是用文件来配置,都是界面和逻辑分开,VC的用的是*.rc文件,WPF用的是*.xaml文件、LibUIDK用的是*.ui文件。难道VC的对话框程序就不是界面和逻辑分开吗?...如果自己写的这个List不但可以作为Item,还可以作为父控件,那它就是一个DirecutUI的控件了。 由于不受限于微软的很多约束,所以自由发挥的余地比较大。但发挥到什么程序,还要看各厂家的实力。...所以不是说用DirectUI就一定可以开发QQ、MSN类似的界面,也不是说不用DirectUI就不能开发这样的界面。它们也是没有任何关系的。 当然,什么东东都是有利有弊的。

    2.1K50

    将 PDF 转换为字距问题 - 文本截断和不完整

    这通常是因为转换工具无法读取以下间距属性:字母间距(字母之间的距离)行距(行与行之间的空间)段落间距(段落之间的空间)下面我们来探讨一下在不丢失文本格式的情况下转换PDF的具体问题和解决方案。...为什么会发生这种情况:制表符和空格混淆:原始 PDF 使用空格来创建缩进。转换工具可能会错误计算空格,并转换为 Word 中相应的制表符。2....为什么会发生这种情况:- 固定行距与相对行距的转换:Word 通常使用灵活的行距(例如单倍行距、1.5 倍行距、双倍行距),这些行距会随字体大小而变化。...PDF 通常会明确说明行距的位置,或使用固定的数字来设置行距。这两种方法之间的转换比较复杂。...为什么会发生这种情况:- 为了在将 PDF 转换为 Word 后保持原始布局,每个文本框的位置和大小都是固定的。

    93500

    通过解读 WPF 触摸源码,分析 WPF 插拔设备触摸失效的问题(问题篇)

    Please select yours: 中文 English 所谓“触摸失效”,指的是无论你如何使用手指或触摸笔在触摸屏上书写、交互,程序都没有任何反应。而使用鼠标操作则能正常使用。...本文所述的“触摸失效问题”我在 WPF 程序无法触摸操作 一文中有所提及,但本文偏向于分析其内部发生的原因。 本文与 林德熙 的 WPF 插拔触摸设备触摸失效 所述的是同一个问题。...此触摸失效问题的解决方法 在推断出初步原因后,根本的解决方法其实只剩下两个了: 修复 WPF 的 Bug 由于我们无法编译 .NET Framework 的源码,所以几乎只能由微软来修复这个...那我们非微软开发者可以做些什么呢? 降低 CPU 占用率 虽然这不由我们控制,不过我们如果能降低一些意料之外的高 CPU 占用,则可以大幅降低 WPF 触摸失效问题出现的概率。...然而作为用户又可以做些什么呢?

    1.1K10

    Windows 消息循环

    Windows 消息循环 && 消息循环在 WPF 中的应用 使用 EN5 课件获得更好的阅读体验: 【希沃白板5】课件分享 : 《Windows培训 - 消息循环》 https://r302.cc/...4 消息循环在 WPF 中的应用 4.1 引入 只听说过 Dispatcher ,哪里来的消息循环? 先瞧一眼 WPF 启动运行堆栈: 可以发现 PushFrameImpl 这个方法。...这意味着,可以在 DispatcherObject 中(如 Window 中), 使用 this.Dispatchcer 获取到 Dispatchcer 。...在默认的 WPF UI 线程中:App.Current.Dispatcher = DispatcherObject.Dispatcher 所有的线程(UI线程,普通线程)都有 Dispatcher 吗?...最终这个Foo()方法就被执行了。 4.4 回顾 WPF 底层仍然靠信息循环来驱动。 Dispatcher 使用消息循环来实现跨进程的委托调用。

    64510

    WPF 最小的代码使用 DynamicRenderer 书写

    在 WPF 中有 DynamicRenderer 提供高性能的书写,这个类在 WPF 只有 InkCanvas 使用,如果想要在自己的 UIElement 使用,需要写一些代码 先创建一个 UIElement...的 UIElement 现在里面什么都没写 public class MeexikelelHaiwurbe : UIElement { } 为了使用 DynamicRenderer...,也就是附加的 MeexikelelHaiwurbe 是不可见的 从 WPF 高速书写 StylusPlugIn 原理 可以知道,在 StylusPlugIn 要收到触摸的消息,需要附加的元素可以收到消息才可以...所以下面需要设置 MeexikelelHaiwurbe 的宽高 设置宽高 在 UIElement 有一个方法是 HitTestCore 设置命中测试,通过这个方法可以判断一个点是否点到了元素上,于是重新这个方法...,无论什么点都返回这个元素,于是这个元素就可以做到命中测试,宽度和高度都是最大 当然有层级的关系,不会点到任何的地方都命中这个元素,关于层级请看 WPF 的原理 WPF 源代码 从零开始写一个 UI 框架

    53720

    WPF 最小的代码使用 DynamicRenderer 书写 输入层设置宽高视觉树

    在 WPF 中有 DynamicRenderer 提供高性能的书写,这个类在 WPF 只有 InkCanvas 使用,如果想要在自己的 UIElement 使用,需要写一些代码 先创建一个 UIElement...的 UIElement 现在里面什么都没写 public class MeexikelelHaiwurbe : UIElement { } 为了使用 DynamicRenderer...,也就是附加的 MeexikelelHaiwurbe 是不可见的 从 WPF 高速书写 StylusPlugIn 原理 可以知道,在 StylusPlugIn 要收到触摸的消息,需要附加的元素可以收到消息才可以...所以下面需要设置 MeexikelelHaiwurbe 的宽高 设置宽高 在 UIElement 有一个方法是 HitTestCore 设置命中测试,通过这个方法可以判断一个点是否点到了元素上,于是重新这个方法...,无论什么点都返回这个元素,于是这个元素就可以做到命中测试,宽度和高度都是最大 当然有层级的关系,不会点到任何的地方都命中这个元素,关于层级请看 WPF 的原理 WPF 源代码 从零开始写一个 UI 框架

    1.3K10

    WPF 同一窗口内的多线程 UI(VisualTarget)

    2018-09-05 05:47 WPF 的 UI 逻辑只在同一个线程中,这是学习 WPF 开发中大家几乎都会学习到的经验。...如果希望做不同线程的 UI,大家也会想到使用另一个窗口来实现,让每个窗口拥有自己的 UI 线程。然而,就不能让同一个窗口内部使用多个 UI 线程吗?...---- WPF 同一个窗口中跨线程访问 UI 有多种方法: 使用 VisualTarget (本文) 使用 SetParent 嵌入另一个窗口 前者使用的是 WPF 原生方式,做出来的跨线程 UI 可以和原来的...后者使用的是 Win32 的方式,实际效果非常类似 WindowsFormsHost,新线程中的 UI 在原来的所有 WPF 控件上面遮挡。另外,后者不止可以是跨线程,还可以跨进程。...用这个方法创建的控件,直接就是后台 UI 线程的。 当然,如果你需要自己控制初始化逻辑,可以使用委托创建控件。

    2.9K20

    鸿蒙应用开发从入门到入行 - 篇3:ArkUI布局基础与制作可交互页面

    所以用一个Row包起来,因为Row有从左到右布局子组件的能力,而这两个文字就需要从左到右,只不过一个在起点,一个在终点(即在首尾),所以这里到时候还可以给它做一个主轴上的布局为SpaceBetween。...为什么呢?所有内容行与行之间没有间距,导致挨的太紧。...(具体看截图,可以看到在哪看console.log输出的内容)小结:在输入框里,使用成员变量前加 $$即可双向绑定需注意:目前$$仅能用在基本数据类型且绑定给内置组件装饰器 - @State从上面的效果可以看到...我们回顾一下事件:on事件名,事件名首字母大写,例如:onClick、onChange提示框:需要先导入import { promptAction } from '@kit.ArkUI'然后使用promptAction.showToast...提示:打勾部份可以用Image也可以用Checkbox,如需要做出布局,需要自行根据文档预习Progress、Stack、List等互动环节你觉得鸿蒙开发跟你以前会的开发,区别大吗?欢迎留下你的观点。

    88510
    领券