农村四月闲人少,勤学苦攻把名扬。这篇文章主要讲述Android:放置在父视图外部时,缩放EditText Android中的问题以及childView的get Touch事件相关的知识,希望能为你提供帮助。
我的问题与android功能相关,缩放由多个子视图组成的父级。
ZoomView->
ParentView- >
[多个childViews]
我正在研究Demo project来放大孩子的视野并无限地平移。缩放可以根据需要完美地工作。
问题1:但是如果视图中有一个EditText,我试着放大,那么我面临下面的问题。
- 放大文字是模糊的
- 指向文本工作正常但翻译文本翻译速度非常快,因为它的翻译乘以scalingFactor
- 选择文本也存在上述问题。 如果不清楚,请尝试运行Demo以了解问题
- 通过缩放父类的Matrix.class的MotionEvent来缩放画布并转换MotionEvent。
- 设置包含childViews的Parent的ScaleX和ScaleY
文章图片
基本问题是当视图缩放到某个值时将光标放在正确的位置。
我已经提到过这个thread
问题2:如果我有一个可在父视图中移动的childView,那么在缩小后如果childView被翻译到parentView的边界之外,事件将停止捕获并且子视图变得不可触及我尝试使用TouchDelegate但我不知道我知道如何扩展parentView触摸区.Code reference Thread
scale为1,区域触摸区域等于parentView和ZoomView的屏幕但是当比例因子不等于1时,父项的触摸区域(zoomIn)小于显示的ZoomView
黄色 - 父查看触摸区域
Cyan-ZoomView触摸区域
Green-ChildView触摸区域
ScreenShot在这里
文章图片
注意:这是我关于StackOverflow的第一个问题所以请建议是否需要进行一些编辑。
答案这是我最接近解决上述问题的方法。
问题1:
- 放大文字时模糊不清
setLayerType(LAYER_TYPE_HARDWARE,null);
【Android(放置在父视图外部时,缩放EditText Android中的问题以及childView的get Touch事件)】在具有文本视图的视图中设置图层类型硬件。对我来说,我把它设置在绿色方块视图中。
- 指向文本工作正常但翻译文本翻译速度非常快,因为它的翻译乘以scalingFactor
- 选择文本也存在上述问题。
对于上面两个:当你使用scaleX缩放视图时,这是android中的一个错误,scaleY api是基于parent的当前缩放值的EditText get事件。但是问题是使用editText的Cursor。问题2:如果我有一个可在父视图中移动的childView,那么在缩小后如果childView被翻译到parentView的边界之外,事件将停止捕获并且子视图变得不可触及我尝试使用TouchDelegate但我不知道我知道如何扩展parentView触摸区域
我们得到的最好的解决方案是我们编写了自己的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等。
该解决方案特定于给定问题而不是通用问题,因为对于该问题可存在多个解决方案。在这种情况下有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中的触摸区域和绘图区域是否相同。推荐阅读
- 如何获取IMEI编号|离子| Android
- android studio中的错误字符集
- app.post不是函数表达节点
- 空指针异常,android.widget.Tablayout.getChildAt(int)
- 解决错误Android Studio(安装失败,消息为null)
- 如何在android中改变可绘制形状的颜色
- gps在DELPHI全职安装android服务的位置
- 新款Macbook Air笔记本安装Windows 8时出现黑屏无法正常安装怎样办
- win8.1系统自带的ie11浏览器突然停止工作怎样办【图】