2013-10-14 42 views
0

我有一個應用程序,在輸入需要來自用戶的,然後在一個按鈕顯示的計算結果的點擊的格式如下所示:的Android - 圖線在一個TextView

123456 
213456 
214356 
124365 

我需要一個線(最好是藍色)加入列表中每個數字2,因爲它們沿着TextView向下。

如果用戶不需要,我還需要不用這行的選項。

我迄今爲止嘗試: 我伸出一個TextView類,並推翻了的onDraw(Canvas)的方法,並試圖得到的東西的工作和管理,以顯示垂直藍線,但不可能獲得2號的的加盟。我不確定android如何決定何時調用onDraw(),因爲我不會在代碼中調用它,但我寧願我可以控制它何時顯示行或不行。

+0

無法繪製的「2另一種顏色的輕易獲得?它會更容易做,也許更好看;) – nicopico

+0

相信我,你不需要「控制」onDraw()'。沒有必要,因爲無效()視圖在隊列上會有一條消息來調用它,這與繪製線無關。你需要一個複雜的控件來測量文本。 http://stackoverflow.com/questions/3257293/measuring-text-width-to-be-drawn-on-canvas-android – Simon

+1

檢查我的答案,但我認爲你應該提供更多的代碼,來解釋我們有什麼你到目前爲止嘗試過。 –

回答

0

我會這樣做。

  • 用戶輸入的值,並單擊按鈕
  • 當按鈕被點擊隱藏的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 

簡單不?

0

這是唯一的想法:

你有什麼:

  • 中的文字大小可以說:20px的

  • X和視圖的Y座標。通過在像素的TextView如果任何

  • 文字大小提供給內容

  • 引力。 getTextSize()paint.measureText(); [畫布上的矩形是文字大小]

  • Text ems。 getEms()

  • 可選:填充或保證金,如果任何

你需要找什麼:在畫布上每個字母的

  • 每個x座標。

  • 畫布上每個字母的每個y座標。

如何:在文本

  • X =字母位置*字體大小(或EMS)。如果存在填充或邊距,則向x添加填充左+填充權; [關於畫布rect.left爲x]

  • 復位字母位置的每個新行

  • Y =行數*字體大小(或EMS)。 + padding top + padding bottom [畫布上的rect.bottom是y]

  • 收集所有近似的x和y,形成Point

  • 比賽每個PointonDraw()

如果你覺得你想使用paint.measureText("13332", 0, "13332".indexOf("2")),測量寬度將是近似的,絕對把自己的「2」 X座標。相對於其父母而言,找到起來可能要複雜得多。

編輯: 我上面寫的可以使用paint.[getTextBounds()][1]方法,這將給你Rect從中可以形成Point

+0

如果我設法得到這個工作,我該如何顯示和不顯示該行? 「 –

+0

」畫布上每個字母的每個x座標。「不明白需要獲得每個字母的座標,只需要獲得繪製線的座標以及2的座標就足夠了。如果我理解這個問題。重繪將完成剩下的工作。 –

+0

這就是找到每個字母x的目的,後來我們只對2的感興趣,所以我們丟棄所有'Point'並從2的'Point'開始繪圖。 –

相關問題