【发布时间】:2020-03-27 04:00:59
【问题描述】:
我有许多以编程方式定义的ImageViews,它们在数组中都有自己的位置,如下所示:
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 位置和布局大小。但结果完全不同:
屏幕位置是以2160为基准的,所以显示的是890。但是即使我触摸屏幕,event.x的位置显示的是395而不是890,event.x接收到的最大位置是1080(实际手机宽度),而不是 2160(布局最大宽度)。有谁知道为什么会这样?
与其将onTouchListener 添加到View,不如添加到所有ImageViews,但是当我这样做时,正如我所说,onTouchListener 无法识别任何触摸,
【问题讨论】:
-
请阅读stackoverflow.com/help/how-to-ask。它将帮助您在发布之前创建一个格式正确的问题。
-
@YaroslavOvdiienko 感谢您的提示,并对我的格式错误感到抱歉,我会检查一下!
标签: java android kotlin android-activity android-touch-event