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