每个不同的触摸事件的不同响应

时间:2011-09-14 21:43:26

标签: android

经过大约一周的反复试验,我终于想出了如何启用多点触控。然而,我遇到了另一个问题。首先,让我解释一下我的应用程序。

这是一个非常基本的应用程序。当您触摸屏幕上的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();
}
}

有谁知道我做错了什么?提前致谢!

1 个答案:

答案 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了解详情。