【问题标题】:Get invalidated region in onDraw in EditText subclass在 EditText 子类的 onDraw 中获取无效区域
【发布时间】:2013-01-11 12:37:35
【问题描述】:

我正在尝试覆盖 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 不同而有所不同。为什么? 我怎么知道什么时候应该对矩阵应用变换,什么时候不应该?

【问题讨论】:

    标签: android


    【解决方案1】:

    您可以使用View.getLocationOnScreen 方法获得它

    【讨论】:

    • getLeft() 返回此视图相对于其父视图的左侧位置。这对剪切矩形位置没有帮助,该位置与父视图内的位置无关。如果有的话,我可以尝试获取相对于窗口的左侧和顶部坐标,但这不能解决部分无效矩形的问题。
    • 这行得通,但我不明白为什么(我已经编辑了我的问题)。所以我会赞成你的回答,但我现在不会接受。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多