Android中如何获取View(TextView、Button等)的触摸屏幕坐标
解决Android触摸TextView获取屏幕绝对坐标的问题
有两种简洁的方法可以直接获取触摸点相对于屏幕左上角的绝对坐标,无需手动累加父布局的偏移量:
方法1:直接使用MotionEvent的getRawX()和getRawY()
MotionEvent提供的getRawX()和getRawY()方法,返回的就是触摸点相对于屏幕左上角的绝对坐标,完全不需要考虑布局层级。直接替换你的代码即可:
title_text_view.setOnTouchListener(object : View.OnTouchListener { override fun onTouch(view: View, event: MotionEvent): Boolean { if (event.actionMasked == MotionEvent.ACTION_DOWN) { val screenX = event.rawX val screenY = event.rawY // 此处已获取到屏幕绝对坐标 } return false } })
方法2:通过View的getLocationOnScreen()计算
如果需要结合View自身位置做验证或扩展,可以先获取TextView在屏幕上的绝对坐标,再加上触摸点相对于TextView的局部偏移:
title_text_view.setOnTouchListener(object : View.OnTouchListener { override fun onTouch(view: View, event: MotionEvent): Boolean { if (event.actionMasked == MotionEvent.ACTION_DOWN) { val viewLocation = IntArray(2) // 获取TextView左上角相对于屏幕的绝对坐标,结果存入viewLocation数组 view.getLocationOnScreen(viewLocation) val screenX = viewLocation[0] + event.x val screenY = viewLocation[1] + event.y // 同样得到屏幕绝对坐标 } return false } })
这两种方法都不需要手动遍历父布局累加偏移量,不管布局层级多复杂都能正常工作,且完全满足你“只在TextView上设置触摸监听”的要求。
内容的提问来源于stack exchange,提问作者Jatin guglani
相关产品推荐
相关产品推荐

