[英]How to get view with x and y position on Android
我正在尝试在dispatchTouchEvent()
中查看。
但是,这只会传递 MotionEvent。 它有 x 和 y position。 但是,它不会通过视图本身。
我可以用currentFocus
查看。 但是,这在获得焦点后会得到视图。 当您触摸 EditText 然后在 EdiText 之外触摸时,EditText 仍然具有焦点。 因此, currentFocus
将是相同的 EditText。
我想要做的是在我触摸非 EditText 时关闭键盘。 并在我触摸 EditText 时显示键盘。 但是当我触摸 EditText A 和 EditText B 时,它不应该闪烁(隐藏并再次显示)
我正在尝试的是:
override fun dispatchTouchEvent(ev: MotionEvent?): Boolean {
var view = currentFocus
if (view == null) {
view = View(this@BaseActivity)
}
ev?.let {
val isInRange = isRegionOfInterest(view, ev)
if(!isInRange){
hideKeyboard()
currentFocus?.clearFocus()
}
}
return super.dispatchTouchEvent(ev)
}
但这似乎不是正确的方法。 如果我能看到 X 和 Y 位置的视图,那就太好了。 你知道有什么办法吗?
这就是我所做的:
private fun isHidableArea(x: Float?, y: Float?): Boolean {
var result = true
if (x == null || y == null) return result
val rootView = (findViewById<View>(R.id.content) as ViewGroup).getChildAt(0) as ViewGroup
val interestViewList = rootView.findInterestViewListByPosition(x, y)
loop@ for (v in interestViewList) {
if (v is EditText) {
result = false
break@loop
}
}
return result
}
private fun View.findInterestViewListByPosition(x: Float, y: Float): ArrayList<View> {
val childViewList = this.getAllChildren()
val interestViewList = ArrayList<View>()
for (it in childViewList) {
if (isRegionOfInterest(it, x, y)) {
interestViewList.add(it)
}
}
return interestViewList
}
private fun View.getAllChildren(): List<View> {
val result = ArrayList<View>()
if (this !is ViewGroup) {
result.add(this)
} else {
for (index in 0 until this.childCount) {
val child = this.getChildAt(index)
result.addAll(child.getAllChildren())
}
}
return result
}
override fun dispatchTouchEvent(ev: MotionEvent): Boolean {
if (isHidableArea(ev.x, ev.y)) {
hideKeyboard()
}
return super.dispatchTouchEvent(ev)
}
private fun isRegionOfInterest(view: View, x: Float, y: Float): Boolean {
return x in view.x - 0..(view.x + view.width) && y in view.y - 0..view.y + view.height
}
这将获取所有子视图并比较 position。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.