2011-09-14 19 views
0

私は最終的に試行錯誤の約1週間後にマルチタッチを有効にする方法を考え出しました。しかし私は別の問題に遭遇しました。まず、私のアプリについて説明しましょう。異なるタッチイベントごとに異なる応答

これはかなり基本的なアプリです。画面の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(); 
} 
} 

私が間違っていることを知っている人はいますか?前もって感謝します!

答えて

2

getX()getY()関数は常に最初のポインタの位置を返します。私はこれがあなたの問題を引き起こしていると思う。

エリアBの2番目の指をタッチすると、MotionEventのタイプはACTION_DOWNとなり、(意図したとおりに)サウンドが再生されます。しかし、あなたが最初にエリアAに触れ、まだそれに触れているので、そのポジションはgetX()getY()によって返されたポジションです。

特定のポインタの位置を取得するには、getX(int)getY(int)関数を使用します。あなたは2本の指で画面に触れると第二指の位置をしたい場合たとえば、あなたは

x2 = getX(1); 
y2 = getY(1); 

getX()を使用しgetX(0)getY()と同じであるgetY(0)

することができますように同じです詳細については、documentationをご覧ください。

+0

ありがとう、これはうまくいきました! – Tanner

関連する問題