图像重叠,所以getHitRect()方法返回2个值



我正在尝试实现一个钢琴应用程序,所以我有2个白键图像和在黑键图像之间。矩形与这3个图像相关联,并且在onTouchListener方法中,当我按下黑键时,getHitRect()函数给我所有3个值和所有3个声音同时播放。我应该做什么改变,这样只有外部图像按钮,即黑键坐标应该被考虑,只有那个音符会被播放。它适用于白色键,图像没有重叠。

任何帮助都是非常感谢的……

  myButtons = new ArrayList<ImageView>(); 
    myButtons.add(img_c);  //white key1
    myButtons.add(img_db); //black key
    myButtons.add(img_d);  //white key2
  getWindow().getDecorView()
    .findViewById(android.R.id.content)
    .setOnTouchListener(new OnTouchListener() {
        public boolean onTouch(View arg0, MotionEvent event) {
            int action = event.getAction();
            if (action != MotionEvent.ACTION_DOWN 
                && action != MotionEvent.ACTION_MOVE 
                && action != MotionEvent.ACTION_UP) return false;
            Rect hitRect = new Rect();
            ImageView button;
            for(int i = 0; i < myButtons.size(); i++) {
                button = myButtons.get(i);
                button.getHitRect(hitRect);
           if (hitRect.contains((int)event.getX(), (int)event.getY())) {
            if(action==MotionEvent.ACTION_DOWN)
                    {
                    //play the sound
                    }
  });

矩形就是这样:矩形。因此,重叠黑色按钮上的触摸事件也在它下面的左侧或右侧白色按钮的hitRect内(假设您的白色按钮不重叠)。这意味着点击黑色按钮也总是触发底层白色按钮的声音(首先或最后,取决于你点击黑色按钮的中轴的哪一边)。

为了避免这种情况,你需要检查白色按钮的触摸事件是否也在黑色按钮的hitRect内。如果是,忽略白色按钮,只触发黑色按钮。所以

if (hitRectWhite.contains((int)event.getX(), (int)event.getY()) && !hitRectBlack.contains((int)event.getX(), (int)event.getY()))

则触发白色而忽略黑色,否则忽略白色而只触发黑色。随便摆弄一下,这只是一个例子。这意味着你将不得不改变你的实现,以便你有重叠的白色和黑色按钮的相关的hitRects在同一时间。

为了区分白色和黑色,你可以使用这样的标签:

private enum ButtonColor {BLACK, WHITE}
img_c.setTag(ButtonColor.WHITE);
img_db.setTag(ButtonColor.BLACK);
img_d.setTag(ButtonColor.WHITE);
// and the check e.g. like this..
if (button.getTag() == ButtonColor.WHITE) {
  ...
}

也许你也可以使用contains(), intersects()等方法,但上面的解决方案应该足够了

相关内容

  • 没有找到相关文章

最新更新