【发布时间】:2019-01-24 00:09:57
【问题描述】:
我正在制作一个自定义视图,可以使用典型的绘图工具(如绘图、形状拖放或书写文本)进行注释。我已经实现了所有属于“绘图”类别的工具,但是文本输入给我带来了很多麻烦。作为一种方法,我非常希望避免在此视图之上创建 EditTexts。关于这个主题的问题似乎有很多相互矛盾的答案。
我想做什么:
- 点击自定义视图中的任意位置并打开键盘/指示可以输入文本
- 获取键盘输入 - 最好是任何类型的键盘。 How to listen to keypress in the soft keyboard 似乎对什么适用于硬键盘或软键盘有一些争论。
- 接受键盘输入,并在用户输入任何字符后将其绘制在我的画布上。
- 允许用户编辑该文本
- 允许用户移动文本
我尝试过覆盖 onKeyUp() 并拦截每个按键。 android 文档建议应使用 DynamicLayout 输入可编辑文本,因此我一直在尝试使用 dynamicLayout.draw(canvas)。我可以打开软键盘,但即使将我的视图设置为可聚焦并请求焦点,onKeyUp() 也不会触发。 由于复杂性和自定义键盘的问题,我已经看到了几个问题的答案,这些问题警告不要使用除 EditText 之外的任何内容进行文本输入。肯定有人知道怎么做吗?
对我有很大帮助的是,在画布上显示用户输入的文本时的基本概述。一步一步的高级操作将没事的。即使只是关于在哪里寻找上述前三个步骤的详细信息,也将不胜感激。
【问题讨论】:
-
您是否考虑过使用单个“浮动”
EditText重新定位并根据需要显示/隐藏?点击后,将最初隐藏的EditText移动到适当的位置,在其上设置任何必要的文本/字体属性,然后显示它。文本输入完成后,隐藏EditText,从中获取文本,并将其绘制在自定义View上的相同位置。 -
@MikeM。该方法确实有效,并且在这种情况下我通常会这样做。但是,我希望在我的自定义视图中包含所有注释逻辑,以便我可以将其作为库发布。如果我依赖单独的 EditTexts,我认为这将需要库的用户基本上滚动他们自己的文本条目。
-
您的自定义
View不必是严格意义上的常规View。它可以是ViewGroup(这是View,顺便说一句)。您可以将您的绘图View和EditText都放在一些ViewGroup中,整个事情将是您自定义的View;例如,CustomView extends FrameLayout包含 (DrawingView&EditText)。你甚至可以让你的绘图View扩展一个ViewGroup,然后将单个EditText放入其中,因为你可以以基本相同的方式绘制到ViewGroups;例如,DrawingView extends FrameLayout包含EditText。 -
最近有人发布了一个我处理的问题,它有一个自定义绘图
View,所以我想我会抓住它并对其进行一些修改,以便快速测试我的建议.它是veeery粗糙,但它应该给你一些想法。定位是近似的,它只是单行 atm,您可能需要TextBlock等drive.google.com/file/d/1C9ChwRfVXhKHWBIFxZHaWRxWbHElKdys/… 中的更多属性。它默认处于绘图模式,所以只需调用setDrawingModeEnabled(false)切换到文本模式,点击然后单击EditText,输入一些文本,然后回车。
标签: android canvas text user-input