迷你播放器--第一阶段(2)
退出时自动最小化(不是关闭),增加当前播放曲目的跑马灯效果
本文章为CSDN作者原创,转载请保留出处:http://blog.csdn.net/lrs0304/article/details/38349741
查看项目源代码请前往:迷你播放器-综述
请注意,该项目为android项目,如果已经学习过这一节请阅读下一篇。
先上效果图
本节主要处理的问题
- 返回键退出时以最小化形式退出(类似于按下home键)
- 实现播放时歌曲名称以跑马灯形式滚动
1、返回键退出时以最小化形式退出
首先,我们在配置文件中声明该activity为单例模式,如下(android:screenOrientation="portrait"表示限制为竖屏,可根据实际情况去掉):
<!-- singleTask能确保Task里面只有一个实例 -->
<activity
android:name="com.liangrensheng.music_player.activity.MainActivity"
android:launchMode="singleTask"
android:screenOrientation="portrait"
android:theme="@android:style/Theme.NoTitleBar" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
</intent-filter>
</activity>
然后我们还需要重载返回键,如果要按下了返回键的话就自动最小化。那么我们的程序怎么退出好呢,囧,这个暂时以menu键退出吧,在后面的内容里我们将添加退出按钮到侧边栏
/**
* 模拟用户发出Home键,将当前activity隐藏
*/
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_BACK) {
Intent intent = new Intent(Intent.ACTION_MAIN);
/*
* intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 注意: 如果 launchMode
* 默认是以standard执行的,如果不添加 这个标记则会创建新的Activity并放
* 在与当前Activity相同的Task中我已经在ManiFest里面修改了可以不需要该标记
*/
intent.addCategory(Intent.CATEGORY_HOME);
this.startActivity(intent);
return true;
} else if (keyCode == KeyEvent.KEYCODE_MENU) {
finish();// 退出
}
return super.onKeyDown(keyCode, event);
}
2、跑马灯形式显示当前正在播放的曲目
其实,TextView本身是具有跑马灯效果的属性设置的,但是,它要求该TextView必须得获取到焦点才能滚动,坑不坑?像下列设置就会造成一会能动一会不动(焦点只有一个)
android:ellipsize="marquee"
android:focusable="true"
android:marqueeRepeatLimit="marquee_forever"
android:focusableInTouchMode="true"
怎么办呢,我们去扩展TextView,姑且命名为MarqueeTextView,重载函数public boolean isFocused() ,使得其一直为真,这下它就得乖乖跑起来了
package com.liangrensheng.music_player.view;
import android.content.Context;
import android.util.AttributeSet;
import android.widget.TextView;
public class MarqueeTextView extends TextView {
public MarqueeTextView(Context context) {
super(context);
}
// 始终返回true,即一直获取焦点
@Override
public boolean isFocused() {
return true;
}
}
然后我们得修改一下playIndex()函数,如果播放的话就以跑马灯形式滚动,暂停则停止
/**
* 播放第index首音乐
*/
private void playIndex(int index) {
if (mListViewAdapter.getCurPlayIndex() == index) {// 如果曲目相同
if (mListViewAdapter.getCurPlayState() == MusicPlayState.S_PLAYING) {
mplayer.pause();// 正在播放则暂停,否则播放
mListViewAdapter.setPlayState(index, MusicPlayState.S_PAUSE);
playState.setBackgroundResource(R.drawable.state_pause);
musicName.setEllipsize(TruncateAt.END);
} else {
mplayer.start();// 我们还要更新列表显示播放状态~
mListViewAdapter.setPlayState(index, MusicPlayState.S_PLAYING);
playState.setBackgroundResource(R.drawable.state_play);
musicName.setEllipsize(TruncateAt.MARQUEE);// 跑马灯
}
} else {// 重新缓冲曲目
try {
mplayer.reset();
MusicData data = m_MusicFileList.get(index);
mplayer.setDataSource(data.mMusicPath);
mplayer.prepare();
mplayer.start();
mListViewAdapter.setPlayState(index, MusicPlayState.S_PLAYING);
playState.setBackgroundResource(R.drawable.state_play);
musicName.setText(data.mMusicName + " --- " + data.mMusicAritst<span style="font-family: Arial, Helvetica, sans-serif;"> + " --- " </span>);
musicName.setEllipsize(TruncateAt.MARQUEE);// 跑马灯
} catch (Exception e) {
System.out.println("歌曲不存在或权限不足");
}
}
}