비트맵에 RTL 텍스트(아랍어)를 그리고 올바르게 정렬하는 방법은 무엇입니까?

StackOverflow https://stackoverflow.com/questions/1417503

  •  07-07-2019
  •  | 
  •  

문제

표시할 비트맵에 아랍어 텍스트를 그리려고 합니다.

Bitmap img = Bitmap.createBitmap( (int) f+100, 300, Config.RGB_565);
Canvas c = new Canvas();
c.setBitmap(  img );
mFace = Typeface.createFromAsset(getAssets(),"DejaVuSansCondensed.ttf");
mPaint.setTypeface(mFace);
content = "يجري";
content = ArabicUtilities.reshape( content );
System.out.println("Drawing text: " + content);
c.drawText(content, 30, 30, mPaint);

ArabicUtilities 클래스는 문자가 연결되도록 유니코드 텍스트의 모양을 변경하는 도구입니다.보다: http://github.com/agawish/Better-Arabic-Reshaper/

그러나 생성된 비트맵은 다음과 같습니다.

대체 텍스트 http://imagebin.ca/img/J1EB8DWc.jpg

다음과 같아야 할 때 يجري

나는 문제가 텍스트뷰, Bitmap 클래스는 BiDi를 인식하지 않으므로 왼쪽에서 문자를 그려서 씁니다.

아무리 노력해도 올바른 순서로 텍스트를 그리는 방법을 알 수 없습니다.

도움이 되었습니까?

해결책

Canvas는 실제로 Canvas of Skia(네이티브 그래픽 엔진)를 둘러싼 래퍼입니다.Skia는 BiDi/재형성을 수행하지 않으며 단순히 일련의 글리프를 그립니다.

반면에 TextView는 간단한(실제로는 멍청한) BiDi를 수행하는 레이아웃 및 파생 클래스와 같은 Android의 텍스트 관련 개체를 많이 사용합니다.Android의 BiDi는 매우 멍청해서 RTL의 숫자도 처리할 수 없습니다.'튤리 180'은 '튤리 081'로 표시됩니다.

개인적으로 저는 Android의 현재 BiDi를 신뢰하지 않으며 유니코드-BiDi 호환 클래스를 직접 작성하여 필요할 경우 사용합니다.수동으로 모양을 바꾸는 것 외에 수동 BiDi를 사용하는 것이 좋습니다.기억하다:먼저 BiDi를 만든 다음 모양을 바꿔보세요!

살람

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top