OnTouch дает другую позицию по сравнению с позицией ImageView - PullRequest
1 голос
/ 26 марта 2020

У меня есть много 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 не распознает никаких прикосновений,

1 Ответ

0 голосов
/ 26 марта 2020

Надеюсь этот ответ (по Пию sh) удовлетворит вас:

MotionEvent иногда возвращает абсолютные координаты X и Y относительно вида, а иногда и относительные координаты к предыдущему событию движения.

getRawX () и getRawY (), которые гарантированно возвращают абсолютные координаты относительно экрана устройства.

Хотя getX () и getY (), должны вернуть координаты, относящиеся к представлению, отправившему их.

UPD: добавление к ZoomLayout в XML свойстве app:hasClickableChildren="true" fix вопрос.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...