[英]OnTouch giving different position, compared to ImageView position
我以编程方式定义了许多ImageView
,它们在数组中都有自己的位置,如下所示:
const1Positions = arrayOf(
Point(dpToPx(349), dpToPx(258)),
Point(dpToPx(491), dpToPx(302)),
Point(dpToPx(495), dpToPx(429)),
Point(dpToPx(669), dpToPx(524)),
Point(dpToPx(600), dpToPx(618))
)
这是dpToPx
:
fun Activity.dpToPx(dp: Int): Int {
return TypedValue.applyDimension(
TypedValue.COMPLEX_UNIT_DIP,
dp.toFloat(),
resources.displayMetrics
).roundToInt()
}
我试图将setOnTouchListener
为每个ImageView
(当我在 for 中初始化它们时,我也调用imageview.setOnTouchListener...
)
但是我的触摸无法识别。 我也尝试过,而不是向每个ImageView
添加一个onTouchListener
,而是在主视图中添加onTouchEvent
,如果event.x == imageview.x
(用户触摸ImageView
),则执行操作。 但是event.x
和image.x
是不同的。
这是我的setOnTouchListener
:
view.setOnTouchListener { v, event ->
when (event.actionMasked) {
MotionEvent.ACTION_DOWN -> {
Log.d("DEBUG_TAG", event.x.toString())
true
}
MotionEvent.ACTION_UP -> {
Log.d("DEBUG_TAG", "Action was UP")
Log.d("test", const1Positions[0].x.toString())
Log.d("test2", view.width.toString())
true
}
MotionEvent.ACTION_MOVE -> {
Log.d("DEBUG_TAG", "Action was MOVE")
true
}
MotionEvent.ACTION_CANCEL -> {
Log.d("DEBUG_TAG", "Action was CANCEL")
true
}
MotionEvent.ACTION_OUTSIDE -> {
Log.d(
"DEBUG_TAG",
"Movement occurred outside bounds of current screen element"
)
true
}
else -> super.onTouchEvent(event)
}
}
我的布局宽度和高度都比屏幕大 2 倍,我可以放大/缩小和滚动,但我没有使用ScrollView
。 我正在使用 GitHub 上提供的自定义布局。
params.width = view.resources.displayMetrics.widthPixels * 2
params.height = view.resources.displayMetrics.heightPixels * 2
view.layoutParams = params
我正在使用Log
来比较触摸位置、 ImageView
位置和布局大小。 但结果完全不同:
2020-03-25 19:31:07.796 26112-26112/com.example.android.bonte_android D/DEBUG_TAG: 395.63367 2020-03-25 19:31:07.833 26112-26112/com.example.android.bonte_android D/test: 890 2020-03-25 19:31:07.834 26112-26112/com.example.android.bonte_android D/test2: 2160
屏幕位置以2160为基准,所以显示890。但即使我触摸屏幕, event.x
位置显示395而不是890,并且event.x
接收的最大位置为1080(真实手机宽度) ,而不是 2160(布局最大宽度)。 有谁知道为什么会这样?
与其将onTouchListener
添加到View
,不如添加到所有ImageView
,但是当我这样做时,正如我所说, onTouchListener
无法识别任何触摸,
我希望这个答案(由 Piyush 提供)会让你满意:
MotionEvent 有时会返回相对于视图的绝对 X 和 Y 坐标,有时会返回相对于前一个运动事件的相对坐标。
getRawX() 和 getRawY() 保证返回相对于设备屏幕的绝对坐标。
虽然 getX() 和 getY() 应该返回您相对于派遣它们的 View 的坐标。
UPD:在 XML 属性app:hasClickableChildren="true"
添加到ZoomLayout
解决了该问题。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.