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