2012-10-31 27 views
0

我想用Canvas.drawText界面显示带有元音点(nikkud)的希伯来文字。元音点出来错位,作为使用摩托罗拉Defy +装置采取以下的图像中:Android中希伯来语元音点的对齐方式

Misaligned vowels

的hiriq是RESH和YOD中,VAV和嫩之间的holam之间。 我已经将rtl代码(\ u200F)添加到字符串的两端,没有喜悦。 我知道有些应用程序已经解决了这个问题,比如Smart Siddur。基于文本的应用程序和基于图形的应用程序有区别吗?我会认为在这两种情况下,相同的引擎会呈现文本。我想我可以分开字符串并单独放置元音,但这看起来非常痛苦而且不可扩展。
TIA任何线索。

回答

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; 
} 

}

0

这可能是您使用的字体的问题,因为您也可能在台式机上重现相同的问题。尽管目前Android本身具有希伯来字形,但供应商之间存在很大差异,所以即使它能在一台设备上正常工作,它在其他设备上也不能很好地工作。

我的建议是通过提供自己的字体来解决此问题。例如,您可以使用免费的Culmus Project字体,其中大部分已知可以很好地支持希伯来元音点。

+0

我试用过Gisha字体和从Culmus简单的字体。两者都没有喜乐。 –

+0

我尝试了在字符串两端添加\ u200F的所有可能组合。结合和分开,我尝试了paint.setTextAlign(Align.RIGHT/Align.LEFT/Align.Center)。这些参数都没有任何影响。
在这一点上,我试图实现手动解决方案,分别遍历每个代码点。我无法相信这个问题没有解决。 –