当我使用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布局中看起来完全相同:
我知道您可以使用矩阵或canvas.scale()
翻转画布,但对于更复杂的场景,例如在画布上绘制文本或其他Drawable,这不是一个可行的选项。
在Canvas上完成RTL绘图的最佳方法是什么?我是否真的必须计算X轴坐标的反转值?
答案 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()
}