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 に答える