Если у вас есть пользователи андроид, использующие cocos2dx, это не обязательно простая проблема для решения, но это выполнимо, когда вы спускаетесь по кроличьей дыре. Это требует редактирования файла Cocos2dxBitmap.java, что означает, что любые сделанные изменения могут быть переопределены обновлением. В принципе, методы, используемые для измерения текста, являются, хотя и неверными, неадекватными.
Во-первых, нам нужно добавить новую переменную в TextProperty
private final int mX;
Далее замените computeTextProperty код следующим образом:
private static TextProperty computeTextProperty(final String pString, final int unusedWidth, final int unusedHeight, final Paint pPaint) { final FontMetricsInt fm = pPaint.getFontMetricsInt(); final int h = (int) Math.ceil(fm.bottom - fm.top); int maxContentWidth = 0; final String[] lines = Cocos2dxBitmap.splitString(pString, 0, 0, pPaint); /* Compute the max width. */ int temp = 0; float left = 0; for (final String line : lines) { //get a path from text Path path = new Path(); pPaint.getTextPath(line, 0, line.length(), 0, 0, path); RectF bounds = new RectF(); path.computeBounds(bounds, true); temp = (int) FloatMath.ceil(bounds.width()); //if the text extends to the left of 0 if (bounds.left < left) { left = bounds.left; } if (temp > maxContentWidth) { maxContentWidth = temp; //extend the width to account for text rendered to the left of 0 if (left < bounds.left) { maxContentWidth += (int) FloatMath.ceil(Math.abs(left)); } } } left = Math.abs(left); return new TextProperty(maxContentWidth, h, lines, (int) FloatMath.ceil(left)); }
Что есть в основном произошло то, что мы использовали информацию, возвращаемую текстовым путем, чтобы получить, если l eft bound меньше 0, что означает, что оно будет отображаться вне растрового изображения. Мы также расширяем ширину, когда есть несколько строк текста, поскольку мы собираемся сдвинуть все, чтобы они соответствовали левым границам, нам также нужны сдвиги справа.
Наконец, замените Computex с
private static int computeX(final String pText, final int pMaxWidth, final int pHorizontalAlignment, final int pX) { int ret = 0; int expectedWidth = pX + pMaxWidth; switch (pHorizontalAlignment) { case HORIZONTALALIGN_CENTER: ret = expectedWidth/2; break; case HORIZONTALALIGN_RIGHT: ret = expectedWidth; break; case HORIZONTALALIGN_LEFT: ret = pX; default: break; } return ret; }
Вы должны будете делать все сцеплениями себя, но это обеспечит наиболее точный визуализации текста.
'kCCTextAlignmentCenter' лучше, чем' UITextAlignmentLeft' для параметра 'hAliginment:'. – Dalinaum