0

我试图在 EditText 子类中覆盖 onDraw 以显示自定义字幕。我已经让它工作了,但是有一些错误。

基本上,我需要做的就是在视图左上角的某个偏移处绘制 StaticLayout。

不幸的是,我在 onDraw 方法中得到的只是画布。画布的大小等于整个屏幕的大小(在具有 320x480 显示器的设备上为 320x480),它的剪辑边界几乎可以是任何东西——它可以是整个视图;如果视图在滚动视图内并且部分可见,则它只能是视图的顶部或底部;它甚至可以是视图内的任意矩形,可能是因为超类仅使其部分区域无效。

因此,如果我有这个大小为 320x48 的视图,我可以获得大小为 320x480 的画布并剪切矩形(200、200、300、230)(左、上、右、下)。我不明白这个剪裁矩形如何映射到我的视图坐标。

我需要知道剪辑矩形的左上角相对于视图的左上角在哪里。不幸的是,我不知道如何得到这个。

补充:
此代码适用于我测试过的所有操作系统版本:

private int[] coordinates = new int[2];
private Matrix identityMatrix = new Matrix();

@Override
protected void onDraw(Canvas canvas) {
    super.onDraw(canvas);
    canvas.save();
    getLocationInWindow(coordinates);
    canvas.setMatrix(identityMatrix);
    canvas.translate(coordinates[0], coordinates[1]);
    //do the drawing in EditText coordinate space
    canvas.restore();
}

但是,我仍然有一个问题:为什么它有效?
我正在尝试覆盖 View 类,它的 onDraw 方法总是会收到一个大小与 View 本身相匹配的画布。直接视图子类的画布将没有剪裁矩形。TextView (EditText 类的直接祖先)也是如此。但 EditText 就不一样了。传递给 EditText 的 onDraw 方法的画布将始终(或不?)具有屏幕大小和自定义剪辑矩形。这整个“通过窗口中的视图坐标进行翻译”似乎很hacky。我不明白为什么要翻译坐标空间。

我已经尝试破解android源代码以获得答案,但没有找到。EditText 没有自己的 onDraw。理论上,重写 TextView onDraw 和 EditText onDraw 应该没有区别。但是有区别。传递给 onDraw 方法的画布对象将根据其 TextView 或 EditText 不同而有所不同。为什么?我怎么知道什么时候应该对矩阵应用变换,什么时候不应该?

4

1 回答 1

2

你可以用View. getLocationOnScreen方法

于 2013-01-11T12:45:24.217 回答