【问题标题】:Android - Drawing text on canvas via soft keyboard inputAndroid - 通过软键盘输入在画布上绘制文本
【发布时间】: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,顺便说一句)。您可以将您的绘图ViewEditText 都放在一些ViewGroup 中,整个事情将是您自定义的View;例如,CustomView extends FrameLayout 包含 (DrawingView & EditText)。你甚至可以让你的绘图 View 扩展一个 ViewGroup,然后将单个 EditText 放入其中,因为你可以以基本相同的方式绘制到 ViewGroups;例如,DrawingView extends FrameLayout 包含 EditText
  • 最近有人发布了一个我处理的问题,它有一个自定义绘图View,所以我想我会抓住它并对其进行一些修改,以便快速测试我的建议.它是veeery粗糙,但它应该给你一些想法。定位是近似的,它只是单行 atm,您可能需要TextBlockdrive.google.com/file/d/1C9ChwRfVXhKHWBIFxZHaWRxWbHElKdys/… 中的更多属性。它默认处于绘图模式,所以只需调用setDrawingModeEnabled(false) 切换到文本模式,点击然后单击EditText,输入一些文本,然后回车。

标签: android canvas text user-input


【解决方案1】:

从键盘事件中获取文本

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);

错误的第二个参数将 BaseInputConnection 置于“虚拟”模式,这也是将原始键事件发送到您的视图所必需的。在 BaseInputConnection 代码中,您可以找到如下几个 cmets:“只有在 dummy 模式下,才会为新文本发送按键事件并清除当前可编辑缓冲区。”

现在您可以捕获事件,您可以将文本输入存储在一个变量中,然后您可以像这样在画布上使用绘图来绘制文本:

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); 

【讨论】:

    猜你喜欢
    • 2016-03-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-26
    • 2014-04-07
    • 1970-01-01
    • 2019-02-07
    • 1970-01-01
    相关资源
    最近更新 更多