经过大约一周的反复试验,我终于想出了如何启用多点触控。然而,我遇到了另一个问题。首先,让我解释一下我的应用程序。
这是一个非常基本的应用程序。当您触摸屏幕上的AREA_A时,它将播放SOUND_A。当您触摸屏幕上的AREA_B时,它将播放SOUND_B。很简单。我希望这可以使用多点触控,所以我使用了OnTouch事件。我现在可以同时在屏幕上触摸AREA_A和AREA_B,并从两个区域获得声音(多点触控工作的证据),但问题出在这里。如果我开始触摸AREA_A,并将手指放在那里,然后触摸AREA_B(我的第一根手指仍然触摸AREA_A),而不是听到SOUND_B,我听到正在播放SOUND_A。我很困惑为什么会这样。如果我粘贴代码,我认为事情会更清楚,所以现在就是这样。 (我继续加入我的整个课程,这样你就可以从头到尾检查它。)
package com.tst.tanner;
import android.app.Activity;
import android.graphics.Color;
import android.media.AudioManager;
import android.media.SoundPool;
import android.os.Bundle;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnTouchListener;
public class sp extends Activity implements OnTouchListener {
private SoundPool soundPool;
private int bdsound, sdsound;
float x, y;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
// Set the hardware buttons to control the music
this.setVolumeControlStream(AudioManager.STREAM_MUSIC);
// Load the sound
View v = (View) findViewById(R.id.view1);
v.setOnTouchListener(this);
soundPool = new SoundPool(10, AudioManager.STREAM_MUSIC, 0);
bdsound = soundPool.load(this, R.raw.kickdrum1, 1);
sdsound = soundPool.load(this, R.raw.sd, 1);
}
@Override
public boolean onTouch(View v, MotionEvent e) {
// TODO Auto-generated method stub
x = e.getX();
y = e.getY();
v.setBackgroundColor(Color.rgb(236,234,135));
switch (e.getActionMasked()) {
case MotionEvent.ACTION_DOWN:
if (x > 1 & x < 200 & y > 1 & y < 200) {
soundPool.play(bdsound, 10, 10, 1, 0, 1);
}
if (x > 1 & x < 200 & y > 200 & y < 400) {
soundPool.play(sdsound, 10, 10, 1, 0, 1);
}
break;
case MotionEvent.ACTION_POINTER_1_DOWN:
if
(x > 1 & x < 200 & y > 1 & y < 200) {
soundPool.play(bdsound, 10, 10, 1, 0, 1);
}
if (x > 1 & x < 200 & y > 200 & y < 400) {
soundPool.play(sdsound, 10, 10, 1, 0, 1);
}
break;
case MotionEvent.ACTION_UP:
v.setBackgroundColor(Color.BLACK);
}
return true;
}
@Override
protected void onPause() {
// TODO Auto-generated method stub
super.onPause();
soundPool.release();
finish();
}
}
有谁知道我做错了什么?提前致谢!
答案 0 :(得分:2)
getX()
和getY()
函数始终返回第一个指针的位置。我怀疑这会导致你的问题。
当您将第二根手指触摸区域B中的屏幕时,MotionEvent的类型为ACTION_DOWN
,因此将播放声音(就像您预期的那样)。但是,由于您首先触摸了区域A,并且仍在触摸它,因此该位置是getX()
和getY()
返回的位置。
要获取特定指针的位置,请尝试使用getX(int)
和getY(int)
函数。例如,如果您用两根手指触摸屏幕并想要第二根手指的位置,则可以使用
x2 = getX(1);
y2 = getY(1);
getX()
与getX(0)
相同
getY()
与getY(0)
您可以查看documentation了解详情。