Android:缩放 EditText Android 放置在 parentView 外部时,childView 的翻译和获取 Touch 事件出现问题

Android: Zooming EditText Android Issue in translation And Getting Touch event of childView when Placed outside parentView

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

ZoomView->ParentView->[多个子视图]

我正在开发 Demo project 来缩放子视图和平移 infinitely.Zooming 可以根据需要完美工作。

问题 1: 但是,如果视图中有一个 EditText,并且我尝试放大它,那么我将面临以下问题。

  1. 放大文字模糊

  2. 指向文本工作正常,但翻译文本是 翻译速度非常快,因为它的翻译乘以 比例因子

  3. 选择文本也出现上述问题

    尝试 运行 Demo 了解问题,如果从上面看不清楚

我尝试了两种方法来缩放视图的内容,但这两种方法都出现了同样的问题。

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

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

我已经提到了这个thread

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

scale is 1 the area touch area is equal to screen for parentView and ZoomView

但是当比例因子不等于一时,父级的触摸区域小于(放大)显示的 ZoomView

Yellow-parentView Touch Region

青色-缩放视图触摸区域

Green-ChildView 触摸区域

此处为屏幕截图

注: 这是我在 Whosebug 上的第一个问题所以如果需要一些编辑请推荐。

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

问题 1:

  1. 放大文字模糊

setLayerType(LAYER_TYPE_HARDWARE,null);

set layer type Hardware in the view which has text View. for me i set it in green square view.

  1. 指向文本工作正常,但翻译文本的速度非常快,因为它的翻译乘以缩放因子
  2. 选择文本也出现上述问题

For above two: This is a bug in android when you scale a view using the scaleX,scaleY api's the EditText get's event based on the current scale value of parent's.But issue is with the Cursor of editText.

The best solution we got is we wrote our own EditTextView (which extend's TextView).As we checked android framework source code we came to know that android use's PopUpWindow to display cursor on screen.

The source of issue is when we use scaleX and scaleY editText get's scaled even't as it's parent is scaled but as cursor is a PopUpWindow and not a child of EditText so event's are not scaled and above issue occur's

So wrote our own EditText if you see the source code EditText code is not very complex and can be written on our own.And to solve the scaling issue of Cursor, we added our own Cursor PopUpWindow and made it Scale aware.

NOTE: (UPDATE) Check at demo code here customEditText and CustomCursor. Run the project set focus pink focus(BY Android) will come ,wait for few seconds then the black cursor will appear that is the custom cursor. It is a very basic example and we need to add all other edit text Feature's on our own like multi-Select, popUpMenu etc.

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

This solution is specific to the given problem not a generic one as there can be multiple solution's for this problem. In this case 3 view's are there:

  1. Yellow-parentView of green square View
  2. Cyan-parent of yellow View
  3. Green-ChildView non touchable outside parent

    My Solution is that i used created a callback from green square view to Yellow parent view. Whenever the translation of green square view ended the callback is triggered and in yellow parent i used below code.

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
            }
    }

The above code translate to : when child view translation is ended check the bound's of parent and update the TouchDelegate accordingly.

As the problem i faced was when i scaled(Zoomed) the view then the View's delegate was not updated so for that also solution is same make a callback from zoomView (parent) to yellowView (childView) onScaleEnded call setDelegate().

When scale changes the hitArea also changes but as per delegate nothing is changed so we need to update the rect of TouchDelegate.

欢迎大家在评论区讨论。如果有人有更好的解决方案 真的很想 know.As 我们尝试了很多不同的解决方案,但没有 worked.This 是我找到的最好的解决方案,我在生产中使用上面的代码,直到现在还没有遇到任何问题。

平移和缩放 EditText 的最佳方法是在此特定 EditText 上使用 scaleX、scaleY、translateX、translateY 而不是父布局 canvas translation。

例如在科特林

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

顺便说一句,可以使用 Tools -> Layout Inspector.

检查 android studio 中的触摸区域和绘图区域是否相同