У меня есть много ImageView
s, определенных программно, и они имеют свои позиции в массивах, например:
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()
}
I ' я пытаюсь setOnTouchListener
на каждый ImageView
(когда я инициализирую их внутри для for, я также называю imageview.setOnTouchListener...
)
Но мое прикосновение не распознается. Я также попытался вместо добавления onTouchListener
к каждому ImageView
добавить 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
s, но когда я это сделаю, как я сказал, onTouchListener
не распознает никаких прикосновений,