更新
我最终MongolTextView
从头开始开发了一个垂直脚本。它作为mongol-library
.
以下解决方案的问题是镜像字体中未包含的任何字符(尤其是中文)都会向后出现。
旧答案
蒙古文字体的字形方向与英文的方向一致,即从左到右。这允许将蒙古语单词添加到英语、中文或西里尔文文本中(唯一的问题是这些单词是“放下”而不是“站立”)。
将 TextView 顺时针旋转 90 度将使其垂直,但换行的方向错误(旋转后从右到左而不是从左到右)。换行方向问题可以通过水平翻转或镜像TextView来解决,但是随后所有的字形都被镜像了。最后一个问题可以通过从垂直镜像字体开始解决(可以通过使用FontForge等开源软件编辑现有字体来实现)。下图说明了该过程:
旋转和翻转可以通过扩展 TextView 并覆盖onDraw()
andonMeasure()
方法来完成:
public class MongolTextView extends TextView {
private TextPaint textPaint;
// Constructors
public MongolTextView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
init();
}
public MongolTextView(Context context, AttributeSet attrs) {
super(context, attrs);
init();
}
public MongolTextView(Context context) {
super(context);
init();
}
// This class requires the mirrored Mongolian font to be in the assets/fonts folder
private void init() {
Typeface tf = Typeface.createFromAsset(getContext().getAssets(),
"fonts/MongolFontMirrored.ttf");
setTypeface(tf);
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
// swap the height and width
super.onMeasure(heightMeasureSpec, widthMeasureSpec);
setMeasuredDimension(getMeasuredHeight(), getMeasuredWidth());
}
@Override
protected void onDraw(Canvas canvas) {
textPaint = getPaint();
textPaint.setColor(getCurrentTextColor());
textPaint.drawableState = getDrawableState();
canvas.save();
// flip and rotate the canvas
canvas.translate(getWidth(), 0);
canvas.rotate(90);
canvas.translate(0, getWidth());
canvas.scale(1, -1);
canvas.translate(getCompoundPaddingLeft(), getExtendedPaddingTop());
getLayout().draw(canvas);
canvas.restore();
}
}
在您的 xml 布局中使用扩展 TextView 的全名:
<com.example.MongolTextView
android:id="@+id/title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="10dp"
android:text="@string/title_string" />
已知的问题:
layout_margin
layout_gravity
如果您牢记轮换,则可以正常工作,但是行为padding
却很gravity
奇怪。所以似乎最好使用wrap_content
和避免使用padding
and gravity
。layout_margin
将 MongolTextView 放在 FrameLayout 中并使用and可以达到相同的效果layout_gravity
。
- 此解决方案不处理呈现 Unicode 文本。要么你需要使用非 Unicode 文本(不鼓励),要么你需要在你的应用程序中包含一个渲染引擎。(Android 目前不支持 OpenType 智能字体渲染。希望将来会有所改变。相比之下,iOS 确实支持复杂的文本渲染字体。)请参阅此链接以获取 Unicode 蒙古语渲染引擎示例。