我会这样进行。
- 用户输入值并单击按钮
- 当点击按钮时,隐藏 TextView 并将其替换为 ImageView 或保留 TextView 并将 ImageView 放在 TextView 的顶部(TextView 上 ImageView 的重叠可以通过 FrameLayout 实现
- 在 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
简单不?