我正在制作一个自定义视图,可以使用典型的绘图工具(如绘图、形状拖放或编写文本(进行注释。我已经实现了属于"绘图"类别的所有工具,但是文本输入给我带来了很多麻烦。我非常希望避免在此视图之上创建 EditTexts 作为一种方法。关于这个话题的问题似乎有很多相互矛盾的答案。
我想做什么:
- 点击自定义视图中的任意位置并打开键盘/指示可以输入文本
- 获取键盘输入 - 最好是任何类型的键盘。如何在软键盘中听按键似乎对硬键盘或软键盘有效有一些争论。
- 获取键盘输入,并在用户输入任何字符后将其绘制到我的画布上。
- 允许用户编辑该文本
- 允许用户移动文本
我尝试覆盖 onKeyUp(( 并拦截每个按键。android 文档建议应使用 DynamicLayout 输入可编辑的文本,因此我一直在尝试使用 dynamicLayout.draw(canvas(。我可以打开软键盘,但即使在将视图设置为可聚焦并请求对焦后,onKeyUp(( 也不会触发。 我已经看到了几个问题的答案,这些问题的答案警告不要使用除 EditText 以外的任何东西进行文本输入,因为自定义键盘的复杂性和问题。肯定有人知道如何做到这一点吗?
对我有很大帮助的是,在画布上显示用户输入的文本的基本概述。一个高层次的一步一步做什么就好了。即使只是关于在哪里寻找上述前三个步骤的详细信息也将不胜感激。
从键盘事件中获取文本
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);
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);