Android:放置在父视图外部时,缩放EditText Android中的问题以及childView的get Touch事件

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android:放置在父视图外部时,缩放EditText Android中的问题以及childView的get Touch事件相关的知识,希望对你有一定的参考价值。

我的问题与android功能相关,缩放由多个子视图组成的父级。

ZoomView-> ParentView - > [多个childViews]

我正在研究Demo project来放大孩子的视野并无限地平移。缩放可以根据需要完美地工作。

问题1:但是如果视图中有一个EditText,我试着放大,那么我面临下面的问题。

  1. 放大文字是模糊的
  2. 指向文本工作正常但翻译文本翻译速度非常快,因为它的翻译乘以scalingFactor
  3. 选择文本也存在上述问题。 如果不清楚,请尝试运行Demo以了解问题

我尝试了两种缩放View内容的方法,但这两种方法都给出了同样的问题。

  • 通过缩放父类的Matrix.class的MotionEvent来缩放画布并转换MotionEvent。
  • 设置包含childViews的Parent的ScaleX和ScaleY

我的演示项目的层次结构缩放视图(UML图)

enter image description here

基本问题是当视图缩放到某个值时将光标放在正确的位置。

我已经提到过这个thread

问题2:如果我有一个可在父视图中移动的childView,那么在缩小后如果childView被翻译到parentView的边界之外,事件将停止捕获并且子视图变得不可触及我尝试使用TouchDelegate但我不知道我知道如何扩展parentView触摸区.Code reference Thread

scale为1,区域触摸区域等于parentView和ZoomView的屏幕

但是当比例因子不等于1时,父项的触摸区域(zoomIn)小于显示的ZoomView

黄色 - 父查看触摸区域

Cyan-ZoomView触摸区域

Green-ChildView触摸区域

ScreenShot在这里

enter image description here

注意:这是我关于StackOverflow的第一个问题所以请建议是否需要进行一些编辑。

答案

这是我最接近解决上述问题的方法。

问题1:

  1. 放大文字时模糊不清

setLayerType(LAYER_TYPE_HARDWARE,null);

在具有文本视图的视图中设置图层类型硬件。对我来说,我把它设置在绿色方块视图中。

  1. 指向文本工作正常但翻译文本翻译速度非常快,因为它的翻译乘以scalingFactor
  2. 选择文本也存在上述问题。

对于上面两个:当你使用scaleX缩放视图时,这是android中的一个错误,scaleY api是基于parent的当前缩放值的EditText get事件。但是问题是使用editText的Cursor。

我们得到的最好的解决方案是我们编写了自己的EditTextView(扩展了TextView)。当我们检查了android框架源代码时,我们知道android使用PopUpWindow在屏幕上显示光标。

问题的根源是当我们使用scaleX和scaleY editText get的缩放时,因为它的父级被缩放但是因为光标是PopUpWindow而不是EditText的子级所以事件的缩放不会出现上述问题

如果您看到source code EditText代码不是很复杂并且可以自己编写,那么编写我们自己的EditText。为了解决Cursor的缩放问题,我们添加了我们自己的Cursor PopUpWindow并使其成为Scale知识。

注意:(更新)在这里查看演示代码customEditTextCustomCursor。运行项目设置焦点粉红色焦点(BY Android)将到来,等待几秒钟然后黑色光标将出现,即自定义光标。这是一个非常基本的例子,我们需要自己添加所有其他编辑文本功能,如multi-Select,popUpMenu等。

问题2:如果我有一个可在父视图中移动的childView,那么在缩小后如果childView被翻译到parentView的边界之外,事件将停止捕获并且子视图变得不可触及我尝试使用TouchDelegate但我不知道我知道如何扩展parentView触摸区域

该解决方案特定于给定问题而不是通用问题,因为对于该问题可存在多个解决方案。在这种情况下有3个视图:

  1. 绿色正方形视图黄色父亲视图
  2. 黄色视图的青色父母
  3. Green-ChildView不可触摸的外部父母 我的解决方案是我使用了从绿色方块视图到黄色父视图的回调。每当绿色方块视图的转换结束时,触发回调并且在黄色父级中使用下面的代码。
override fun eventEnded() {
      setDelegate()
    }


fun setDelegate() {
            val rect = Rect()
            val parent = (this.parent as View) 
            parent.getHitRect(rect)
            val touchDelegate = TouchDelegate(rect, this)
            if (View::class.java.isInstance(editorContainer.parent)) {
                (editorContainer.parent as View).touchDelegate = touchDelegate
            }
    }

上面的代码转换为:当子视图转换结束时,检查父视图的边界并相应地更新TouchDelegate。

因为我遇到的问题是当我缩放(缩放)视图时,View的委托没有更新,因此也解决方案同样从zoomView(父)到yellowView(childView)onScaleEnded调用setDelegate()进行回调。

当比例改变时,hitArea也会改变,但是根据委托,没有任何改变,所以我们需要更新TouchDelegate的矩形。

请随时在评论部分讨论。如果有人有一个更好的解决方案真的很想知道。我们尝试了许多不同的解决方案,但没有其他工作。这是我发现的最好的,我在生产中使用上面的代码,直到现在还没有遇到任何问题。

另一答案

翻译和缩放EditText的最佳方法是在此特定EditText上使用scaleX,scaleY,translateX,translateY而不是父布局画布转换。

例如在kotlin

editText.scaleX = scaleFactor
editText.scaleY = scaleFactor
editText.translateX = offsetLeft
editText.translateн = offsetTop

顺便说一句,可以使用Tools -> Layout Inspector检查android studio中的触摸区域和绘图区域是否相同。

以上是关于Android:放置在父视图外部时,缩放EditText Android中的问题以及childView的get Touch事件的主要内容,如果未能解决你的问题,请参考以下文章

Android:缩放两个视图

在父视图的两侧放置两个宽度为 wrap_content 的多行 TextView

在android上动态创建视图和getWidth方法

Android将动画缩放到指定大小

如何缩放并排放置的两个图像?

Android在父RelativeLayout内裁剪ImageView