我正在制作一个自定义视图,可以使用典型的绘图工具进行注释,如绘制、形状放置或书写文本。我已经实现了所有属于“绘画”类别的工具,但是文本输入给了我很多麻烦。我非常希望避免在此视图上创建EditTexts作为一种方法。关于这个主题似乎有很多互相矛盾的答案。
我想做什么:
- 在自定义视图中任意点击并打开键盘/指示可以输入文本
- 获取键盘输入-最好是任何类型的键盘。关于如何侦听软键盘的按键事件,如何监听软键盘中的按键似乎存在一些争议。
- 在用户输入任何字符后将键盘输入绘制到画布上。
- 允许用户编辑该文本
- 允许用户移动文本
我尝试重载onKeyUp()并拦截每个按键。Android文档建议应使用DynamicLayout输入可编辑文本,因此我一直在尝试使用dynamicLayout.draw(canvas)。我可以打开软键盘,但即使将我的视图设置为可聚焦并请求聚焦,onKeyUp()也不会触发。我看到了几个回答问题的答案警告说除EditText之外的任何文本输入都会由于复杂性和自定义键盘问题而导致问题。肯定有人知道如何做到这一点吧?
对我来说非常有帮助的是,对展示用户输入的文本所需的基础概述。一个高层次的分步骤指南就可以了。甚至只是关于在哪里查找前三个步骤的详细信息也将受到极大赞赏。
EditText
,根据需要重新定位并显示/隐藏它?在点击时,将最初隐藏的EditText
移动到适当的位置,在其上设置任何必要的文本/字体属性,然后显示它。完成文本输入后,隐藏EditText
,从中获取文本,并在自定义View
的相同位置绘制它。 - Mike M.View
不一定要严格遵循常规的View
。它可以是一个ViewGroup
(顺便说一下,ViewGroup
也是一个View
)。你可以将你的绘图View
和EditText
都放在某个ViewGroup
中,整个东西就成了你的自定义View
;例如,CustomView extends FrameLayout
包含 (DrawingView
&EditText
)。你甚至可以让你的绘图View
扩展一个ViewGroup
,并将单个EditText
放在其中,因为你可以基本上以相同的方式绘制到ViewGroup
上;例如,DrawingView extends FrameLayout
包含EditText
。 - Mike M.View
,所以我想抓取它并稍微修改一下,以便快速测试我的建议。它非常粗糙,但应该能给你一些想法。定位是大致的,目前只有单行,你可能需要在TextBlock
中添加更多属性等。https://drive.google.com/file/d/1C9ChwRfVXhKHWBIFxZHaWRxWbHElKdys/view?usp=drivesdk。默认情况下处于绘图模式,只需调用`setDrawingModeEnabled(false)`切换到文本模式,然后点击`EditText`,输入一些文本,按回车键即可。 - Mike M.