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

时间:2015-12-04 15:56:37

标签: 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();

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

enter image description here

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

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

2 个答案:

答案 0 :(得分:3)

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

的操作
if (isRtl) {
    left = width - shapeWidth - left;
}

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

可以使用类似的方法来布置子视图。

答案 1 :(得分:0)

您只需在canvas.scale()内调用onDraw()即可水平翻转所有进一步绘制操作的结果。

@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()
}