在EditText子类中的onDraw中获取无效区域

时间:2013-01-11 12:37:35

标签: android

我正在尝试在EditText子类中覆盖onDraw,以显示自定义字幕。 我有它的工作,但有一些错误。

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

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

因此,如果我的视图大小为320x48,我可以获得尺寸为320x480的画布和剪裁rect(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本身相匹配的画布。直接View子类的Canvas没有剪切矩形。 TextView(EditText类的直接祖先)也是如此。但是EditText并不相同。传递给EditText的onDraw方法的Canvas将始终(或不?)具有屏幕大小和自定义剪切矩形。整个“窗口事物中的视图坐标翻译”似乎非常hacky。我不明白为什么要翻译坐标空间。

我已经尝试过黑客攻击Android源代码,但没有找到。 EditText没有自己的onDraw。从理论上讲,重写TextView onDraw和EditText onDraw之间应该没有区别。但是有区别。传递给onDraw方法的canvas对象将根据其TextView或EditText而有所不同。为什么? 我如何知道何时应将转换应用于矩阵,何时不应?

1 个答案:

答案 0 :(得分:1)

您可以使用ViewgetLocationOnScreen方法