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

Java 与ImageView位置相比,OnTouch给出了不同的位置,java,android,kotlin,android-activity,android-touch-event,Java,Android,Kotlin,Android Activity,Android Touch Event,我以编程方式定义了许多ImageViews,它们在数组中的位置如下: const1Positions=arrayOf( 点(dpToPx(349),dpToPx(258)), 点(dpToPx(491),dpToPx(302)), 点(dpToPx(495),dpToPx(429)), 点(dpToPx(669),dpToPx(524)), 点(dpToPx(600),dpToPx(618)) ) 这里是dpToPx: fun Activity.dpToPx(dp:Int):Int{ 返回类型

我以编程方式定义了许多
ImageView
s,它们在数组中的位置如下:

const1Positions=arrayOf(
点(dpToPx(349),dpToPx(258)),
点(dpToPx(491),dpToPx(302)),
点(dpToPx(495),dpToPx(429)),
点(dpToPx(669),dpToPx(524)),
点(dpToPx(600),dpToPx(618))
)
这里是dpToPx:

fun Activity.dpToPx(dp:Int):Int{
返回类型value.applyDimension(
TypedValue.COMPLEX\u UNIT\u DIP,
dp.toFloat(),
resources.displayMetrics
).roundToInt()
}
我正在尝试
setOnTouchListener
到每个
ImageView
(当我在for中初始化它们时,我还调用
ImageView.setOnTouchListener…

但是我的触摸没有被识别。 我还尝试过,在主视图中添加
onTouchEvent
,而不是在每个
ImageView
中添加
onTouchEvent
,如果
event.x==ImageView.x
(用户触摸了
ImageView
),则执行这些操作。但是
event.x
image.x
是不同的

这是我的
setOnTouchListener

view.setOnTouchListener{v,事件->
何时(event.actionMasked){
MotionEvent.ACTION\u向下->{
Log.d(“DEBUG_标记”,event.x.toString())
真的
}
MotionEvent.ACTION\u UP->{
Log.d(“调试标签”,“操作已启动”)
Log.d(“test”,const1Positions[0].x.toString())
Log.d(“test2”,view.width.toString())
真的
}
MotionEvent.ACTION\u MOVE->{
Log.d(“DEBUG_标记”,“操作被移动”)
真的
}
MotionEvent.ACTION\u取消->{
Log.d(“调试标签”,“操作被取消”)
真的
}
MotionEvent.ACTION\u外部->{
对数d(
“调试标签”,
“移动发生在当前屏幕元素的边界之外”
)
真的
}
else->super.onTouchEvent(事件)
}
}
我的布局宽度和高度都比屏幕大2倍,我可以放大/缩小和滚动,但我没有使用
ScrollView
。我正在使用GitHub上提供的自定义布局

params.width=view.resources.displayMetrics.widthPixels*2
params.height=view.resources.displayMetrics.heightPixels*2
view.layoutParams=参数
我正在使用
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 2020-03-25 19:31:07.796 26112-26112/com.example.android.bonte_安卓D/DEBUG_标签:395.63367 2020-03-25 19:31:07.833 26112-26112/com.example.android.bonte_安卓D/test:890 2020-03-25 19:31:07.834 26112-26112/com.example.android.bonte_安卓D/test2:2160 屏幕位置基于2160,因此显示890。但即使我触摸屏幕,
event.x
位置显示395而不是890,并且
event.x
接收的最大位置是1080(真实手机宽度),而不是2160(版面最大宽度)。有人知道为什么会这样吗

与其将
onTouchListener
添加到
视图中,不如添加到所有的
ImageView
中,但当我这样做时,正如我所说,
onTouchListener
无法识别任何触摸,

我希望答案(Piyus)能让您满意:

MotionEvent有时返回相对于视图的绝对X和Y坐标,有时返回相对于上一个运动事件的相对坐标

getRawX()和getRawY(),保证返回相对于设备屏幕的绝对坐标

而getX()和getY()应该返回相对于调度它们的视图的坐标

UPD:添加到XML属性
app:hasClickableChildren=“true”
解决此问题。

我希望答案(由Piyush提供)能让您满意:

MotionEvent有时返回相对于视图的绝对X和Y坐标,有时返回相对于上一个运动事件的相对坐标

getRawX()和getRawY(),保证返回相对于设备屏幕的绝对坐标

而getX()和getY()应该返回相对于调度它们的视图的坐标


UPD:添加到XML属性
app:hasClickableChildren=“true”
修复此问题。

这是否回答了您的问题?请读一读。这将帮助你在发帖前创建一个格式良好的问题。@YaroslavOvdiienko感谢你的提示,并为我的格式错误感到抱歉,我会检查它!这回答了你的问题吗?请读一读。这将帮助你在发帖前创建一个格式良好的问题。@YaroslavOvdiienko感谢你的提示,并为我的格式错误感到抱歉,我会检查它!根据我的手机屏幕,这两种方法都返回相同的值。我发现ImageView上的接触无法被识别,因为我使用的是外部库作为布局。当我删除它并尝试使用ScrollView/HorizontalScrollView时,我收到了触摸事件。@LucasRodrigues我可以请您给我一个指向此库的链接吗?请仔细阅读。这里是:当我将onTouchEvent添加到我的框架布局(我的ImageView所在的位置)时,我收到了事件。FrameLayout位于ZoomLayout内部。但是当我将onTouchListener直接添加到ImageView时,它无法识别触摸。我选择此ZoomLayout是因为ScrollView/HorizontalScrollView没有对角滚动,而且我还必须实现缩放。您是否在XML属性
app:hasClickableChildren=“true”
中添加了
ZoomLayout
?根据我的手机屏幕,这两种方法都返回相同的值。我发现ImageView上的接触无法被识别,因为我使用的是外部库作为布局。当我删除它并尝试使用ScrollView/HorizontalScrollView时,我收到了t