- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我目前正在实现一个简单的 SVG 文本渲染器。我正在从 SVG 文件中提取我需要绘制的字符的路径信息。
这是存储在 JSON 对象中的字体/字符的所有适当信息:
window.font = {
horizAdvX: 487,
unitsPerEm: 2048,
ascent: 1638,
descent: -410,
glyphs: {
H: {
horizAdvX: 1382,
path: 'M147 14q64 133 244 604q-68 29 -90 80q19 14 135 37l27 66q85 217 115 327.5t81 391.5q81 -14 153 -73t126 -147q-8 -11 -17.5 -26t-22 -38.5t-23 -43.5t-27 -55.5t-27 -58.5l-31.5 -69t-32 -71t-35.5 -80.5t-36.5 -81.5q282 39 488 51q77 223 157.5 399.5t136.5 235.5 q42 -3 124.5 -47.5t101.5 -79.5q-69 -65 -143 -210.5t-140 -336.5q41 -38 41 -92q0 -39 -16 -71q-28 4 -76 8q-69 -219 -111.5 -425t-42.5 -319q0 -33 4 -53q-41 2 -65 15t-31 28.5t-18 32t-27 22.5q-26 9 -44.5 74.5t-18.5 110.5q0 160 104 510q-75 -5 -255 -24.5 t-253 -20.5q-166 -392 -231 -750q-73 18 -126 62.5t-98 117.5z'
},
u: {
horizAdvX: 1011,
path: 'M174 119q0 98 16 174q43 181 146 386.5t221 291.5q44 0 99 -16t83 -48q-18 -19 -51 -68t-93 -161t-116 -244q-24 -55 -55 -162.5t-31 -156.5q0 -22 15 -37q29 11 73.5 62.5t134.5 174.5q6 9 36 49t47 64t42.5 63t44 75.5t31.5 70.5q19 51 33 84.5t49.5 91.5t77.5 98 q53 0 114 -20.5t80 -44.5q-28 -68 -104.5 -220.5t-115 -259.5t-38.5 -204q0 -51 11.5 -92t22.5 -64.5t11 -32.5q0 -3 -2 -5t-4 -2l-2 -1q-28 0 -88 24t-106 56q-35 29 -50.5 76t-15.5 90q0 44 10 74q-10 1 -52.5 -51t-95.5 -123t-67 -88q-57 -61 -88 -64q-70 3 -138.5 47.5 t-84.5 112.5z'
},
// rest of chars ...
使用优秀的svg.js库,我已经设法在渲染过程中做到了这一点:
SVG.path
方法绘制字符这会绘制文本。您可以在这个 jsfiddle 上看到这个工作:
http://jsfiddle.net/dormisher/KVs7E/2/
事情是一切都是相同的高度,并且相距完全相同的距离。我需要知道如何使用 SVG 字体文件中的属性 horiz-adv-x
、unites-per-em
等来获得正确的水平和垂直定位。
起初看起来很简单,horiz-adv-x
只是一个用于字体大小的缩放值,所以在水平偏移量上使用它,嘿嘿!但是不,这样做最终会得到如下所示的结果:
http://jsfiddle.net/dormisher/KVs7E/3/
我需要弄清楚的是 horizAdvX 和其他类似值的组合如何用于计算水平前进和垂直定位。我已经阅读了 W3C规范,但就这些东西而言,它对我来说意义不大。
如果有人能帮助我,那就太好了!
最佳答案
诀窍是,相应地缩放字形,然后将它们移动到正确的位置。我刚刚发布了一个 text-morphing extension对于 svg.js,它也从 svg 字体中提取其字形。
我是这样走的:
var glyphs = 'My Text'
, uPerEm = faceElement.getAttribute('units-per-em')
, h = fontElement.getAttribute('horiz-adv-x')
, x = 0
, scale = fontsize / uPerEm
for(var i = 0, len = glyphs.length; i < len; ++i){
// check if there is kerning for this and the letter before
// hkern specifies if the 2 letter move together because of to much space(example: Ya)
if(glyphs[i-1]){
hkern = this.source.querySelector('hkern[u1="'+glyphs[i-1]+'"][u2="'+glyphs[i]+'"]')
if(hkern){
// substract the value from our current x position
x -= parseFloat(hkern.getAttribute('k')) * scale
}
}
// create a new path array with the d-attribute
// in cache, all my loaded glyphs are saved
var p = new SVG.PathArray(cache[glyphs[i]].d)
, box = p.bbox()
// scale AND mirror the glyph (note the minus)
if(box.height && box.width)
p.size(box.width * scale, -box.height * scale)
// move the glyph to its position
p.move(x,(uPerEm - box.y - box.height)*scale)
// draw the path
yourSvgRoot.path(p)
// add up the horiz-adv-x from the glyph or the horiz-adv-x from the font-node if no horiz-adv-x is present
x += parseFloat(cache[glyphs[i]]['horiz-adv-x'] || h) * scale;
}
很多代码。我试图添加评论以帮助理解。基本上我遍历我的字形和大小并根据比例因子定位它们。我现在不知道 flip()
会对路径做什么,但我很确定这有一些问题。最好由 size()
自动为您计算新的路径点。
关于javascript - 手动渲染 SVG 字形,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18644669/
这是我第一次使用字形,但我知道它们是文本,并且可以像任何其他文本一样设置样式。这就是我对为什么我的字形图标没有改变颜色感到困惑的原因。 我希望它将颜色从黑色(默认)更改为白色。这是我的代码: HTML
JavaScript/CSS/web 中有没有办法检测系统是否具有某个 Unicode 字符的有效字形? 例如,我想检测语言中的某个字符是否显示为方形框,因为用户没有显示这些 Unicode 点的字体
在编写继承自 TBitBtn 的自定义控件时,我正在寻找一种方法来覆盖或拦截仅绘制字形并自己绘制字形,而不必重绘整个控件。我广泛使用 VCL 样式,并希望避免重新创建所有绘图和样式 Hook 等。不幸
我正在使用tileserver-gl的Docker镜像来运行服务器(klokantech/tileserver-gl)。 我想像自己的Font Awesome(currently here avail
正如标题所说。我理解,使用复合字符和影响其他字符和连字的字符正确呈现所有 unicode 格式确实很困难。我们的字体似乎是为最大程度的 Unicode 符号支持而设计的(Symbola、Code200
我想将 Unicode 字形渲染为 jpg 格式。我应该更改 java 代码中每个 Unicode block 的字体吗?我试着不那样做,但没有用。但是,为每个 block 更改字体需要花费大量时间。
我有一个可以使用 Facebook 帐户登录的网站,我现在遇到的唯一问题是我无法在按钮中的文本前面从 Facebook 获取字形。在这里你可以看到代码。我也在用 Bootstrap, ';" clas
Twitter Bootstrap 使用字体文件中的图标。如果图标显示在偏离像素的元素中(例如,通过将父级设置为百分比宽度,如 51% 并将图标向右浮动),则图标会变得模糊。 这里是手动设置位置为40
我试图根据 StatusLineId 更改我的字形图标,但没有出现任何字形图标。我做错了什么? HTML 代码: Js函数 function statusIc
我有一个包含许多图标的 SVG 文件: Generated by Fontastic.me 这是我如何链接到 CSS: @font-face { font-family: "m
我在浏览器控制台中收到错误:: glyphicons-halflings-regular.woff2:1 Failed to load resource: the server responded w
几个小时以来,我一直在与 š 的字体样式作斗争。 我正在使用来自 google webfonts 的 webfont“open sans”并测试了 googles review 选项上的字素。一切都很
我需要使用一个看起来像挂锁的 unicode 字符。它用于表单下方的按钮,上面写着“CopyLink __”,上面有一个挂锁,表示当他们复制他们所在页面的链接时,将不会访问“copylink _”版本
你好,我是第一次尝试使用 bootstrap 字形图标,但它没有按我想要的方式工作。 我想要左右图标,所以我选择了 glyphicon-chevron-left 和 glyphicon-chevron
我正在开发一款教授日语的应用程序。问题是,系统使用的默认字体是使用字符的中文变体,而不是日文变体。例如,汉在中文字体中看起来与在日文字体中略有不同,即使它们是相同的 Unicode 代码点。如何指定我
我目前正在实现一个简单的 SVG 文本渲染器。我正在从 SVG 文件中提取我需要绘制的字符的路径信息。 这是存储在 JSON 对象中的字体/字符的所有适当信息: window.font =
当我将鼠标悬停在链接上时,我试图在链接的右侧显示 Bootstrap 字形图标。 我试过同时使用 CSS 和 JS,但它就是行不通。所以我需要一些帮助:) 这就是我想要做的:When i hoover
下面有ajax代码 $.ajax({ type: "POST", url: "shoppingcart_service.asmx/RegisterSub
我正在努力理解这些东西,以便我可以有效地在工作中实现项目的国际化。我刚刚开始,非常想从您的专业知识中了解我是否正确理解了这些概念。到目前为止,这是我从网上收集的内容的简化版本(据我所知): 字符编码
有什么方法可以更改 Eclipse 用于表示空白字符的符号吗?例如,我想将换行符“¶”自定义为更像 Notepad++ 样式“LF”。 我知道如何打开和关闭它们以及更改字体、透明度等。但我还没有找到任
我是一名优秀的程序员,十分优秀!