如何在自定义视图类中使用 soundPool? [关闭]

Posted

技术标签:

【中文标题】如何在自定义视图类中使用 soundPool? [关闭]【英文标题】:How to use soundPool in a custom view class? [closed] 【发布时间】:2015-02-26 05:37:55 【问题描述】:

我正在制作一个简单的演示,它使用 自定义视图类 扩展了想要显示随机颜色的随机圆圈的视图,这些圆圈可以随机出现在画布上。

我已经做了随机问题,并设置了一个onTouchEvent来判断Click是否在圆圈中,如果圆圈被点击则应用播放短声。但是在这一步,我遇到了一些问题。

我使用SoundPool来播放音乐,但是由于不能在customview下使用(我的是MyView.java)所以我把它放回了onCreate函数下的MainActivity.java在 MainActivity extends Activity 下,设置后,功能似乎还可以,但我的 customview.java 中仍然无法使用 soundpool.play。

如何解决?我只是一个菜鸟,所以我还不清楚所有这些事情,你能帮我吗?

代码在这里(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;

【问题讨论】:

当前代码有什么问题? MyView.java 中的 SoundPool.play(SoundPool.get(1), 1,1,0,0,1)this 行出错。 “get”被 Eclipse 加了下划线,它表明方法 get(int) 对于 soundPool 类型是未定义的,但我不知道如何定义它(在我找到的文章中没有看到) 【参考方案1】:

要从MyView 类调用soundPool.play,将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 的方法:

MyView 类中获取SoundPool 对象:

SoundPool soundPool= mActivity.getSoundPool();

使用soundPool对象调用play方法:

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

【讨论】:

MainActivity,mActivity段落应该放在MainActivity.java还是Myview.Java中? @StevenYUAN:在Myview.Java 好的!好用,非常感谢帮助菜鸟~

以上是关于如何在自定义视图类中使用 soundPool? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

如何让 .xib 出现在自定义类中

在自定义 View 类中使用 UIImageView 的正确方法

快速在自定义视图中显示 viewController

如何在 SoundPool 类中使用 stop() 方法?

如何在自定义对话框类中使用 getActivity.getLayoutInflater()

如何在自定义类中调用“SetDlgItemText”?