Anm*_*mol 11 android view scale android-layout android-edittext
我的问题与android功能相关,缩放由多个子视图组成的父级.
ZoomView-> ParentView - > [多个childViews]
我正在开发一个Demo项目来缩放子视图并无限地平移.缩放可以根据需要完美地工作.
问题1: 但是如果视图中有一个EditText,我试着放大,那么我面临下面的问题.
选择文本也存在上述问题.
如果不清楚,请尝试运行演示以了解问题
我尝试了两种缩放View内容的方法,但这两种方法都给出了同样的问题.
我的演示项目的层次结构缩放视图(UML图)
基本问题是当视图缩放到某个值时将光标放在正确的位置.
我已经提到了这个帖子
问题2: 如果我有一个childView这是在父视图移动,然后缩小,如果childView翻译的事件不再捕捉parentView的范围和子视图外后成为碰不得我一直在使用TouchDelegate尝试,但我不我知道如何扩展parentView触摸区域.代码 参考线程
scale为1,区域触摸区域等于parentView和ZoomView的屏幕
但是当比例因子不等于1时,父项的触摸区域(zoomIn)小于显示的ZoomView
黄色 - 父查看触摸区域
Cyan-ZoomView触摸区域
Green-ChildView触摸区域
ScreenShot在这里
注意: 这是我关于StackOverflow的第一个问题所以请建议是否需要进行一些编辑.
这是我最接近解决上述问题的。
问题一:
setLayerType(LAYER_TYPE_HARDWARE,null);
在具有文本视图的视图中设置图层类型硬件。对我来说,我将其设置为绿色方形视图。
对于以上两个: 当您使用基于父级当前缩放值的 EditText get 事件的scaleX、scaleY api 缩放视图时,这是 android 中的一个错误。但问题出在 editText 的 Cursor 上。
我们得到的最好的解决方案是我们编写自己的EditTextView(它扩展了TextView)。当我们检查android框架源代码时,我们了解到android使用PopUpWindow在屏幕上显示光标。
问题的根源是当我们使用scaleX和scaleY时,editText也会被缩放,即使它的父级被缩放,但由于光标是PopUpWindow而不是EditText的子级,所以事件没有缩放并且出现上述问题
所以写了我们自己的EditText如果你看到源代码EditText代码不是很复杂,可以自己编写。并且为了解决Cursor的缩放问题,我们添加了我们自己的Cursor PopUpWindow并使其具有Scale感知能力。
注意:(更新) 在此处查看演示代码customEditText和CustomCursor。运行项目设置焦点粉红色焦点(BY Android)将会出现,等待几秒钟然后会出现黑色光标,这是自定义光标。这是一个非常基本的示例,我们需要自己添加所有其他编辑文本功能,例如多选、弹出菜单等。
问题2: 如果我有一个在父视图中可移动的子视图,那么缩小后,如果子视图被平移到父视图的边界之外,则事件将停止捕获,并且子视图变得不可触摸,我尝试过使用TouchDelegate,但我不这样做不知道如何扩大parentView触摸区域
该解决方案特定于给定问题而不是通用问题 ,因为该问题可能有多种解决方案。在本例中,有 3 个视图:
- 黄色-绿色方形View的parentView
- 青色- 黄色视图的父级
绿色 - 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
}
}
Run Code Online (Sandbox Code Playgroud)
上面的代码翻译为:当子视图转换结束时,检查父视图的边界并相应地更新 TouchDelegate。
由于我面临的问题是当我缩放(缩放)视图时,视图的委托没有更新,因此解决方案也是相同的,从zoomView(父级)到yellowView(childView) onScaleEnded调用setDelegate()进行回调。
当比例改变时,hitArea 也会改变,但根据委托,没有任何改变,所以我们需要更新TouchDelegate 的矩形。
欢迎大家在评论区讨论。如果有人有更好的解决方案,真的很想知道。因为我们尝试了许多不同的解决方案,但没有其他解决方案。这是我发现的最好的解决方案,我在生产中使用上面的代码,到目前为止还没有遇到任何问题。
归档时间: |
|
查看次数: |
411 次 |
最近记录: |