在自定义视图中绘制时支持 RTL 语言环境

Kar*_*uri 5 android android-custom-view right-to-left

当我使用 Canvas 在我的自定义视图中绘制时,是否有一种简单的方法可以在不手动反转坐标计算的情况下为 RTL 区域设置绘制?

作为一个非常人为的例子,这是一个自定义视图,在 onDraw() 中包含以下内容:

int w = getWidth();
int h = getHeight();
canvas.save();

mPaint.setColor(Color.RED);
canvas.drawRect(0, 0, w / 2, h, mPaint);
mPaint.setColor(Color.BLUE);
canvas.drawRect(w / 2, 0, w, h, mPaint);

int size = h / 4;
mPaint.setColor(Color.GREEN);
int paddingEnd = ViewCompat.getPaddingEnd(this);
canvas.translate(-paddingEnd, getPaddingTop());
canvas.drawRect(w - size, 0, w, size, mPaint);

canvas.restore();
Run Code Online (Sandbox Code Playgroud)

它在 LTR 和 RTL 布局中看起来完全相同:

在此处输入图片说明

我知道您可以使用矩阵或 canvas.scale(),但是对于更复杂的场景,例如在画布上绘制文本或其他可绘制对象,这不是一个可行的选择。

在 Canvas 上完成 RTL 绘图的最佳方法是什么?我真的必须计算 X 轴坐标的倒置值吗?

Kar*_*uri 3

据我所知,框架中没有任何东西可以自动处理画布变换(用于绘图,如本例所示)或处理定位视图(用于布局)。换句话说,我必须自己做这项工作View.getLayoutDirection()来确定布局方向并进行相应的计算。left由于大多数绘图代码都与对象的位置一起工作,因此您通常可以执行类似的操作

if (isRtl) {
    left = width - shapeWidth - left;
}
Run Code Online (Sandbox Code Playgroud)

其中width是画布的宽度(或您正在绘制的画布区域,例如,如果您已经减去左右填充消耗的量), 是shapeWidth形状宽度。然后添加形状宽度left以获得right值。

类似的方法可用于布置子视图。