Android 两个按钮的多点触摸问题:即使我按下两个不同的按钮,也总是得到相同的按钮,为什么?
我有两个按钮,按下会发出声音。我想同时按两个声音同时听到这两个声音。到目前为止: @凌驾 //处理导航箭头的触摸 公共布尔onTouch(视图v,运动事件){ 它不起作用。我该如何解决这个问题?另一个问题如果我在屏幕上移动手指,我想在手指触到按钮时按下按钮而不抬起它。移动操作也不起作用。很抱歉,这个愚蠢的问题我在这方面是相当初学者 更新 这个代码检测多点触摸,但我总是得到两个相同的日志,就像我总是用两个手指触摸同一个按钮一样。所以,即使我同时按下这两个按钮,我也会得到一个日志“C”和另一个错误的“C”,我应该得到C和DAndroid 两个按钮的多点触摸问题:即使我按下两个不同的按钮,也总是得到相同的按钮,为什么?,android,button,multi-touch,Android,Button,Multi Touch,我有两个按钮,按下会发出声音。我想同时按两个声音同时听到这两个声音。到目前为止: @凌驾 //处理导航箭头的触摸 公共布尔onTouch(视图v,运动事件){ 它不起作用。我该如何解决这个问题?另一个问题如果我在屏幕上移动手指,我想在手指触到按钮时按下按钮而不抬起它。移动操作也不起作用。很抱歉,这个愚蠢的问题我在这方面是相当初学者 更新 这个代码检测多点触摸,但我总是得到两个相同的日志,就像我总是用两个手指触摸同一个按钮一样。所以,即使我同时按下这两个按钮,我也会得到一个日志“C”和另一个错误的
谢谢你的帮助!你在玩SurfaceView吗?我感觉不是。你为什么不简单地设置每个按钮的OnClickListener 否则,您需要单独访问每个触摸事件:请参阅:处的“索引与ID”一段,也许它会对您有所帮助
Serge你的代码是这样的吗?我强调了一些要点 包be.domore.smokesignaltest 导入android.app.Activity; 导入android.os.Bundle; 导入android.view.MotionEvent; 导入android.view.view; 导入android.view.view.OnTouchListener; 导入android.widget.Button 公共类DummyActivity扩展了活动实现OnTouchListener{ 私人按钮myButton1; 私人按钮myButton2
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// Set the content view
setContentView(R.layout.activity_dummy);
// Map controls
mapControls();
}
private void mapControls() {
myButton1 = (Button) findViewById(R.id.myButton1);
myButton1.setOnTouchListener(this);
myButton2 = (Button) findViewById(R.id.myButton2);
myButton2.setOnTouchListener(this);
}
public boolean onTouch(View v, MotionEvent event) {
**if (event.getAction() == MotionEvent.ACTION_DOWN)**
switch (v.getId()) {
case R.id.myButton1:
// TODO: put your code here
**return true;**
case R.id.myButton2:
// TODO: put your code here
**return true;**
}
*return false;*
}
}
下面的类是我创建的一个帮助程序来管理声音。有趣的部分是函数AssignSoundToView。我不知道它是否会对您有帮助
包be.domore.FingerTwister.Game
导入java.io.IOException
导入be.domore.FingerTwister.Settings
导入android.app.Activity;
导入android.content.res.AssetFileDescriptor;
导入android.content.res.AssetManager;
导入android.media.AudioManager;
导入android.media.MediaPlayer;
导入android.media.SoundPool;
导入android.util.Log;
导入android.view.MotionEvent;
导入android.view.view;
导入android.view.view.OnTouchListener
公共类声音管理器2{
私有静态SoundManager2当前=新SoundManager2()
publicstaticsoundmanager2getcurrent(){
回流;
}
私有布尔初始化=false;
私人媒体播放器;
私人音乐池;
私人资产管理人资产管理人;
私有int[]soundId=newint[Sounds.values().length];
私有int[]soundStream=newint[Sounds.values().length];
私有SoundManager2(){
}
公共声音视图(视图、声音、声音){
最终声音;
if(Settings.hasFx()==false){
}else if(sound!=Sounds.none){
currentSound=sound.ordinal();
view.setOnTouchListener(新的OnTouchListener(){
公共布尔onTouch(视图v,运动事件){
试一试{
if(event.getAction()==MotionEvent.ACTION\u向下)
pool.play(soundId[currentSound],1.0f,1.0f,0,0,
1);
}最后{
}
返回false;
}
});
}
}
公共布尔初始化(活动){
如果(初始化==false){
player=新媒体播放器();
池=新的声音池(20,AudioManager.STREAM_MUSIC,0);
assetManager=activity.getAssets();
activity.setVolumeControlStream(AudioManager.STREAM_MUSIC);
for(int idx=1;idx
}不,我不使用surfaceview,是吗?为什么会更好?如果我只是为每个按钮设置onClickListener,它仍然不起作用。我检查了我制作的游戏的源代码,事实上我与OnTouch合作过
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// Set the content view
setContentView(R.layout.activity_dummy);
// Map controls
mapControls();
}
private void mapControls() {
myButton1 = (Button) findViewById(R.id.myButton1);
myButton1.setOnTouchListener(this);
myButton2 = (Button) findViewById(R.id.myButton2);
myButton2.setOnTouchListener(this);
}
public boolean onTouch(View v, MotionEvent event) {
**if (event.getAction() == MotionEvent.ACTION_DOWN)**
switch (v.getId()) {
case R.id.myButton1:
// TODO: put your code here
**return true;**
case R.id.myButton2:
// TODO: put your code here
**return true;**
}
*return false;*
}
public static SoundManager2 getCurrent() {
return current;
}
private boolean initialized = false;
private MediaPlayer player;
private SoundPool pool;
private AssetManager assetManager;
private int[] soundId = new int[Sounds.values().length];
private int[] soundStream = new int[Sounds.values().length];
private SoundManager2() {
}
public void assignSoundToView(View view, Sounds sound) {
final int currentSound;
if (Settings.hasFx() == false) {
} else if (sound != Sounds.none) {
currentSound = sound.ordinal();
view.setOnTouchListener(new OnTouchListener() {
public boolean onTouch(View v, MotionEvent event) {
try {
if (event.getAction() == MotionEvent.ACTION_DOWN)
pool.play(soundId[currentSound], 1.0f, 1.0f, 0, 0,
1);
} finally {
}
return false;
}
});
}
}
public boolean initialize(Activity activity) {
if (initialized == false) {
player = new MediaPlayer();
pool = new SoundPool(20, AudioManager.STREAM_MUSIC, 0);
assetManager = activity.getAssets();
activity.setVolumeControlStream(AudioManager.STREAM_MUSIC);
for (int idx = 1; idx < Sounds.values().length; idx++)
soundId[idx] = loadSound(
String.format("%s.mp3", Sounds.values()[idx]),
assetManager);
initialized = true;
} else
Log.w("SoundManager", "SoundManager was already initialized");
return initialized;
}
public boolean isInitialized() {
return initialized;
}
private int loadSound(String filename, AssetManager assetManager) {
int rc;
AssetFileDescriptor afd;
try {
afd = assetManager.openFd(filename);
rc = pool.load(afd, 1);
} catch (IOException e) {
e.printStackTrace();
rc = 0;
}
return rc;
}
public boolean playMusic(String filename) {
boolean rc = false;
AssetFileDescriptor descriptor;
if (initialized == false)
Log.e("SoundManager", "SoundManager is not initialized");
else
try {
descriptor = assetManager.openFd(filename);
player.reset();
player.setDataSource(descriptor.getFileDescriptor(),
descriptor.getStartOffset(),
descriptor.getDeclaredLength());
player.setLooping(true);
// player.setVolume(1.0f, 1.0f);
player.prepare();
player.start();
rc = true;
} catch (Exception e) {
e.printStackTrace();
}
return rc;
}
public void playSound(Sounds sound) {
int index;
index = sound.ordinal();
soundStream[index] = pool.play(soundId[index], 1.0f, 1.0f, 0, 0, 1);
}
public void stopAllSound() {
for (int idx = 1; idx < Sounds.values().length; idx++)
stopSound(Sounds.values()[idx]);
}
public boolean stopMusic() {
boolean rc = false;
if (initialized == false)
Log.e("SoundManager", "SoundManager is not initialized");
else {
player.stop();
rc = true;
}
return rc;
}
public void stopSound(Sounds sound) {
int index;
index = sound.ordinal();
pool.stop(soundStream[index]);
}