我會這樣做。
- 用戶輸入的值,並單擊按鈕
- 當按鈕被點擊隱藏的TextView並用ImageView的取代它或保持TextView的裝上的TextView頂部ImageView的(重疊的ImageView的的上的TextView可以用的FrameLayout
- 繪製在的OnDraw()方法
- 隨着用戶的線和數字水龍頭上的ImageView的ImageView的實現,隱藏ImageView的和再次顯示的TextView。
最後如果位置2的是固定的,你不需要測量文本。 如果位置不固定,可以將數字放入數組中。下面是在混合爲了一些代碼(未測試)
var resStr1 = Integer.toString(resultNumber);
var position = 0;
...
// METHOD 1, multiple 2's in a number
var j = 0;
for (int i = 0; i < resStr1.length(); i++){
char c = s.charAt(i);
if (c == '2') {
position[j] = i;
j++;
}
}
// METHOD 2. ONLY ONE 2 in a number
position = resStr1.indexOf('2');
// CONTINUE
...
Paint p = new Paint();
...
float left = customMarginLeft + p.measureText(resStr1.substring(0, position));
float top = customMarginTop;
...
canvas.drawRect(bla bla bla...
drawText() // ??
進去一看也getTextBounds()如果你想獲得文字高度了。
關於onDraw方法,不要關心繫統會調用多少時間,如果性能很關鍵,只需保留包含全局結果和預先計算的變量的作用域,就放在主類中控制繪圖方法行爲的屬性和方法。一旦另一個元素與您的控件重疊或系統發生某種情況,系統會每次重複繪製線條,因此onDraw一次又一次被調用的事實是正常的,否則您的線條不會再次重繪並可能消失從屏幕上如果發生什麼事情。 當然,上面的代碼也可以放在一個自定義控件(組合控件)中。
要清除行,您應該調用invalidate()或postInvalidate()方法。這種方法將清除整個區域並強制再次調用onDraw()。然後把全球像
shouldRedrawLines = false;
,並在的onDraw()標誌做這樣的事情:
if (shouldRedrawLines) { // please note that the onDraw is called again and again and this condition allows you to check if in another part of the program you decided to clear the lines
DrawLines(); // contains the code for redrawing lines
}
DrawNumbersFromResult(); // contains the code for redrawing Numbers
簡單不?
無法繪製的「2另一種顏色的輕易獲得?它會更容易做,也許更好看;) – nicopico
相信我,你不需要「控制」onDraw()'。沒有必要,因爲無效()視圖在隊列上會有一條消息來調用它,這與繪製線無關。你需要一個複雜的控件來測量文本。 http://stackoverflow.com/questions/3257293/measuring-text-width-to-be-drawn-on-canvas-android – Simon
檢查我的答案,但我認爲你應該提供更多的代碼,來解釋我們有什麼你到目前爲止嘗試過。 –