| 112 | } |
| 113 | |
| 114 | @Override |
| 115 | public void paintImpl(Canvas canvas, int width, int height, float scale) { |
| 116 | var capHeight = Example.FONT12.getMetrics().getCapHeight(); |
| 117 | var padding = (int) 8 * scale; |
| 118 | lastInputHeight = (int) (height - capHeight - 3 * padding); |
| 119 | |
| 120 | // keys |
| 121 | try (var bg = new Paint().setColor(0x40000000); |
| 122 | var fg = new Paint().setColor(0xFFFFFFFF); ) |
| 123 | { |
| 124 | var x = 0; |
| 125 | var y = lastInputHeight + padding; |
| 126 | for (var key: keys) { |
| 127 | try (var line = TextLine.make(key, Example.FONT12); ) { |
| 128 | canvas.drawRRect(RRect.makeXYWH(x, y, line.getWidth() + 2 * padding, capHeight + 2 * padding, 4 * scale), bg); |
| 129 | canvas.drawTextLine(line, x + padding, y + capHeight + padding, fg); |
| 130 | x += line.getWidth() + 3 * padding; |
| 131 | } |
| 132 | } |
| 133 | } |
| 134 | |
| 135 | // text input |
| 136 | try (var paint = new Paint(); ) { |
| 137 | canvas.save(); |
| 138 | paint.setColor(0xFFFFFFFF); |
| 139 | canvas.drawRRect(RRect.makeXYWH(0, 0, width, lastInputHeight, 4 * scale), paint); |
| 140 | |
| 141 | Font font = Example.FONT24; |
| 142 | FontMetrics metrics = font.getMetrics(); |
| 143 | |
| 144 | var y = lastInputHeight - Example.PADDING - metrics.getDescent(); |
| 145 | var lines = text.split("\n", -1); |
| 146 | var i = lines.length - 1; |
| 147 | |
| 148 | // Last line |
| 149 | try (var line = TextLine.make(lines[i], font)) { |
| 150 | canvas.save(); |
| 151 | canvas.translate(Example.PADDING, y); |
| 152 | paint.setColor(0xFF000000); |
| 153 | canvas.drawTextLine(line, 0, 0, paint); |
| 154 | canvas.translate(line.getWidth(), 0); |
| 155 | |
| 156 | // marked text |
| 157 | paint.setColor(0xFF0087D8); |
| 158 | if (lastMarked != null) { |
| 159 | |
| 160 | try (var marked = TextLine.make(lastMarked.getText(), font)) { |
| 161 | canvas.drawTextLine(marked, 0, 0, paint); |
| 162 | var start = marked.getCoordAtOffset(lastMarked.getSelectionStart()); |
| 163 | var end = marked.getCoordAtOffset(lastMarked.getSelectionEnd()); |
| 164 | if (0 < start - 1 * scale) |
| 165 | canvas.drawRect(Rect.makeLTRB(0, 2 * scale, start - 1 * scale, 4 * scale), paint); |
| 166 | if (start + 1 * scale < end - 1 * scale) |
| 167 | canvas.drawRect(Rect.makeLTRB(start + 1 * scale, 2 * scale, end - 1 * scale, 6 * scale), paint); |
| 168 | if (end + 1 * scale < marked.getWidth()) |
| 169 | canvas.drawRect(Rect.makeLTRB(end + 1 * scale, 2 * scale, marked.getWidth(), 4 * scale), paint); |
| 170 | |
| 171 | canvas.translate(marked.getWidth(), 0); |