onTouch 与多点触控和 SoundPool 运动事件

Posted

技术标签:

【中文标题】onTouch 与多点触控和 SoundPool 运动事件【英文标题】:onTouch with Multitouch and SoundPool Motion Events 【发布时间】:2012-11-04 19:21:38 【问题描述】:

所以我正在为 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_
android:layout_ >

<LinearLayout
    android:layout_
    android:layout_
    android:layout_centerVertical="true"
    android:orientation="horizontal" >

    <ImageView
        android:id="@+id/imageView1"
        android:layout_
        android:layout_
        android:layout_weight="1"
        android:adjustViewBounds="true"
        android:cropToPadding="false"
        android:scaleType="fitXY"
        android:src="@drawable/button01" />

    <ImageView
        android:id="@+id/imageView2"
        android:layout_
        android:layout_
        android:layout_weight="1"
        android:scaleType="fitXY"
        android:src="@drawable/button02" />

【问题讨论】:

我真的可以在这里向正确的方向使用推动力,我尝试在 developer.android.com/reference/android/view/MotionEvent.html 上阅读运动事件,但我就是没有掌握它,有人吗? 【参考方案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());
    

【讨论】:

以上是关于onTouch 与多点触控和 SoundPool 运动事件的主要内容,如果未能解决你的问题,请参考以下文章

Cocos2d-x 怎样支持多点触摸

支持手势缩放的ImageView

touch pointer

WPF学习第十八章 多点触控输入

浏览器的统一指针事件:Pointer Event

WPF学习第十八章 多点触控输入