-3

Я делаю простую демонстрацию, которая с пользовательским видом класса расширяет представление, которое хочет показать случайный круг со случайным цветом, который может отображаться случайным образом на холсте.Как использовать soundPool в пользовательском классе?

Я уже сделал случайную проблему и установил onTouchEvent, чтобы судить, является ли клик в круге, если щелкнул круг, тогда приложение играет короткий звук. Но на этом этапе я столкнулся с некоторыми проблемами.

I использует Soundpool, чтобы музыка играла, но так как он не может быть использован при customview (Шахта MyView.java) Так что я положил его обратно в MainActivity.java под OnCreate функции под MainActivity расширяет активность , после настройки функции выглядят нормально, но я все еще не могу использовать soundpool.play в своем customview.java.

Как это исправить? Я просто новобранец, поэтому я до сих пор не совсем понимаю, что вы можете мне помочь?

код здесь (MainActivity.java)

package com.example.luckbag2; 

import java.util.HashMap; 
import android.app.Activity; 
import android.media.AudioManager; 
import android.media.SoundPool; 
import android.os.Bundle; 

public class MainActivity extends Activity { 
private SoundPool soundPool; 
private HashMap<Integer,Integer> soundMap= new HashMap<Integer,Integer>(); 

@SuppressWarnings("deprecation") 
@Override 
protected void onCreate(Bundle savedInstanceState) 
{ 
    // TODO Auto-generated method stub 
    super.onCreate(savedInstanceState); 
    MyView v = new MyView(getApplicationContext()); 
    setContentView(v);   
    soundPool =new SoundPool(10,AudioManager. STREAM_SYSTEM,5); 
    soundMap.put(1,soundPool.load(this,R.raw.collide,0));  
} 
public SoundPool getSoundPool() { 
    return soundPool; 
} 
public void setSoundPool(SoundPool soundPool) { 
    this.soundPool = soundPool; 
} 
public HashMap<Integer,Integer> getSoundMap() { 
    return soundMap; 
} 
public void setSoundMap(HashMap<Integer,Integer> soundMap) { 
    this.soundMap = soundMap; 
} 
} 

Myview.java

package com.example.luckbag2; 

import java.util.HashMap; 
import java.util.Random; 

import android.annotation.SuppressLint; 
import android.content.Context; 
import android.graphics.Canvas; 
import android.graphics.Color; 
import android.graphics.Paint; 
import android.media.AudioManager; 
import android.media.SoundPool; 
import android.os.Bundle; 
import android.os.Handler; 
import android.os.Handler.Callback; 
import android.util.Log; 
import android.view.MotionEvent; 
import android.view.View; 


@SuppressWarnings("deprecation") 
@SuppressLint({ "DrawAllocation", "ClickableViewAccessibility" }) class MyView extends View 
{ 
private Handler mHandler; 

private int mColor; 

private float cx; 

private float cy; 

private float radius; 

private float x; 

private float y; 

private int score; 


public MyView(Context context) { 
    super(context); 
    // TODO Auto-generated constructor stub 
    mHandler = new Handler(getMainLooper()); 

    setBackgroundColor(Color.WHITE); 

    Thread mThread = new Thread(new Runnable() { 

     @Override 
     public void run() 
     { 
      // TODO Auto-generated method stub 
      MyView.this.invalidate(); 
      mHandler.postDelayed(this, 500); 
     } 
    }); 
    mThread.start(); 


} 
private Callback getMainLooper() { 
    // TODO Auto-generated method stub 
    return null; 
} 
@Override 
protected void onDraw(Canvas canvas) 
{ 

    int w = this.getWidth(); 
    int h = this.getHeight(); 
    Log.d("CustomView", "w = " + w + ", h = " + h); 

    // TODO Auto-generated method stub 
    super.onDraw(canvas); 
    update(); 
    Paint p = new Paint(); 
    p.setColor(mColor); 
    canvas.drawCircle(cx, cy, radius, p); 

} 

private void update() 
{ 
    Random random = new Random(); 
    cx =(float)(250+random.nextInt(580));   
    cy =(float)(250+random.nextInt(1057));   
    radius =(float)(100 + random.nextInt(150));  

    int r = random.nextInt(256); 
    int g= random.nextInt(256); 
    int b = random.nextInt(256); 
    mColor = Color.rgb(r, g, b);     
} 

protected void onSizeChanged(int w, int h, int oldw, int oldh) { 
    super.onSizeChanged(w, h, oldw, oldh); 
} 

public boolean onTouchEvent(MotionEvent event){ 

    x = event.getX(); 
    y = event.getY(); 

    if ((x - cx) * (x - cx) + 
      (y - cy) * (y - cy) < radius * radius) { 
      Log.d("CustomView", "circle got clicked"); 
      SoundPool.play(SoundPool.get(1), 1,1,0,0,1); 

    } 

    return false; 

} 

public int getScore() { 
    return score; 
} 
public void setScore(int score) { 
    this.score = score; 
} 

}

+1

Что проблемы получения с текущим кодом? –

+0

'SoundPool.play (SoundPool.get (1), 1,1,0,0,1)' эта строка в MyView.java получила ошибку. «get» был подчеркнут Eclipse, и он показывает, что метод get (int) не определен для типа soundPool, но я не знаю, как его определить (не вижу его в найденной статье) –

+0

см. мой ответ ... –

ответ

0

Для вызова soundPool.play из MyView класса частот контекста MainActivity класса к используя MyView конструктор:

MainActivity mActivity; 
public MyView(Context context,MainActivity mActivity) { 
    super(context); 
this.mActivity=mActivity; 

} 

С MainActivity создать MyView объект класса, как:

MyView v = new MyView(getApplicationContext(),this); 

Теперь используйте mActivity методов, обращающихся с MainActivity:

Чтобы получить SoundPool объект в MyView класса:

SoundPool soundPool= mActivity.getSoundPool(); 

Используй soundPool объект для вызова play метода:

SoundPool soundPool= mActivity.getSoundPool(); 
soundPool.play(mActivity.getSoundMap().get(1), 1,1,0,0,1) 
+0

Где я должен поместить Mainactivity, пункт mActivity? В MainActivity.java или Myview.Java? –

+0

@StevenYUAN: В 'Myview.Java' –

+0

Хорошо! Это работает, Большое спасибо за помощь новичку ~ –

Смежные вопросы