我正在制作一个自定义视图,该视图可以用典型的绘画工具(例如绘图,掉落形状或书写文本)进行注释。我已经实现了所有属于“绘图”类别的工具,但是文本输入给我带来了很多麻烦。我非常希望避免在此视图上创建EditTexts作为一种方法。关于这个主题的问题似乎有很多矛盾的答案。
我想做什么:
我尝试覆盖onKeyUp()并拦截每个按键。 android docs建议应使用DynamicLayout输入可编辑的文本,因此我一直在尝试使用dynamicLayout.draw(canvas)。我可以打开软键盘,但是即使将视图设置为可聚焦并请求聚焦后,onKeyUp()也不会触发。 我已经看到了一些问题的答案,这些警告由于复杂性和自定义键盘的问题,警告不要使用EditText进行文本输入。当然有人知道该怎么做吗?
对我来说将是巨大的帮助,它是在画布上显示用户输入的文本时所要进行的基本概述。一步一步地介绍如何做没事的。即使只是在哪里可以找到上述前三个步骤的细节,也将不胜感激。
答案 0 :(得分:1)
要从键盘事件中获取文本
1)在onCreateInputConnection()中替换以下行:
outAttrs.inputType = InputType.TYPE_CLASS_TEXT; 与此:
outAttrs.inputType = InputType.TYPE_NULL; 根据InputType.TYPE_NULL的文档:“这应该解释为目标输入连接不丰富,它无法处理和显示候选文本等内容,也无法检索当前文本,因此输入方法将需要在受限的“生成关键事件”模式。”
2)用相同的方法替换以下行:
BaseInputConnection fic = new BaseInputConnection(this, true);
与此:
BaseInputConnection fic = new BaseInputConnection(this, false);
错误的第二个参数将BaseInputConnection置于“虚拟”模式,这也是将原始键事件发送到您的视图所必需的。在BaseInputConnection代码中,您可以找到一些注释,例如以下内容:“仅在虚拟模式下,将为新文本发送键事件,并清除当前的可编辑缓冲区。”
现在您可以捕获事件,可以将输入的文本存储在变量中,然后可以在画布上使用这样的绘画来绘制文本:
Paint paint = new Paint();
paint.setColor(Color.WHITE);
paint.setStyle(Style.FILL);
canvas.drawPaint(paint);
paint.setColor(Color.BLACK);
paint.setTextSize(20);
canvas.drawText("Some Text", 10, 25, paint);