2014-03-12 59 views
0

我试图让它当我放下并将对象放到文本视图上时,我认为它会起作用,类似于我之前只设置了不同的激活方式。这是我设置它的方式。丢弃对象时播放声音Android

MediaPlayer mysound; 
TextView target =(TextView) findViewById(R.id.task1); 
target.setOnDragListener(dragListener); 

OnDragListener dragListener = new OnDragListener() 
{ 
    @Override 
    public boolean onDrag(View v, DragEvent event) 
    { 
      int dragEvent = event.getAction(); 
      //TextView dropText = (TextView) v; 

      switch(dragEvent) 
      { 
       case DragEvent.ACTION_DRAG_ENTERED: 

       break; 

       case DragEvent.ACTION_DRAG_EXITED: 
        break; 

       case DragEvent.ACTION_DROP: 
        mysound=MediaPlayer.create(Quiz.this, R.raw.error); 
        mysound.setOnCompletionListener(new OnCompletionListener() { 
         public void onCompletion(MediaPlayer mysound) { 
          // TODO Auto-generated method stub 
          mysound.release(); 
         } 

        }); 
        mysound.start(); 
        break; 
      } 

      return true; 
    } 
}; 

日志猫

03-12 22:49:50.799:d/MediaPlayer的(10720):启动()MURI是URL抑制 03-12 22:49:50.809:I/ViewRootImpl(10720):报告丢弃结果:真

回答

1

因为它的声音很短,只是使用声池将其加载到内存中。通过这种方式,您可以快速访问声音。

import android.app.Activity; 
import android.media.AudioManager; 
import android.media.SoundPool; 
import android.media.SoundPool.OnLoadCompleteListener; 
import android.os.Bundle; 
import android.util.Log; 
import android.view.DragEvent; 
import android.view.View; 
import android.view.View.OnDragListener; 
import android.widget.TextView; 



public class MainActivity extends Activity implements OnDragListener { 


boolean loaded=false; 
SoundPool soundPool; 
int soundID; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    // TODO Auto-generated method stub 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); // here use the file name that task1 textview is contained in 
    soundPool = new SoundPool(10, AudioManager.STREAM_MUSIC, 0); 

    soundPool.setOnLoadCompleteListener(new OnLoadCompleteListener() { 
      @Override 
      public void onLoadComplete(SoundPool soundPool, int sampleId, 
        int status) { 
       loaded = true; 
      } 
     }); 
     soundID = soundPool.load(this, R.raw.error, 1); 


     TextView target =(TextView) findViewById(R.id.task1); 
     target.setOnDragListener(this); 


     } 

@Override 
public boolean onDrag(View v, DragEvent event) { 
    int dragEvent = event.getAction(); 
    //TextView dropText = (TextView) v; 

    switch(dragEvent) 
    { 
     case DragEvent.ACTION_DRAG_ENTERED: 

     break; 

     case DragEvent.ACTION_DRAG_EXITED: 
      break; 

     case DragEvent.ACTION_DROP: 
     if (loaded) { 
       AudioManager audioManager = (AudioManager) getSystemService(AUDIO_SERVICE); 
       float actualVolume = (float) audioManager 
         .getStreamVolume(AudioManager.STREAM_MUSIC); 
       float maxVolume = (float) audioManager 
         .getStreamMaxVolume(AudioManager.STREAM_MUSIC); 
       float volume = actualVolume/maxVolume; 

     soundPool.play(soundID, volume, volume, 1, 0, 1f); 
     Log.e("Test", "Played sound"); 
    } 
      break; 
    } 

    return true; 

}}

+0

我在哪里可以初始化声音池? –

+0

当我设置声音池时,它一直给我提供错误。我不知道为什么,但它seying有这条线上的语法错误“soundPool.setOnLoadCompleteListener(new OnLoadCompleteListener()” –

+0

我编辑了我的答案,你可以将该类复制到你的,并将setoncontentview参数更改为您的xml文件名字,我不知道你拖入textview的东西,所以我可以做的 – j2emanue