我試圖在EditText子類中重寫onDraw,以顯示自定義字幕。 我有它的工作,但有一些錯誤。我需要做的就是在視圖左上角的某個偏移處繪製StaticLayout。在EditText子類中的onDraw中獲取無效區域
不幸的是,我在我的onDraw方法中得到的所有東西都是canvas。畫布的大小等於整個屏幕的大小(具有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();
}
不過,我還有一個問題:爲什麼它的工作原理?
我試着重寫視圖類,它的onDraw方法將始終收到一個大小匹配視圖本身的畫布。直接View子類的Canvas將沒有剪裁矩形。 TextView(EditText類的直接祖先)也是如此。但是EditText不一樣。傳遞給EditText的onDraw方法的畫布將始終(或不是?)具有屏幕的大小以及自定義裁剪矩形。這整個「視圖座標在窗口事物中翻譯」看起來很詭異。我不明白爲什麼我應該翻譯座標空間。
我已經嘗試瞭解答案的android源代碼,但沒有找到答案。 EditText沒有自己的onDraw。理論上,重寫TextView onDraw和EditText onDraw應該沒有區別。但是有一個區別。傳遞給onDraw方法的畫布對象將根據TextView或EditText的不同而不同。爲什麼? 我怎麼知道什麼時候應該對矩陣進行變換,以及什麼時候不應該?
getLeft()返回此視圖相對於其父項的左側位置。這對剪裁矩形位置沒有幫助,它與父視圖內部的位置沒有關聯。如果有的話,我可以嘗試獲取相對於窗口的左側和頂部座標,但這不會解決使用無效矩形的問題。 – Alexey
你是對的,我已經更新了我的答案。 – VinceFR
這可行,但我不明白爲什麼(我編輯了我的問題)。所以我會提高你的答案,但我現在不會接受它。 – Alexey