gpt4 book ai didi

javascript - Raphael JS 文本沿路径

转载 作者:数据小太阳 更新时间:2023-10-29 04:09:18 24 4
gpt4 key购买 nike

我正在寻找一个例子或对一个概念的一些确认。希望在应用程序上使用 Raphael JS,并希望能够像 Illustrator 等图形设计应用程序那样扭曲文本。

example of warped Text following a path

最佳答案

这是对 Chris Wilson 代码的改编,重构为一个插入函数,并增加了一些特性:

  • IE8/VML 模式支持Gecko/Firefox 支持(通过定义旋转原点 - 没有这个,IE8 和 Firefox 会疯狂地在页面周围乱扔文本)
  • 一个小调整,使 Gecko 浏览器(例如 Firefox)中的文本不那么难看 - 没有这个,这些会任意增加字母间距
  • 支持手动定义的字体大小和字母间距,以及动态“填充路径”大小和间距
  • 支持手动kerning(逐个字符微调字母间距)。路径上的文本通常会产生非常丑陋的字母空间;这允许您通过以下方式定义手动调整来修复这些问题:
    • 字符串中的数字位置,或者,
    • 字符,或者,
    • 字符对(应用于基于前面字符的字符实例,例如下面的示例收紧“ae”对并加宽“rn”对)

JSBIN DEMO

function textOnPath( message, path, fontSize, letterSpacing, kerning, geckoKerning) {
// only message and path are required, other args are optional
// if fontSize or letterSpacing are undefined, they are calculated to fill the path
// 10% of fontSize is usually good for manual letterspacing

// Gecko, i.e. Firefox etc, inflates and alters the letter spacing
var gecko = /rv:([^\)]+)\) Gecko\/\d{8}/.test(navigator.userAgent||'') ? true : false;

var letters = [], places = [], messageLength = 0;
for (var c=0; c < message.length; c++) {
var letter = paper.text(0, 0, message[c]).attr({"text-anchor" : "middle"});
letters.push(letter);

if (kerning) {
if(gecko && geckoKerning) {
kerning = geckoKerning;
}
var character = letter.attr('text'), kern = 0;
var predecessor = letters[c-1] ? letters[c-1].attr('text') : '';

if (kerning[c]) {
kern = kerning[c];
} else if (kerning[character]) {
if( typeof kerning[character] === 'object' ) {
kern = kerning[character][predecessor] || kerning[character]['default'] || 0;
} else {
kern = kerning[character];
}
}
if(kerning['default'] ) {
kern = kern + (kerning['default'][predecessor] || 0);
}
messageLength += kern;
}

places.push(messageLength);
//spaces get a width of 0, so set min at 4px
messageLength += Math.max(4.5, letter.getBBox().width);
}

if( letterSpacing ){
if (gecko) {
letterSpacing = letterSpacing * 0.83;
}
} else {
letterSpacing = letterSpacing || path.getTotalLength() / messageLength;
}
fontSize = fontSize || 10 * letterSpacing;

for (c = 0; c < letters.length; c++) {
letters[c].attr("font-size", fontSize + "px");
p = path.getPointAtLength(places[c] * letterSpacing);
var rotate = 'R' + (p.alpha < 180 ? p.alpha + 180 : p.alpha > 360 ? p.alpha - 360 : p.alpha )+','+p.x+','+p.y;
letters[c].attr({ x: p.x, y: p.y, transform: rotate });
}
}

关于javascript - Raphael JS 文本沿路径,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13686564/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com