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

农村四月闲人少,勤学苦攻把名扬。这篇文章主要讲述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图)
Android(放置在父视图外部时,缩放EditText Android中的问题以及childView的get Touch事件)

文章图片

基本问题是当视图缩放到某个值时将光标放在正确的位置。
我已经提到过这个thread
问题2:如果我有一个可在父视图中移动的childView,那么在缩小后如果childView被翻译到parentView的边界之外,事件将停止捕获并且子视图变得不可触及我尝试使用TouchDelegate但我不知道我知道如何扩展parentView触摸区.Code reference Thread
scale为1,区域触摸区域等于parentView和ZoomView的屏幕
但是当比例因子不等于1时,父项的触摸区域(zoomIn)小于显示的ZoomView
黄色 - 父查看触摸区域
Cyan-ZoomView触摸区域
Green-ChildView触摸区域
ScreenShot在这里
Android(放置在父视图外部时,缩放EditText Android中的问题以及childView的get Touch事件)

文章图片

注意:这是我关于StackOverflow的第一个问题所以请建议是否需要进行一些编辑。
答案这是我最接近解决上述问题的方法。
问题1:
  1. 放大文字时模糊不清
setLayerType(LAYER_TYPE_HARDWARE,null);
【Android(放置在父视图外部时,缩放EditText Android中的问题以及childView的get Touch事件)】在具有文本视图的视图中设置图层类型硬件。对我来说,我把它设置在绿色方块视图中。
  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知识。
注意:(更新)在这里查看演示代码customEditText和CustomCursor。运行项目设置焦点粉红色焦点(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中的触摸区域和绘图区域是否相同。

    推荐阅读