كيف يمكن رسم نص 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);

تعتبر فئة ArabUtilities أداة لإعادة تشكيل نص Unicode بحيث يتم توصيل الحروف.يرى: http://github.com/agawish/Better-Arabic-Reshaper/

ومع ذلك، فإن الصورة النقطية التي تم إنشاؤها تبدو كما يلي:

نص بديل http://imagebin.ca/img/J1EB8DWc.jpg

عندما ينبغي أن تبدو يجري

أعتقد أن المشكلة ترجع إلى أنه، على عكس أ عرض النص, ، فئة الصورة النقطية ليست على دراية بتقنية BiDi، لذا فهي تسحب الحروف من اليسار للكتابة.

حاول قدر المستطاع، لا أستطيع معرفة كيفية رسم النص بالترتيب الصحيح.

هل كانت مفيدة؟

المحلول

يعتبر Canvas عمليا غلافًا حول Canvas of Skia (محرك الرسومات الأصلي).لا يقوم Skia بإجراء أي BiDi/إعادة تشكيل، بل يرسم ببساطة تسلسلات من الحروف الرسومية.

من ناحية أخرى، يستخدم TextView عددًا كبيرًا من الكائنات المرتبطة بالنص في Android، من بينها Layout والفئات المشتقة التي تقوم بعمل BiDi بسيط (في الواقع غبي).BiDi الخاص بنظام Android غبي جدًا لدرجة أنه لا يمكنه حتى التعامل مع الأرقام في RTL:يتم عرض "طولي 180" "طولي 081".

أنا شخصياً لا أثق في BiDi الحالي لنظام Android، وسأكتب صفي المتوافق مع Unicode-BiDi وأستخدمه إذا احتجت لذلك.أقترح عليك استخدام دليل BiDi بالإضافة إلى إعادة التشكيل اليدوي.يتذكر:أولًا BiDi، ثم أعد تشكيله!

السلام

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top