2013-10-14 3 views
0

У меня есть приложение, которое принимает на входе от пользователя, а затем на щелканья кнопки отображает вычисленные результаты в формате следующим образом:Android - Рисование линий в TextView

123456 
213456 
214356 
124365 

мне нужна линия (желательно синий), чтобы присоединиться к каждому из числа 2 в списке, когда они пробиваются вниз по TextView.

Мне также нужна опция не иметь эту строку, если пользователь этого не хочет.

То, что я пытался до сих пор: я расширил класс TextView и отменяют метод OnDraw (Canvas) и пытались получить что-то работу и сумел отобразить вертикальные синие линии, но не смог получить соединение числа 2-х. Я не уверен, как андроид решает, когда вызывается onDraw(), поскольку я не вызываю его в своем коде, но я бы предпочел, чтобы я мог контролировать, когда он отображает строки или нет.

+0

не могли бы вы рисуете «2 в другом цвете? Было бы проще сделать и, может быть, лучше посмотреть;) – nicopico

+0

Поверьте мне, вам не нужно «управлять» 'onDraw()'. Нет необходимости, поскольку в представлении 'invalidated()' будет сообщение в очереди, чтобы вызвать его в любом случае, и это все не имеет никакого отношения к линиям чертежа.Для этого вам потребуется сложный контроль и измерение текста. http://stackoverflow.com/questions/3257293/measuring-text-width-to-be-drawn-on-canvas-android – Simon

+1

Проверьте мой ответ ниже, но я думаю, что вы должны предоставить еще несколько кода, чтобы объяснить нам, что вы пробовали до сих пор. –

ответ

0

Я бы продолжил этот путь.

  • Пользователь вводит значение и нажимает на кнопку
  • Поскольку кнопка повернутая скрыть TextView и заменить его ImageView или сохранить TextView и поставить ImageView на верхней части TextView (перекрытие ImageView на TextView может быть достигнуто с помощью FrameLayout
  • Draw в ImageView линии и числа в методе OnDraw()
  • Поскольку пользователь нажимает на 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(); [rect.right on Canvas is the text size]

  • Текст ems. getEms()

  • Дополнительно: Перетяжка или Маржа если

Что вам нужно найти:

  • Каждая координата х каждой буквы на холсте.

  • Каждая y-координата каждой буквы на холсте.

Как:

  • х = буква позиции в тексте * размер шрифта (или Эмс). если есть добавка или добавление поля, добавьте пробел слева + дополнение к x; [Rect.left на холсте х]

  • Сброс буквы положения каждой новой линии

  • у = номер строки * размер шрифта (или СЭМ). + обивка сверху + обивка дна [rect.bottom on Canvas is y]

  • Соберите все приблизительные x и y, чтобы сформировать Point.

  • Match каждый Point в onDraw()

Если вы думаете, что вы хотите использовать paint.measureText("13332", 0, "13332".indexOf("2")), измеренная ширина будет приблизительна и абсолютной себе X-координата «2». Относительно его родителя может быть гораздо сложнее найти.

Edit: То, что я написал выше, можно легко получить, используя paint.[getTextBounds()][1] метод, который даст вам Rect, из которого Вы можете сформировать Point

+0

Если мне удастся получить эту работу, как я могу показать и не показывать строку? –

+0

«Каждая x-координата каждой буквы на холсте». Не понимая необходимости получать координаты каждой буквы, было бы достаточно, чтобы получить кординаты, где рисовать линии и, может быть, координаты 2-х. Если бы я хорошо понял вопрос. Redraw сделает все остальное. –

+0

То есть именно цель поиска x каждой буквы, а потом нас интересует только 2, поэтому мы отбрасываем все «точки» и начинаем рисовать из «точки» 2. –

Смежные вопросы