我正在尝试实现一个钢琴应用程序,所以我有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()等方法,但上面的解决方案应该足够了