2013-01-11 61 views
0

我試圖在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的不同而不同。爲什麼? 我怎麼知道什麼時候應該對矩陣進行變換,以及什麼時候不應該?

回答

1

你可以通過ViewgetLocationOnScreen方法

+0

getLeft()返回此視圖相對於其父項的左側位置。這對剪裁矩形位置沒有幫助,它與父視圖內部的位置沒有關聯。如果有的話,我可以嘗試獲取相對於窗口的左側和頂部座標,但這不會解決使用無效矩形的問題。 – Alexey

+0

你是對的,我已經更新了我的答案。 – VinceFR

+0

這可行,但我不明白爲什麼(我編輯了我的問題)。所以我會提高你的答案,但我現在不會接受它。 – Alexey