1

我想使用 Canvas.drawText 界面显示带有元音点 (nikkud) 的希伯来语文本。元音点未对齐,如下图使用摩托罗拉 Defy+ 设备拍摄的:

错位元音

hiriq 介于 resh 和 yod 之间,holam 介于 vav 和修女之间。我在两端的字符串中添加了 rtl 代码 (\u200F),不高兴。我知道有些应用程序已经解决了这个问题,例如 Smart Siddur。基于文本的应用程序和基于图形的应用程序之间有区别吗?我认为同一个引擎在这两种情况下都会呈现文本。我想我可以拆分字符串并将元音分开放置,但这似乎很痛苦且不可扩展。
TIA 的任何线索。

4

2 回答 2

1

好吧,以下工作。我仍然不明白为什么我必须实施它,但这确实有效......

 package com.lomda.ong2;

import java.util.HashMap;

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Paint.FontMetricsInt;
import android.graphics.Typeface;
import android.graphics.Paint.Align;
import android.graphics.Paint.FontMetrics;
import android.graphics.Point;
import android.graphics.Rect;
import android.util.Log;

// render Hebrew strings with diacritic marks
// 
public class HebRender {

Paint paint;
HashMap<String, Integer> spaces;
String charString;
String prevChar = "";
final String TAG = "HebRender";

public HebRender(Context svContext){
    paint = new Paint(); 
    Typeface t =  Typeface.createFromAsset(svContext.getAssets(),"fonts/SimpleCLM-Bold.ttf");
    //Typeface t =  Typeface.createFromAsset(svContext.getAssets(),"fonts/gisha.ttf");
    paint.setTypeface(t);
    paint.setStyle(Paint.Style.FILL); 
    paint.setTextSize(48); 
    paint.setAntiAlias(true); 
    paint.setTypeface(Typeface.DEFAULT_BOLD); 
    paint.setTextAlign(Align.CENTER);
}

public void drawText(   Canvas canvas, String word, Point locate, int color) {
    Rect bounds = new Rect();
    Rect prevBounds = new Rect(0,0,0,0);
    paint.getTextBounds(word, 0, word.length(), bounds);
    paint.setColor(color);
    int wordWidth = bounds.width();
    // move to right edge (parameter is center)
    locate.x += wordWidth/2;
    // initialize bounds of individual characters
    bounds = new Rect(0,0,0,0);
    // for each character
    for (int i = 0; i < word.length(); i++) {
        // locate and write letter
        char c = word.charAt(i);
        charString = String.valueOf(c); 
        if (c >= 1488 && c <=1514) {// is in consonant range
            paint.getTextBounds(charString, 0, charString.length(), bounds); // get current char dimensions
            if (!prevChar.equals("")) {
                int moveOver = bounds.width()/2 + prevBounds.width()/2 + (int) paint.getTextSize()/10;
                locate.x -= moveOver;
            }
            Log.d(TAG, String.format("Char: %s, Prev char width: %d, char width: %d", charString, prevBounds.width(), bounds.width()));
            canvas.drawText(charString, locate.x, locate.y, paint);
            prevChar = charString;
            prevBounds.set(bounds); // save previous dimensions
        } else {// for each diacritic locate and write
            canvas.drawText(charString, locate.x + getOffset(c, bounds.width()), locate.y, paint);
        }

    }
}

// some diacritic marks need to be moved 
private int getOffset(char c, int charWidth) {
    int offset = 0;
    switch (c){
    case 0x05C1:  // shin dot
        offset = charWidth/2;
        break;
    case 0x05C2:  // sin dot
        offset = -charWidth/2;
        break;
    case 0x05BC:  // dagesh
        offset = findDagesh(c, charWidth);
        break;
    case 0x05B9: // holam
        offset = -(3*charWidth/5);
        break;
    }
    return offset;
}

// move dagesh around for certain characters
private int findDagesh(char c, int charWidth) {
    int offset = 0;
    if (prevChar.equals("ג")) {
        offset = Math.min(2, -charWidth/3);
    } else if (prevChar.equals("ו") ||prevChar.equals("ז") || prevChar.equals("י")){
        offset = Math.min(7, -7*charWidth/10);
    } else if (prevChar.equals("ע") || prevChar.equals("ש") ) {
        offset = Math.max(1, charWidth/3);
    } else if (prevChar.equals("פ")){
        offset = Math.max(2, charWidth/3);
    }
    return offset;
}

}

于 2012-11-28T12:21:21.523 回答
0

这可能是您使用的字体的问题,因为您也可以在台式计算机上重现相同的问题。尽管如今 Android 本身也有希伯来语字形,但供应商之间存在很大差异,因此即使它在一个设备上运行良好,但在其他所有设备上都无法正常运行。

我的建议是通过提供您自己的字体来解决这个问题。例如,您可以使用来自Culmus Project的字体,这些字体是免费的,并且其中大多数都可以很好地支持希伯来语元音点。

于 2012-11-05T10:58:48.680 回答