Мне не понравились текущие предлагаемые решения (изменение lineHeight или количества строк), потому что они не очень надежны с различными шрифтами, стилями и размерами ... поэтому я выбрал собственное решение:
var cache = {}
createjs.Text.prototype._drawTextLine = function (ctx, text, y) {
this.textBaseline = ctx.textBaseline = "alphabetic";
if (!(this.font in cache)) {
var metrics = this.getMetrics();
cache[this.font] = metrics.vOffset;
}
var offset = cache[this.font];
if (this.outline) {
ctx.strokeText(text, 0, y - offset, this.maxWidth || 0xFFFF);
} else {
ctx.fillText(text, 0, y - offset, this.maxWidth || 0xFFFF);
}
};
буквенное значение textBaseline - самый надежный кроссбраузер и в настоящее время стандарт.
Когда для него установлен экземпляр Text и CanvasRenderingContext2D , мы можем вызвать getMetrics и иметь vOffset изшрифт от вершины его ограничительной рамки до его базовой линии.
Примените это смещение к вызову fillText, и вы, как правило, получите приличную визуализацию шрифта.Кэш предназначен для того, чтобы избежать повторного измерения показателей одних и тех же шрифтов в каждом кадре.
Из (ограниченного количества) тестов, которые я провел до сих пор, похоже, что:
- довольно стабильный кроссбраузер
- с учетом производительности
- очень близко к ожидаемому отрисовке шрифта (как видно в Animate), показывая лишь некоторые незначительные смещения при больших размерах шрифта
И, тем не менее, некоторые шрифты по-прежнему отстой (т. Е. Поппинс), но я подозреваю, что в этом случае это «ошибка» самого шрифта.
Надеюсь, @ lanny будетСкоро у нас есть официальное исправление в createjs, но нет никакой гарантии, когда это будет включено в Animate, к сожалению.