Android 尝试在自定义视图的onTouchEvent中检测子视图

Android 尝试在自定义视图的onTouchEvent中检测子视图,android,android-relativelayout,gesture,Android,Android Relativelayout,Gesture,我正在尝试为孩子们制作一个游戏,在这个游戏中,你用一些星星制作人物,孩子们必须用手指连接星星。除了一件事,我什么都做过,当手指穿过一颗星星时,星星一定会变红并发出声音 这颗星确实会变红,发出声音,但前提是我轻拍它们。如果我试着用手指在图中拖动,只有我点击的第一颗星会响并变红,其余的不会。我的自定义视图是一个从RelativeLayout扩展而来的类,其中包含一些ImageView,即星星。要添加星星,我只需从数据结构中读取有关该图形的数据,然后动态实例化ImageView,将它们添加到适当的边距

我正在尝试为孩子们制作一个游戏,在这个游戏中,你用一些星星制作人物,孩子们必须用手指连接星星。除了一件事,我什么都做过,当手指穿过一颗星星时,星星一定会变红并发出声音

这颗星确实会变红,发出声音,但前提是我轻拍它们。如果我试着用手指在图中拖动,只有我点击的第一颗星会响并变红,其余的不会。我的自定义视图是一个从RelativeLayout扩展而来的类,其中包含一些ImageView,即星星。要添加星星,我只需从数据结构中读取有关该图形的数据,然后动态实例化ImageView,将它们添加到适当的边距以生成该图形。到目前为止,我已尝试在每个星星中使用setOnTouchListener,从星星视图中重写onTouchEvent,使用setOnTouchListener,onTouchEvent,RelativeLayout中的setOnHoverListener和setOnDragListener。在这些方法中,我实现的检查回调中视图的方法是:

            for (View v : vStarsCollection) {
                Rect viewBounds = new Rect(v.getLeft(), v.getTop(), v.getRight(), v.getBottom());
                if (viewBounds.contains((int)event.getX(), (int)event.getY())) {
                    MediaPlayer mp = MediaPlayer.create(getContext(), R.raw.right_simon_sound);
                    mp.start();
                    ((ImageView) v).setImageResource(R.drawable.star_red);
                }
            }

其中vStarsCollection是我在RelativeLayout中添加的ImageView的集合。就像我告诉过你的,当我点击时,代码就起作用了,但当我用手指划过星星时,代码就不起作用了。如何才能做到这一点?

不要将触控监听器添加到每个星星,而是尝试添加到您的自定义视图,即relativelayout

然后在onTouch回调中,添加现有逻辑以更改颜色


因此,onTouch不会超出您的视图范围

对不起,我已经这样做了,我在问题中写道……到目前为止,我已经尝试在每个星号中使用setOnTouchListener,从星号视图覆盖onTouchEvent,在RelativeLayout中使用setOnTouchListener、onTouchEvent、setOnHoverListener和setOnDragListener。我说的相对论是自定义视图。