清单文件添加
<service
android:name="com.rookie.shiyue20180528.model.MusicService"
android:enabled="true"
android:exported="false"
/>
style.xml
<!
<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
<!
<item name="colorPrimary">@color/colorPrimary</item>
<item name="colorPrimaryDark">@color/colorPrimaryDark</item>
<item name="colorAccent">@android:color/holo_red_light</item>
<item name="windowNoTitle">true</item>
<item name="android:windowTranslucentStatus" tools:ignore="NewApi">true</item>
</style>
<style name="netease_toolbar_title" parent="@style/TextAppearance.Widget.AppCompat.Toolbar.Title">
<item name="android:textColor">@android:color/white</item>
<item name="android:textSize">17sp</item>
</style>
<style name="netease_toolbar_subtitle" parent="@style/TextAppearance.Widget.AppCompat.Toolbar.Subtitle">
<item name="android:textColor">
<item name="android:textSize">14sp</item>
</style>
<style name="neteasa_music_time_text_sytle">
<item name="android:layout_width">wrap_content</item>
<item name="android:layout_height">wrap_content</item>
<item name="android:textColor">
<item name="android:textSize">9sp</item>
</style>
<style name="neteasa_music_time_seek_bar_sytle"
parent="Widget.AppCompat.SeekBar">
<item name="android:layout_width">match_parent</item>
<item name="android:layout_height">wrap_content</item>
<item name="android:thumb">@drawable/ic_seekbar_thumb</item>
</style>
MainActivity
public class MainActivity extends AppCompatActivity implements DiscView.IPlayInfo, View.OnClickListener {
private DiscView mDisc;
private Toolbar mToolbar;
private SeekBar mSeekBar;
private ImageView mIvPlayOrPause, mIvNext, mIvLast;
private TextView mTvMusicDuration,mTvTotalMusicDuration;
private BackgourndAnimationRelativeLayout mRootLayout;
public static final int MUSIC_MESSAGE = 0;
public static final String PARAM_MUSIC_LIST = "PARAM_MUSIC_LIST";
private Handler mMusicHandler = new Handler(){
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
mSeekBar.setProgress(mSeekBar.getProgress() + 1000);
mTvMusicDuration.setText(duration2Time(mSeekBar.getProgress()));
startUpdateSeekBarProgress();
}
};
private MusicReceiver mMusicReceiver = new MusicReceiver();
private List<MusicData> mMusicDatas = new ArrayList<>();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initMusicDatas();
initView();
initMusicReceiver();
makeStatusBarTransparent();
}
private void initMusicReceiver() {
IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction(MusicService.ACTION_STATUS_MUSIC_PLAY);
intentFilter.addAction(MusicService.ACTION_STATUS_MUSIC_PAUSE);
intentFilter.addAction(MusicService.ACTION_STATUS_MUSIC_DURATION);
intentFilter.addAction(MusicService.ACTION_STATUS_MUSIC_COMPLETE);
LocalBroadcastManager.getInstance(this).registerReceiver(mMusicReceiver,intentFilter);
}
private void initView() {
mDisc = (DiscView) findViewById(R.id.discview);
mIvNext = (ImageView) findViewById(R.id.ivNext);
mIvLast = (ImageView) findViewById(R.id.ivLast);
mIvPlayOrPause = (ImageView) findViewById(R.id.ivPlayOrPause);
mTvMusicDuration = (TextView) findViewById(R.id.tvCurrentTime);
mTvTotalMusicDuration = (TextView) findViewById(R.id.tvTotalTime);
mSeekBar = (SeekBar) findViewById(R.id.musicSeekBar);
mRootLayout = (BackgourndAnimationRelativeLayout) findViewById(R.id.rootLayout);
mToolbar = (Toolbar) findViewById(R.id.toolBar);
setSupportActionBar(mToolbar);
mDisc.setPlayInfoListener(this);
mIvLast.setOnClickListener(this);
mIvNext.setOnClickListener(this);
mIvPlayOrPause.setOnClickListener(this);
mSeekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
@Override
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
mTvMusicDuration.setText(duration2Time(progress));
}
@Override
public void onStartTrackingTouch(SeekBar seekBar) {
stopUpdateSeekBarProgree();
}
@Override
public void onStopTrackingTouch(SeekBar seekBar) {
seekTo(seekBar.getProgress());
startUpdateSeekBarProgress();
}
});
mTvMusicDuration.setText(duration2Time(0));
mTvTotalMusicDuration.setText(duration2Time(0));
mDisc.setMusicDataList(mMusicDatas);
}
private void stopUpdateSeekBarProgree() {
mMusicHandler.removeMessages(MUSIC_MESSAGE);
}
private void makeStatusBarTransparent() {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
Window window = getWindow();
window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
window.getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN |
View.SYSTEM_UI_FLAG_LAYOUT_STABLE);
window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
window.setStatusBarColor(Color.TRANSPARENT);
} else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
}
}
private void initMusicDatas() {
MusicData musicData1 = new MusicData(R.raw.music1, R.raw.ic_music1, "寻", "三亩地");
MusicData musicData2 = new MusicData(R.raw.music2, R.raw.ic_music2, "Nightingale", "YANI");
MusicData musicData3 = new MusicData(R.raw.music3, R.raw.ic_music3, "Cornfield Chase", "Hans Zimmer");
mMusicDatas.add(musicData1);
mMusicDatas.add(musicData2);
mMusicDatas.add(musicData3);
Intent intent = new Intent(this, MusicService.class);
intent.putExtra(PARAM_MUSIC_LIST, (Serializable) mMusicDatas);
startService(intent);
}
private void try2UpdateMusicPicBackground(final int musicPicRes) {
if (mRootLayout.isNeed2UpdateBackground(musicPicRes)) {
new Thread(new Runnable() {
@Override
public void run() {
final Drawable foregroundDrawable = getForegroundDrawable(musicPicRes);
runOnUiThread(new Runnable() {
@Override
public void run() {
mRootLayout.setForeground(foregroundDrawable);
mRootLayout.beginAnimation();
}
});
}
}).start();
}
}
private Drawable getForegroundDrawable(int musicPicRes) {
final float widthHeightSize = (float) (DisplayUtil.getScreenWidth(MainActivity.this)
* 1.0 / DisplayUtil.getScreenHeight(this) * 1.0);
Bitmap bitmap = getForegroundBitmap(musicPicRes);
int cropBitmapWidth = (int) (widthHeightSize * bitmap.getHeight());
int cropBitmapWidthX = (int) ((bitmap.getWidth() - cropBitmapWidth) / 2.0);
Bitmap cropBitmap = Bitmap.createBitmap(bitmap, cropBitmapWidthX, 0, cropBitmapWidth,
bitmap.getHeight());
Bitmap scaleBitmap = Bitmap.createScaledBitmap(cropBitmap, bitmap.getWidth() / 50, bitmap
.getHeight() / 50, false);
final Bitmap blurBitmap = FastBlurUtil.doBlur(scaleBitmap, 8, true);
final Drawable foregroundDrawable = new BitmapDrawable(blurBitmap);
foregroundDrawable.setColorFilter(Color.GRAY, PorterDuff.Mode.MULTIPLY);
return foregroundDrawable;
}
private Bitmap getForegroundBitmap(int musicPicRes) {
int screenWidth = DisplayUtil.getScreenWidth(this);
int screenHeight = DisplayUtil.getScreenHeight(this);
BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = true;
BitmapFactory.decodeResource(getResources(), musicPicRes, options);
int imageWidth = options.outWidth;
int imageHeight = options.outHeight;
if (imageWidth < screenWidth && imageHeight < screenHeight) {
return BitmapFactory.decodeResource(getResources(), musicPicRes);
}
int sample = 2;
int sampleX = imageWidth / DisplayUtil.getScreenWidth(this);
int sampleY = imageHeight / DisplayUtil.getScreenHeight(this);
if (sampleX > sampleY && sampleY > 1) {
sample = sampleX;
} else if (sampleY > sampleX && sampleX > 1) {
sample = sampleY;
}
options.inJustDecodeBounds = false;
options.inSampleSize = sample;
options.inPreferredConfig = Bitmap.Config.RGB_565;
return BitmapFactory.decodeResource(getResources(), musicPicRes, options);
}
@Override
public void onMusicInfoChanged(String musicName, String musicAuthor) {
getSupportActionBar().setTitle(musicName);
getSupportActionBar().setSubtitle(musicAuthor);
}
@Override
public void onMusicPicChanged(int musicPicRes) {
try2UpdateMusicPicBackground(musicPicRes);
}
@Override
public void onMusicChanged(DiscView.MusicChangedStatus musicChangedStatus) {
switch (musicChangedStatus) {
case PLAY:{
play();
break;
}
case PAUSE:{
pause();
break;
}
case NEXT:{
next();
break;
}
case LAST:{
last();
break;
}
case STOP:{
stop();
break;
}
}
}
@Override
public void onClick(View v) {
if (v == mIvPlayOrPause) {
mDisc.playOrPause();
} else if (v == mIvNext) {
mDisc.next();
} else if (v == mIvLast) {
mDisc.last();
}
}
private void play() {
optMusic(MusicService.ACTION_OPT_MUSIC_PLAY);
startUpdateSeekBarProgress();
}
private void pause() {
optMusic(MusicService.ACTION_OPT_MUSIC_PAUSE);
stopUpdateSeekBarProgree();
}
private void stop() {
stopUpdateSeekBarProgree();
mIvPlayOrPause.setImageResource(R.drawable.ic_play);
mTvMusicDuration.setText(duration2Time(0));
mTvTotalMusicDuration.setText(duration2Time(0));
mSeekBar.setProgress(0);
}
private void next() {
mRootLayout.postDelayed(new Runnable() {
@Override
public void run() {
optMusic(MusicService.ACTION_OPT_MUSIC_NEXT);
}
},1000);
stopUpdateSeekBarProgree();
mTvMusicDuration.setText(duration2Time(0));
mTvTotalMusicDuration.setText(duration2Time(0));
}
private void last() {
mRootLayout.postDelayed(new Runnable() {
@Override
public void run() {
optMusic(Mus