cocos2dx を使用している Android ユーザーがいる場合、これは必ずしも簡単に解決できる問題ではありません。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));
}
基本的に起こったことは、テキスト パスによって返された情報を使用して、左境界が 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;
}
すべての接続を自分で行う必要がありますが、これにより最も正確なテキスト レンダリングが得られます。