0

我正在尝试实现一个钢琴应用程序,所以我有 2 个白键图像和黑键图像之间。rect 与这 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
                    }
  });
4

1 回答 1

0

矩形就是它们的本质:矩形。因此,重叠黑色按钮上的触摸事件也位于其下方左侧或右侧白色按钮的 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()等方法,但上述解决方案就足够了。

于 2014-01-10T15:58:10.643 回答