通过软键盘输入在Android上画文本到画布上

4

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

我想做什么:

  • 在自定义视图中任意点击并打开键盘/指示可以输入文本
  • 获取键盘输入-最好是任何类型的键盘。关于如何侦听软键盘的按键事件,如何监听软键盘中的按键似乎存在一些争议。
  • 在用户输入任何字符后将键盘输入绘制到画布上。
  • 允许用户编辑该文本
  • 允许用户移动文本

我尝试重载onKeyUp()并拦截每个按键。Android文档建议应使用DynamicLayout输入可编辑文本,因此我一直在尝试使用dynamicLayout.draw(canvas)。我可以打开软键盘,但即使将我的视图设置为可聚焦并请求聚焦,onKeyUp()也不会触发。我看到了几个回答问题的答案警告说除EditText之外的任何文本输入都会由于复杂性和自定义键盘问题而导致问题。肯定有人知道如何做到这一点吧?

对我来说非常有帮助的是,对展示用户输入的文本所需的基础概述。一个高层次的分步骤指南就可以了。甚至只是关于在哪里查找前三个步骤的详细信息也将受到极大赞赏。


你是否考虑过使用一个单独的“浮动”EditText,根据需要重新定位并显示/隐藏它?在点击时,将最初隐藏的EditText移动到适当的位置,在其上设置任何必要的文本/字体属性,然后显示它。完成文本输入后,隐藏EditText,从中获取文本,并在自定义View的相同位置绘制它。 - Mike M.
可能是重复的问题:如何在View中捕获软键盘输入? - Marcos Vasconcelos
2
你的自定义View不一定要严格遵循常规的View。它可以是一个ViewGroup(顺便说一下,ViewGroup也是一个View)。你可以将你的绘图ViewEditText都放在某个ViewGroup中,整个东西就成了你的自定义View;例如,CustomView extends FrameLayout 包含 (DrawingView & EditText)。你甚至可以让你的绘图View扩展一个ViewGroup,并将单个EditText放在其中,因为你可以基本上以相同的方式绘制到ViewGroup上;例如,DrawingView extends FrameLayout 包含 EditText - Mike M.
2
有人最近发布了一个我处理过的问题,它有一个自定义绘图View,所以我想抓取它并稍微修改一下,以便快速测试我的建议。它非常粗糙,但应该能给你一些想法。定位是大致的,目前只有单行,你可能需要在TextBlock中添加更多属性等。https://drive.google.com/file/d/1C9ChwRfVXhKHWBIFxZHaWRxWbHElKdys/view?usp=drivesdk。默认情况下处于绘图模式,只需调用`setDrawingModeEnabled(false)`切换到文本模式,然后点击`EditText`,输入一些文本,按回车键即可。 - Mike M.
@MikeM。非常感谢!我会查看的。 - neekolawz
显示剩余3条评论
1个回答

1
从键盘事件获取文本
1)在onCreateInputConnection()中,用以下代码替换一行:
outAttrs.inputType = InputType.TYPE_CLASS_TEXT; 替换为:
outAttrs.inputType = InputType.TYPE_NULL; 根据InputType.TYPE_NULL的文档:“这应该被解释为目标输入连接不是丰富的,它不能处理和显示候选文本,也不能检索当前文本,因此输入法将需要在有限的“生成键事件”模式下运行。”
2)在同一方法中,用以下代码替换一行:
BaseInputConnection fic = new BaseInputConnection(this, true);

with this one:

BaseInputConnection fic = new BaseInputConnection(this, false);

假的第二个参数将BaseInputConnection置于“虚拟”模式,这也是为了使原始键事件发送到您的视图所必需的。在BaseInputConnection代码中,您可以找到几个注释,如下所示:“仅当处于虚拟模式时,才会为新文本发送键事件并清除当前可编辑缓冲区。”现在,您可以捕获事件,将文本输入存储在变量中,然后可以像这样在画布上使用paint绘制文本:
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); 

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接