我按照link来设计我的钢琴应用程序。我能够为钢琴设计节点。现在我有问题识别哪个节点用户触摸,以便我可以播放特定节点。
我的自定义钢琴键代码是:
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);
}
}
}
}
在Activity中我正在调用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以便我可以播放节点。
答案 0 :(得分:0)
您必须获得用户触摸的位置,请查看this post 和here is如何设置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;
}
}
答案 1 :(得分: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文件。