onTouch с Multitouch и SoundPool Motion Events

Итак, я делаю приложение для ксилофона для Android и столкнулся с проблемой, я не уверен, как правильно использовать onTouch. Прямо сейчас я могу нажать на изображение и воспроизвести звук, но я не могу воспроизвести два звука одновременно, и я не могу провести пальцем вниз по ксилофону и воспроизвести все звуки, он будет воспроизводить только первое нажатое изображение. Я знаю, что это из-за onTouch и Multitouch, но я не знаю, как это сделать, и я не могу найти соответствующий пример кода, любая помощь приветствуется!

это моя основная деятельность

public class Xylophone extends Activity {
private Player mSoundManager;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_xylophone);
    mSoundManager = new Player();
    mSoundManager.initSounds(getBaseContext());
    mSoundManager.addSound(1, R.raw.note01);
    mSoundManager.addSound(2, R.raw.note02);
    mSoundManager.addSound(3, R.raw.note03);
    mSoundManager.addSound(4, R.raw.note04);
    mSoundManager.addSound(5, R.raw.note05);
    mSoundManager.addSound(6, R.raw.note06);
    mSoundManager.addSound(7, R.raw.note07);
    mSoundManager.addSound(8, R.raw.note08);

    ImageView img01 = (ImageView) findViewById(R.id.imageView1);
    img01.setOnTouchListener(new OnTouchListener() {    

        @Override
        public boolean onTouch(View v, MotionEvent event) {
            mSoundManager.playSound(1);
            return false;
        }           
    });

    ImageView img02 = (ImageView) findViewById(R.id.imageView2);
    img02.setOnTouchListener(new OnTouchListener() {    

        @Override
        public boolean onTouch(View v, MotionEvent event) {
            mSoundManager.playSound(2);
            return false;
        }           
    });

Это моя активность в SoundPool

public class Player {

private  SoundPool mSoundPool; 
private  HashMap<Integer, Integer> mSoundPoolMap; 
private  AudioManager  mAudioManager;
private  Context mContext;


public Player()
{

}

public void initSounds(Context theContext) { 
     mContext = theContext;
     mSoundPool = new SoundPool(8, AudioManager.STREAM_MUSIC, 0); 
     mSoundPoolMap = new HashMap<Integer, Integer>(); 
     mAudioManager = (AudioManager)mContext.getSystemService(Context.AUDIO_SERVICE);         
} 

public void addSound(int Index,int SoundID)
{
    mSoundPoolMap.put(Index, mSoundPool.load(mContext, SoundID, 1));
}

public void playSound(int index) { 

     int streamVolume = mAudioManager.getStreamVolume(AudioManager.STREAM_MUSIC); 
     mSoundPool.play(mSoundPoolMap.get(index), streamVolume, streamVolume, 1, 0, 1f); 
}

public void playLoopedSound(int index) { 

     int streamVolume = mAudioManager.getStreamVolume(AudioManager.STREAM_MUSIC); 
     mSoundPool.play(mSoundPoolMap.get(index), streamVolume, streamVolume, 1, -1, 1f); 
}

}

это мой макет

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent" >

<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_centerVertical="true"
    android:orientation="horizontal" >

    <ImageView
        android:id="@+id/imageView1"
        android:layout_width="0dp"
        android:layout_height="match_parent"
        android:layout_weight="1"
        android:adjustViewBounds="true"
        android:cropToPadding="false"
        android:scaleType="fitXY"
        android:src="@drawable/button01" />

    <ImageView
        android:id="@+id/imageView2"
        android:layout_width="0dp"
        android:layout_height="match_parent"
        android:layout_weight="1"
        android:scaleType="fitXY"
        android:src="@drawable/button02" />

person bliynd    schedule 04.11.2012    source источник
comment
Я действительно мог бы использовать толчок в правильном направлении, я попытался прочитать о событиях движения на developer.android.com/reference/android/view/MotionEvent.html но я просто не понимаю, кто-нибудь?   -  person bliynd    schedule 10.11.2012


Ответы (1)


надеюсь, вы поняли это до сих пор. Тем не менее, вот мой вариант: во-первых, ваше второе занятие, SoundPool, — это не занятие.

Что вам нужно попробовать, так это не переопределять метод onTouch каждой кнопки.


Вместо этого в своей основной деятельности реализуйте OnTouchListener.

Затем, конечно, вам нужно реализовать/переопределить методы OnTouchListener. Так что теперь, если вы зарегистрируете свой основной вид и/или каждую кнопку (посмотрите сами, что работает!) в OnTouchListener, вы получите все касания (включая мультитач).

Дополнительные сведения см. в классе MotionEvent.

public class Xylophone extends Activity implements onTouchLister{
    public static final String TAG = "Xylophone";
    @Override
    public void onCreate(Bundle savedInstanceState) {
        /*Either have your parent view register THIS (Xylophone) as its listener, or have each button register THIS(Xylophone) as its listener.*/
        yourParentView.setOnTouchListener(this);
        //or
        img02.setOnTouchListener(this);
    }

    @Override
    public boolean onTouch(View v, MotionEvent event) {
        Log.i(TAG, "ID:" + Integer.toString(v.getId()));
        Log.i(TAG, "Pointer count: " + event.getPointerCount());        
        Log.i(TAG, "Action: " + event.getActionMasked());
        Log.i(TAG, "Action index: " + event.getActionIndex());
    }
person Radu    schedule 06.03.2013