1

我按照这个链接来设计我的钢琴应用程序。我能够为钢琴设计节点。现在我无法识别用户触摸哪个节点,以便我可以播放特定节点。

我的自定义钢琴键代码是:

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.view.View;

class Piano extends View {
    public Piano(Context context) {
        super(context);
        // TODO Auto-generated constructor stub
    }

    Bitmap whiteKey, blackKey;
    Paint paint = new Paint();

    public void draw(Canvas canvas) {
        if (whiteKey == null) {
            whiteKey = BitmapFactory.decodeResource(getResources(), R.drawable.white_up);
        }
        if (blackKey == null) {
            blackKey = BitmapFactory.decodeResource(getResources(), R.drawable.black_up);
        }

        int keys = 10;

        // draw white keys
        for (int i = 0; i < keys; i++) {
            canvas.drawBitmap(whiteKey, i * whiteKey.getWidth(), 0, paint);
        }
        // draw black keys
        for (int i = 0; i < keys; i++) {
            if (i != 3 && i != 7) {
                canvas.drawBitmap(blackKey, i * blackKey.getWidth()+blackKey.getWidth()*0.5f, 0, paint);
            }
        }
    }
}

在活动中我正在调用setContentView这样的方法。

import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;

public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        Piano piano = new Piano(this);
        setContentView(piano);

    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }

}

我将如何获得位图的 id 以便我可以播放节点。

4

2 回答 2

0

您必须获得用户触摸的位置,查看这篇文章这里是如何设置 onTouchListener。当您拥有 x,y 位置时,您必须测试按下了哪个键。

尝试首先为所有黑键运行 for 循环,因为它们与白键重叠。如果您没有找到任何按下的黑键,则遍历所有白键。白键的循环看起来像这样:

boolean keyfound=false;
int pressedkey=-1;
for (int i = 0; i < keys; i++) {
    if( (x>=(i*whiteKey.getWidth())) && (x<((i+1)*whiteKey.getWidth()))
        && (y>0) && (y<whiteKey.getHeight()) )
    {
         pressedkey=i;
         keyfound=true;
         break;
    }
}
于 2013-07-12T16:14:03.700 回答
0

为. setOnTouchListener_ Canvas实现了一个如下所示的OnTouchListener函数:onTouch(View v, MotionEvent event). 其中包含以和MotionEvent的形式实际发生触摸的位置的信息。使用数据找到被点击的按钮。我认为这应该可以解决问题。getX()getY()

x=event.getX();
y=event.getY();
let whitewidth and blackwidth be the width of these keys and similarly whiteheight and    blackheight.
for (int i = 0; i < num_of_keys; i++) {
    if( (x>(i*whitewidth)) && (x<((i+1)*whitewidth))
        && (y>0) && (y<whiteheight) )
    {
         pressedkey=i;
    }
}

使用按键的 id,您可以播放特定的 mp3 文件。

于 2013-07-12T16:30:40.827 回答