Android在线音乐播放器简介
首先做一个Dialog显示帮助界面和基本的操作,可以根据点击checkbox的状态选择下次是否在显示
基本代码是
alertDialog.setOnDismissListener(new OnDismissListener() {
public void onDismiss(DialogInterface dialog) {
mHandler.postDelayed(new Runnable() {
public void run() {
if (isShowNextTime) {
SharedPreferences pref = PreferenceManager
.getDefaultSharedPreferences(OnlinePlayActivity.this);
Editor edit = pref.edit();
edit.putBoolean("wecomepage", false);
edit.commit();
}
mTuijian_json.start();
mHandler.postDelayed(new Runnable() {
public void run() {
background.start();
}
}, 500);
}
}, 500);
}
});
在dialog关闭时的监听状态判断一下下次是否再次显示并用Sharepreference保存起来,根据这个状态决定是否showdialog();
接下来就是解析json的耗时操作线程的启动和动画的开始随之就开始欢迎的界面 ;
欢迎界面采用FrameLayout的理念在json解析完毕后自动这个布局自动隐藏用
mLayout.setVisibility(View.GONE);
以后就进入主界面
在做Gallary的时候会遇见图片的重叠问题解决这个问题刚开始感觉无从下手到底怎么弄呢
在看了系统Gallary的源代码以后发现了Gallary的属性android:spacing值不为零
当把spacing的值设为零还有把Gallary显示的位置设在中间这个问题就会迎刃而解,并且显得更加美观一点:
还有一个问题就是图片会重复加载,这样会增加系统的负担而且用户体验也不是很好为了解决这个问题我们加了一个Map作为缓冲如果已经加载过的图片就不在重新加载、下载图片采用了AsyncTask技术实现了图片的异步加载因而不会因为图片的加载而导致UI线程的阻塞
心细的童鞋会发现ListView显示的风格不大相同有的只显示文字有的显示稍微复杂点的布局我们需要复写下面的两个方法
@Override
public boolean areAllItemsEnabled() {
return false;
}
@Override
public boolean isEnabled(int position) {
//判断只显示文字布局的位置
if ("Browse Jamendo".equals(strs[position])
|| "My Library".equals(strs[position])) {
return false;
} else {
return true;
}
}
根据 ListView显示文本的不同判断加载不同的布局这样就可以达到以上的这种效果了
(仿照类似的布局做的UI)
当点击Gallary图片的时候会有解析json的耗时操作 进去会黑屏一段时间 为了提高用户体验我们可以加上一个Dialog这样用户不会太烦:这个diaolog我们可以用progressDialog完美的解决一切代码系统已经给你封装好了
当解析JSON的线程执行完毕以后dismissDialog(0);跳转到播放界面并且显示Notification;
Notification中显示的是当前播放歌曲的信息,系统的通知就不能达到我们的要求了下面介绍一下自定义通知的基本代码
mNotify = new Notification(R.drawable.no_cd, "正在播放",
System.currentTimeMillis());
Intent intent = new Intent(this, PlayActivity.class);
PendingIntent pi = PendingIntent.getActivity(this, 0, intent,
PendingIntent.FLAG_UPDATE_CURRENT);
mNotify.flags |= Notification.FLAG_ONGOING_EVENT;
mNotify.contentIntent = pi;
//加载自定义通知的布局
mNotify.contentView = new RemoteViews(getPackageName(),
R.layout.playnotify);
// 注意图片的更新一定放在这里 不能放在线程里更新否则会出现bad Arrays异常
mNotify.contentView.setImageViewBitmap(R.id.AlbumIcon, mBitmap);
//获得通知的片段
nm = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
nm.notify(R.layout.playnotify, mNotify);
这里需要指出的是mNotify.contentView=new RemoteViews(pacageName,自定义的布局)
之后获得通知管理器 然后刷新通知
还有一点就是通知里面的图片不能长时间的更新,否则会出现一个bad Array还是什么样的错误 记得不太清楚了
通知的刷新我们运用Handler和Runnerbale相结合的技术实现Notification数据的刷新
Runnable r = new Runnable() {
public void run() {
if (isStop) {
return;
}
mNotify.contentView.setTextViewText(R.id.currTime, CommentUtil
.convertTime(mPlayer.getCurrentPosition() / 1000));
mHandler.postDelayed(this, 1000);
startForeground(R.layout.playnotify, mNotify);
}
};
mHandler.postDelayed(r, 1000);
以上的两个功能分别为抽屉、背景图片的异步加载还有手势的功能;在播放界面通过抽屉实现界面的跳转,手势控制音乐的播放状态,背景图片的异步加载
下面是播放界面的截屏应该算是个比较复杂点的布局
Setting下面介绍一下设置画面的制作
该页面主要的操作就是在XML中了首先介绍一下XML的配置
首先建立一个XML resourceType设置为Preference然后起一个XML的名字这样XML就创建好了然后选择不同的选项以达到不同的效果CheckBoxPreference 显示一个多选框、EditTextPreference 显示一个编辑框、ListPreference需要注意的就是我们需要设置两个属性一个是extries 和entryvalues 一个是机器识别的值 一个是用户显示的值
如果需要有分隔的效果需要加上PreferenceCategory属性 如果两个设置的选项有关联
需要在另外一个设置选项的Dependency写上上一个Key值
下面是事例代码
<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
android:key="set"
android:title="设置" >
<CheckBoxPreference
android:defaultValue="true"
android:key="wecomepage"
android:summary="是否显示欢迎界面"
android:title="是否帮助" />
<CheckBoxPreference
android:key="WIFIONLY"
android:summary="只有在WIFI连接条件下允许下载"
android:title="wifi允许下载" />
<EditTextPreference
android:defaultValue="/mol/download/upgrade/mol.apk"
android:key="download"
android:summary="输入保存下载音乐文件的路径"
android:title="设置下载地址" />
<CheckBoxPreference
android:key="lyrics"
android:summary="是否下载歌词"
android:title="下载歌词" />
<ListPreference
android:entries="@array/skin"
android:entryValues="@array/machine"
android:key="skin"
android:summary="点击选择合适的皮肤 "
android:title="皮肤" />
<PreferenceCategory >
<EditTextPreference
android:dependency="open"
android:key="TimerClose"
android:summary="输入定时关闭的时间"
android:title="定时关闭" />
<CheckBoxPreference
android:key="open"
android:summary="是否开启定时关闭功能"
android:title="开始定时关闭" />
</PreferenceCategory>
<EditTextPreference
android:key="LeastFile"
android:summary="输入最下文件大小"
android:title="设置最小文件的大小" />
</PreferenceScreen>
代码中我们只需要继承PreferenceActivity和复写Oncreaete()方法并在方法里面把布局加载进去就行使用加载的方法是
addPreferencesFromResource(R.xml.setting);
通过Sharepreference保存数据来达到对整个app的设置
AppWidget
另外一个很重要的功能就是AppWidget的实现
先介绍一下流程
1、xml 新建XML的时候选择AppWidget选项这样会自动的在res/xml/文件夹中自动生成一个xxx.xml文件需要设置的属性有initialLayout(加载一个显示的布局)还有minWidth和minHeight这两个值分别为占手机屏幕的宽和高
然后写一个类继承AppWidgetProvider这个类然后复写其onreceive和其他几个必须的方法
@Override
public void onReceive(Context context, Intent intent) {
super.onReceive(context, intent);
AppWidgetManager appMgr = AppWidgetManager.getInstance(context);
RemoteViews views = new RemoteViews(context.getPackageName(),
R.layout.appwidgetlayout);
Intent mIntent = new Intent(context, OnlinePlayActivity.class);
PendingIntent pendingIntent = PendingIntent.getActivity(context, 0,
mIntent, PendingIntent.FLAG_UPDATE_CURRENT);
views.setOnClickPendingIntent(R.id.imageView1, pendingIntent);
appMgr.updateAppWidget(new ComponentName(context, appWidget.class),
views);
}
这样就可以实现AppWidget启动app的效果
可以复写onupdate()方法来更新AppWidget需要的数据 这样就可以实现桌面小组间对音乐简单的操作
其他功能的简单介绍
自定义menu(使用Popupwindow )、升级模块、优化用户体验跳转的时间使用对话框等给用户温馨的提示、歌曲的移动。