ImageView碰撞检测:代码放置位置及无日志输出问题咨询
解决ImageView碰撞检测代码放置位置及Log无输出的问题
首先得明确:碰撞检测代码不能随便扔在Activity的onCreate末尾这类位置,因为此时ImageView还没完成布局绘制,获取到的位置、尺寸都是0,自然检测不出碰撞,Log也不会有输出。下面给你具体的解决方案:
一、正确的代码放置时机
你得等ImageView完成布局绘制后,再执行碰撞检测逻辑,推荐这几个靠谱的位置:
1. 用View.post()方法(最常用)
在Activity的onCreate里,给ImageView或者根View加个post回调,确保View已经绘制完成:
// Kotlin示例 override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) val imageView1 = findViewById<ImageView>(R.id.image1) val imageView2 = findViewById<ImageView>(R.id.image2) // 等View绘制完再执行检测 imageView1.post { checkCollision(imageView1, imageView2) } } // 封装的碰撞检测方法 private fun checkCollision(view1: View, view2: View) { val rect1 = Rect() view1.getHitRect(rect1) val rect2 = Rect() view2.getHitRect(rect2) val isCollided = Rect.intersects(rect1, rect2) Log.d("CollisionCheck", "是否碰撞:$isCollided") }
如果是Java写法,逻辑一样:
// Java示例 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); ImageView imageView1 = findViewById(R.id.image1); ImageView imageView2 = findViewById(R.id.image2); imageView1.post(new Runnable() { @Override public void run() { checkCollision(imageView1, imageView2); } }); } private void checkCollision(View view1, View view2) { Rect rect1 = new Rect(); view1.getHitRect(rect1); Rect rect2 = new Rect(); view2.getHitRect(rect2); boolean isCollided = Rect.intersects(rect1, rect2); Log.d("CollisionCheck", "是否碰撞:" + isCollided); }
2. 重写onWindowFocusChanged()方法
当Activity获取到窗口焦点时,所有View都已经完成布局,这里也能执行检测:
override fun onWindowFocusChanged(hasFocus: Boolean) { super.onWindowFocusChanged(hasFocus) if (hasFocus) { val imageView1 = findViewById<ImageView>(R.id.image1) val imageView2 = findViewById<ImageView>(R.id.image2) checkCollision(imageView1, imageView2) } }
3. 动态移动ImageView时的处理
要是你的ImageView是可移动的(比如用户拖拽、动画移动),那得在移动的回调里实时执行检测:
- 拖拽场景:在
OnTouchListener的ACTION_MOVE事件里调用checkCollision() - 属性动画场景:添加
AnimatorUpdateListener,在onAnimationUpdate()里检测碰撞
二、Log无输出的额外排查点
如果按上面的方法放了还是没Log,检查这几点:
- 确认Logcat的过滤条件:有没有选对当前应用进程,有没有误过滤掉
CollisionCheck标签 - 检查ImageView的id是否正确,有没有找错View
- 先手动把两个ImageView设为重叠状态测试,排除位置没重叠的问题
三、补充说明
getHitRect()获取的是View在父布局中的可见区域,如果你的ImageView在ScrollView这类滚动布局里,或者需要基于屏幕全局坐标检测,可以改用getGlobalVisibleRect()来获取坐标,碰撞检测逻辑是一样的。
内容的提问来源于stack exchange,提问作者NBA MIXTAPE3
相关产品推荐
相关产品推荐

