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

5

当我使用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();

它在LTR和RTL布局中的外观完全相同: enter image description here 我知道您可以使用矩阵或canvas.scale()翻转画布,但对于更复杂的情况(如在画布上绘制文本或其他Drawable),这不是可行的选项。
如何在画布上实现RTL绘图的最佳方法?我是否必须计算X轴坐标的反转值?
2个回答

3
据我所知,该框架中没有自动处理画布转换(例如在此情况下进行绘制)或处理视图定位(用于布局)的功能。换句话说,我必须使用View.getLayoutDirection()来确定布局方向并相应地进行计算。由于大多数绘图代码都使用对象的left位置,因此通常可以执行以下操作:
if (isRtl) {
    left = width - shapeWidth - left;
}

其中width是画布的宽度(或者你正在绘制的画布区域的面积,例如如果你已经减去了左右填充所占用的空间),shapeWidth是形状的宽度。然后将形状宽度加到left上,得到right的值。

对于布局子视图也可以采用类似的方法。


3

您可以在onDraw()中调用canvas.scale()来水平翻转所有后续绘图操作的结果。

@Override
protected void onDraw(Canvas canvas) {
    canvas.save()

    boolean isRtl = getLayoutDirection == View.LAYOUT_DIRECTION_RTL
    if (isRtl) canvas.scale(-1f, 1f, (float) width / 2, (float) height / 2)

    //
    // do all your custom drawing here
    //

    canvas.restore()
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接