本文将详细介绍音频播放器UI实现的关键技术点,涵盖网络检测、封面动画、播放变量管理等内容。由于代码涉及商业机密,仅展示核心功能实现片段。
背景说明:播放器支持专辑播放功能,包含歌曲列表、播放控制、收藏等基础功能,界面设计与主流音乐应用相似。
1. 网络权限与实现
首先需要确保应用具备网络访问权限,并实时监测网络状态变化。
IntentFilter filter = new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
registerReceiver(networkReceiver, filter, Context.RECEIVER_EXPORTED);
}else {
registerReceiver(networkReceiver, filter);
}
boolean isNetWork = false;private BroadcastReceiver networkReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
if (ConnectivityManager.CONNECTIVITY_ACTION.equals(intent.getAction())) {
isNetWork = JxwApplication.isNetwork();
if(isNetWork){ //有网
if (netWorkDialog != null && netWorkDialog.isShowing()) {
netWorkDialog.dismiss();//隐藏无网弹窗
}
}else {//无网
if(netWorkDialog!=null){
netWorkDialog.show(); //显示无网弹窗
}
animatorSet.pause(); //暂停封面旋转
}
}
}
};
2. 专辑封面旋转动画
实现专辑封面的旋转效果,增强播放体验。
AnimatorSet animatorSet;
private String book_cover; //专辑封面//==========在onCreate 中===================
RequestOptions options = new RequestOptions();//图片圆角
Glide.with(ReadTextActivity.this).load(book_cover)
.placeholder(R.mipmap.img_med_player_placeholder) // 占位图资源ID
.error(R.mipmap.img_med_player_placeholder) // 错误占位图资源ID
.apply(options).into(mBinding.ivCover);animatorSet = new AnimatorSet();
ObjectAnimator rotateAnimator = ObjectAnimator.ofFloat(mBinding.ivCover, "rotation", 0f, 360f);
rotateAnimator.setInterpolator(new LinearInterpolator());
rotateAnimator.setDuration(10000);
rotateAnimator.setRepeatCount(Animation.INFINITE);
rotateAnimator.setRepeatMode(ValueAnimator.RESTART);
animatorSet.playTogether(rotateAnimator);
animatorSet.start();
animatorSet.pause();//====================播放====================
animatorSet.resume();
//====================暂停====================
animatorSet.pause();//==========在onDestroy 中===================
if (animatorSet != null) {
animatorSet.cancel();
animatorSet = null;
}
3. 播放状态变量管理
关键播放变量包括专辑信息、播放模式、播放速度等,部分设置需要持久化存储。
private String book_cover; //专辑封面
private String book_name;
private int bookId;
private boolean isCollect = false; //是否收藏
private String unit_name; //正在播放的歌曲名称
public static float speed = 1f; //预选 播放速度
public static int loop_type = 0; // 0顺序播放 1单篇循环 2随机播放
public static boolean isplay = true; //播放状态
private String jsonList; //播放的歌曲列表数据
private int pre_gb_time = 0; //定时播放的时间 0/15/30/45分钟
4. 事件通信机制
采用EventBus实现播放服务与UI的高效通信,避免回调地狱问题。
//引用
implementation 'org.greenrobot:eventbus:3