繁体   English   中英

与 ImageView 位置相比,OnTouch 给出不同的位置

[英]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.ximage.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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM