我在Android中有以下 struct

  • 相对布局1(背景色为黑色)
    • 相对布局2(背景色为白色)
      • TextView 1(背景色为红色)

enter image description here

当用户touch 我的文本视图(MotionEvent.ACTION_DOWN)时,我希望获得touch 的x和y坐标.

我可以用下面的代码获得触点坐标:

title_text_view.setOnTouchListener (object : View.OnTouchListener {

        override fun onTouch (view: View, event: MotionEvent): Boolean {

            if (event.actionMasked == MotionEvent.ACTION_DOWN) {

                    var x:Float
                    var y:Float

                x = view.x + event.x
                y = (view.parent as ViewGroup).y + view.y + event.y

                
            }

            // returning false indicates that the listener has not consumed the touch event
            // If no other listener consumes the event, the system will handle it according to the default behavior
            return false
        }
    })

如您所见,要计算我的Y坐标,我必须加上(vent.y+view.y+(view.parent as ViewGroup).y)

假设我点击了黑点(在Click Me之间,请看图像),WRT到文本ClickMe,(0,0)将从左上角红色开始,这样我就可以基于它(Event.x&Event.y)得到x,y,但是为了让它WRT到屏幕的0,0,即左上角黑角,我需要找到父母的View.y(白色部分,即50)和父母的父母的View.y(黑色部分,即900).

然后计算实际的y:107+50+900

但我可以有一个更复杂的层次 struct ,即相对布局内部的相对布局,然后是文本视图.有没有其他方法可以不用计算直接得到x,y坐标?

PS:我知道我可以在最上面的相对布局上设置一个setOnTouchListener,然后得到x,y,我就会得到x,y,但我必须只在我的文本视图上设置事件侦听器.

推荐答案

在视图类中,你有View.getLocationOnScreen()个.您没有直接提到它,但您可能想要将touch 位置从本地转换为touch 视图,再转换为相对屏幕.但请注意,这意味着整个设备屏幕,如文档中所述:

对象的坐标空间中获取此视图的坐标. 设备屏幕,而不考虑系统装饰以及 系统处于多窗口模式.

另一方面,如果您想要转换相对于活动的坐标,则使用View.getLocationInWindow()

获取此视图在包含该视图的>;窗口的坐标空间中的坐标,而不考虑系统装饰.

这两种方法都将填充一个由两个整数组成的数组,您可以将它们添加到touch 的视图坐标中的event.x、vent.y坐标中.

例如,在您的代码中:

if (event.actionMasked == MotionEvent.ACTION_DOWN) {
  val location = IntArray(2)
  view.getLocationOnScreen(location)
  // view.getLocationInWindow(location)

  val x = location[0] + event.x
  val y = location[1] + event.y
}

Java相关问答推荐

Informix PrepareStatement引发错误-将LIMIT Clause添加到查询时,字符到数字的转换过程失败

Spring Jpa findById会导致StackOverFlow错误,但其他查询没有问题

Analyst Idea构建错误:NoClassDefFound错误:javax/html/bind/JAVAX Bwitch [SOLVED]

将@ManyToOne JPA Composite Key用作Id保存实体添加额外参数

OpenJDK、4K显示和文本质量

使用Java Streams API比较两个不同的Java集合对象和一个公共属性

为什么Java的代码工作(if condition内部的实例)

Jlink选项&-strie-ative-Commands";的作用是什么?

AssertJ Java:多条件断言

为什么我的在一个范围内寻找素数的程序不能像S所期望的那样工作

为什么Java Annotation接口覆盖对象类中的方法

有没有更快的方法在N个容器中删除重复项?

使用Room Database删除Jetpack合成中的所有项目后,UI未重新合成

使用用户引入的参数生成人员数组

如何将Java文档配置为在指定的项目根目录中生成?

是否在settings.xml中使用条件Maven镜像?

对角线填充二维数组

Java中的发布/订阅-Long Live和Short Live Publisher,哪种方法是正确的?

具有多个分析模式的复杂分隔字符串的正则表达式

Java编译器是否进行了持续的折叠优化,以及如何进行判断?