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



我正在制作一个自定义视图,可以使用典型的绘图工具(如绘图、形状拖放或编写文本(进行注释。我已经实现了属于"绘图"类别的所有工具,但是文本输入给我带来了很多麻烦。我非常希望避免在此视图之上创建 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); 

相关内容

  • 没有找到相关文章

最新更新