OPENGL

安卓中的音频文件会占用比较多的资源,MediaPlayer(媒体播放器)有时候会出现音效延迟,所以使用SoundPool会比较好,但是音频的长度最好不要超过7秒。

SoundPool

SoundPool的构造方法
参数:
int maxStreams:设置最多能同时播放几个音频
int streamType:设置音频类型
int srcQuality:音频质量,默认设置0就可以
public SoundPool(int maxStreams, int streamType, int srcQuality) {
this(maxStreams, new AudioAttributes.Builder().setInternalLegacyStreamType(streamType).build());
}

方法
加载音频
参数:
int resId:资源ID
int priority:优先级,默认1就可以
public int load(Context context, int resId, int priority) {}

播放音频
int soundID:播放的音频资源ID
float leftVolume:控制左声道音量
float rightVolume:控制右声道音量
int priority:优先级,0为最低优先级
int loop:0为不循环,-1为循环
float rate:音效的回放速度,范围0.5-2.0f,1.0f为正常速度。
public final int play(int soundID, float leftVolume, float rightVolume,int priority, int loop, float rate) {}

暂停/停止音频
int streamID:音频资源ID
public native final void pause(int streamID);
int streamID:音频资源ID
public native final void stop(int streamID);

MediaPlayer

如果是背景音乐的话不用考虑延迟,使用MediaPlayer即可

生命周期的10种状态
Idle:使用new创建一个MediaPlayer对象或者调用了reset方法时,该MediaPlayer处于idle状态。

End:通过release方法可以进入End状态,只要MediaPlayer对象不再被使用,就应该尽快将其通过release方法释放掉,如果MediaPlayer对象进入了End状态,则不会再进入其他任何状态。

Initialized:MediaPlayer调用了setDataSource方法就进入了该状态,表示此时要播放的文件已经设置好了。

Prepared:初始化完成之后需要用过perpare或prepareAsync方法进行准备,这两个方法一个是同步的,一个是异步的。只有进入了Prepared状态,才表明MediaPlayer到目前为止都工作正常,可以进行音乐文件的播放。

Preparing:与prepareAsync异步准备方法配合,如果异步准备完成,会触发OnPreparedListener.onPrepared,进而进入Prepared状态

Started:通过调用start方法,进入Started状态,就是播放中状态,开发中可以使用isPlaying方法测试MediaPlayer是否处于Started状态。
如果是循环播放,那么仍然会处于Started状态。如果该状态下的MediaPlayer调用了seekTo或者start方法均可以让MediaPlayer停留在Started状态。

Paused:Started状态下调用pause方法可以暂停播放,从而进入Paused状态。MediaPlayer暂停后再次调用start方法则可以继续进行播放,并撞到Started状态。暂停状态时可以调用seekTo方法,这是不会改变状态的。

Stop:Started或Paused状态下均可以调用stop方法停止播放并进入Stop状态,而处于Stop状态的MediaPlayer要想重新播放,需要通过调用prepareAsyne或prepare方法返回到先前的Prepared状态重新开始才可以。

PlaybackCompleted:文件正常播放完毕,而又没有设置循环播放的话就进入该状态,并会触发OnCompletionListener接口中的onCompletion方法。此时可以调用start方法重新从头播放文件,也可以调用stop方法停止播放,或者调用seekTo方法来重新定位播放位置。

Error:由于某种原因出现错误,会触发OnErrorListener.onError回调方法,此时MediaPlayer即进入Error状态。如果MediaPlayer进入Error状态,可以通过调用reset方法来恢复,使得它重新返回到Idle状态。

MediaPlayer mp=new MediaPlayer();
mp.setDataSource(path);//设置音频文件路径
mp.prepare();//进入准备状态
mp.start();//开始播放
mp.stop();//停止播放,注意停止播放之后,想要继续播放,需要调用它的prepare()方法来进入状态。

AudioManager

它是用来调节音量的

获取AudioManager
AudioManager am=(AudioManager) getSystemService(AUDIO_SERVICE);
//获取最大音量
am.getStreamMaxVolume(AudioManager.STREAM_MUSIC);
//获取当前音量
am.getStreamVolume(AudioManager.STREAM_MUSIC);
//调节音量
//参数1:调节的方向
ADJUST_LOWER:为向下调节
ADJUST_RAISE:为向上调节
ADJUST_SAME:保持不变
//参数2:标记位,一般为0
public void adjustVolume(int direction, int flags)

设置音量
//参数一为类型,参数二为音量,第三个参数为标记位,一般为AudioManager.FLAG_PLAY_SOUND
public void setStreamVolume(int streamType, int index, int flags)

SurfaceView

SurfaceView继承自View
一般采用继承SurfaceView进行自定义的方法来实现2D效果。SurfaceView可以在子线程中运行,不必通知主线程。
一般还要实现SurfaceHolder.Callback接口。
SurfaceHolder.Callback接口需要实现的方法

//在SurfaceView创建时被调用。初始化图片,线程等在这个方法里写。
@Override
public void surfaceCreated(SurfaceHolder holder) {
}
//该方法在SurfaceView变化时被调用(如横竖屏切换),在surfaceCreated方法被调用后,
//该方法至少会被调用一次。当SurfaceView变化时,如果需要改变一些值,在这个方法写
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width,
int height) {
}
//在销毁时被调用,释放资源
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
}

穿插一个Socket
它属于C/S模式

//服务端
public class MyService{
static ServerSocket sSocket;
public static void main(String[] args){
sSocket=new ServerSocket(8800);//创建ServerSocket对象
while(true){//不停的循环服务器
Socket socket=sSocket.accept();//创建 Socket对象
DataInputStream dis=new DataInputStream(socket.getInputStream());//
DataOutputStream dos=new DataInputStream(socket.getOutputStream());
String s=dis.readUTF();//接收到客户端发来的信息
dos.writeUTF(“成功连接服务器”);//写入到输出流中,返回给客户端
dis.close();//关闭相关的流
dos.close();
socket.close();
}
}
}

//客户端
public class ClientActivity extends Activity{
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main_layout);
Button btn=(Button)findViewById(R.id.btn);
btn.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
connectService();//调用自定义方法
}
});
public void connectService(){
String ip=”192.168.1.1”;//声明服务器端IP
Socket socket=new Socket(ip,8800);//创建套接字,发出连接请求
DataInputStream dis=new DataInputStream(socket.getInputStream());
DataOutStream dos=new DataInputStream(socket.getOutputStream());
dos.writeUTF(“请求连接服务器”);//用输出流给服务器发送一条字符串。
String s=dis.readUTF();//获取从输入流中获取服务器返回的字符串。
dis.close();//关闭相关的流
dos.close();
socket.close();
}
}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值