Android-通过软键盘输入在画布上绘制文本

时间:2018-08-17 00:56:17

标签: android canvas text user-input

我正在制作一个自定义视图,该视图可以用典型的绘画工具(例如绘图,掉落形状或书写文本)进行注释。我已经实现了所有属于“绘图”类别的工具,但是文本输入给我带来了很多麻烦。我非常希望避免在此视图上创建EditTexts作为一种方法。关于这个主题的问题似乎有很多矛盾的答案。

我想做什么:

  • 在自定义视图中的任意位置点击并打开键盘/表示可以输入文本
  • 获取键盘输入-最好是任何种类的键盘。 How to listen to keypress in the soft keyboard似乎对适用于硬键盘或软键盘的内容有些争论。
  • 接受键盘输入,并在用户输入任何字符后将其绘制在我的画布上。
  • 允许用户编辑该文本
  • 允许用户移动文本

我尝试覆盖onKeyUp()并拦截每个按键。 android docs建议应使用DynamicLayout输入可编辑的文本,因此我一直在尝试使用dynamicLayout.draw(canvas)。我可以打开软键盘,但是即使将视图设置为可聚焦并请求聚焦后,onKeyUp()也不会触发。 我已经看到了一些问题的答案,这些警告由于复杂性和自定义键盘的问题,警告不要使用EditText进行文本输入。当然有人知道该怎么做吗?

对我来说将是巨大的帮助,它是在画布上显示用户输入的文本时所要进行的基本概述。一步一步地介绍如何做没事的。即使只是在哪里可以找到上述前三个步骤的细节,也将不胜感激。

1 个答案:

答案 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);