实例介绍
【实例简介】
【实例截图】







【核心代码】
package org.app.qqmusicplayer;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileDescriptor;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;
import java.util.Iterator;
import java.util.TreeMap;
import org.app.qqmusic.tool.LRCbean;
import android.app.Activity;
import android.content.BroadcastReceiver;
import android.content.ContentResolver;
import android.content.ContentUris;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.database.Cursor;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.media.AudioManager;
import android.net.Uri;
import android.os.Bundle;
import android.os.ParcelFileDescriptor;
import android.provider.MediaStore;
import android.view.KeyEvent;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.animation.Animation;
import android.view.animation.AnimationUtils;
import android.widget.ImageButton;
import android.widget.ImageView;
import android.widget.RelativeLayout;
import android.widget.SeekBar;
import android.widget.SeekBar.OnSeekBarChangeListener;
import android.widget.SlidingDrawer;
import android.widget.SlidingDrawer.OnDrawerCloseListener;
import android.widget.SlidingDrawer.OnDrawerOpenListener;
import android.widget.TextView;
import android.widget.Toast;
/**
* 这里是播放界面模块。原先的播放等于没用服务而已,这次把后台狠狠强化下,不但能后台播放,而且采取随机播放的功能
* 这边对一些资源以及状态的操作保存在OnStart下进行。显示歌名歌手,调用loadclip 方法 歌词调用readlrc,路径根据手机SD卡不同而不同。所以运行之前修改下你真机实际路径
* 很明显,所有显示的有关的东西都是调用OnStart方法
*/
public class PlayMusicActivity extends Activity {
private int[] _ids;// 临时音乐id
private String[] _artists;// 艺术家
private String[] _titles;// 标题
private TextView musicnames;// 音乐名
private TextView artisting;// 艺术家
private ImageButton play_btn;// 播放按钮
private ImageButton last_btn;// 上一首
private ImageButton next_btn;// 下一首
private TextView playtimes = null;// 已播放时间
private TextView durationTime = null;// 歌曲时间
private SeekBar seekbar;// 进度条
private int position;// 定义一个位置,用于定位用户点击列表曲首
private int currentPosition;// 当前播放位置
private int duration;// 总时间
private TextView lrcTextview;// 歌词
private ImageView album;// 专辑
private SlidingDrawer slidingdrawer;
private ImageButton LoopBtn = null;// 循环
private ImageButton RandomBtm = null;// 随机
private ImageView ly_handle;//手动
private static final String MUSIC_CURRENT = "com.app.currentTime";// Action的状态
private static final String MUSIC_DURATION = "com.app.duration";
private static final String MUSIC_NEXT = "com.app.next";
private static final String MUSIC_UPDATE = "com.app.update";
private static final int PLAY = 1;// 定义播放状态
private static final int PAUSE = 2;// 暂停状态
private static final int STOP = 3;// 停止
private static final int PROGRESS_CHANGE = 4;// 进度条改变
private static final int STATE_PLAY = 1;// 播放状态设为1
private static final int STATE_PAUSE = 2;// 播放状态设为2
public static final int LOOP_NONE = 0;//不循环
public static final int LOOP_ONE = 1;//单体循环
public static final int LOOP_ALL = 2;//全部循环
public static int loop_flag = LOOP_NONE;
public static boolean random_flag = false;
public static int[] randomIDs = null;
public static int randomNum = 0;
private int flag;// 标记
private Cursor cursor;// 游标
private TreeMap<Integer, LRCbean> lrc_map = new TreeMap<Integer, LRCbean>();// Treemap对象
private AudioManager am;
private int maxVolume;// 最大音量
private int currentVolume;// 当前音量
public Context context;//上下文
private RelativeLayout play_control;//控制台
private RelativeLayout play_seekbar;//进度条
float start;
float end;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.play_music);
Intent intent = this.getIntent();//接收来自列表的数据
Bundle bundle = intent.getExtras();
_ids = bundle.getIntArray("_ids");
randomIDs = new int[_ids.length];
position = bundle.getInt("position");
_titles = bundle.getStringArray("_titles");
_artists = bundle.getStringArray("_artists");
// 以下是找各个控件ID。大家熟悉的,故不解释
musicnames = (TextView) findViewById(R.id.play_music_name);
artisting = (TextView) findViewById(R.id.playback_artist_name);
play_btn = (ImageButton) findViewById(R.id.pausebtn);
last_btn = (ImageButton) findViewById(R.id.prevbtn);
next_btn = (ImageButton) findViewById(R.id.nextbtn);
playtimes = (TextView) findViewById(R.id.playtime);
durationTime = (TextView) findViewById(R.id.duration);
seekbar = (SeekBar) findViewById(R.id.play_seekbar);
lrcTextview = (TextView) findViewById(R.id.lrc);
album = (ImageView) findViewById(R.id.playback_album_art);
am = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
maxVolume = am.getStreamMaxVolume(AudioManager.STREAM_MUSIC);
currentVolume = am.getStreamVolume(AudioManager.STREAM_MUSIC);
context=this;
slidingdrawer = (SlidingDrawer) findViewById(R.id.playback_drawer);
ly_handle=(ImageView) findViewById(R.id.drawer_handle);
play_control=(RelativeLayout) findViewById(R.id.bottom);
play_seekbar=(RelativeLayout) findViewById(R.id.player_progress_bar);
// 下面写几个按钮方法。首先找ID之后加监听后,在监听写方法
ShowPlayBtn();
ShowLastBtn();
ShowNextBtn();
ShowSeekBar();
ShowLoop();
ShowRandom();
ShowSliderDrawers();
}
/** 显示随机*/
private void ShowRandom() {
RandomBtm = (ImageButton) findViewById(R.id.playback_mode);
RandomBtm.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (random_flag == false) {
for (int i = 0; i < _ids.length; i ) {
randomIDs[i] = -1;
}
random_flag = true;
RandomBtm.setBackgroundResource(R.drawable.random_select);
Toast.makeText(PlayMusicActivity.this, "你选择的是随机播放", Toast.LENGTH_SHORT).show();
} else {
random_flag = false;
RandomBtm.setBackgroundResource(R.drawable.random);
}
}
});
}
/** 显示按顺序或者单曲重复播放*/
private void ShowLoop() {
LoopBtn = (ImageButton) findViewById(R.id.playback_mode);
LoopBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
switch (loop_flag) {
case LOOP_NONE:
loop_flag = LOOP_ONE;
LoopBtn.setBackgroundResource(R.drawable.loop_one);
Toast.makeText(PlayMusicActivity.this, "你选择的是单曲重复", Toast.LENGTH_SHORT).show();
break;
case LOOP_ONE:
loop_flag = LOOP_ALL;
LoopBtn.setBackgroundResource(R.drawable.loop_all);
Toast.makeText(PlayMusicActivity.this, "你选择的是全部循环", Toast.LENGTH_SHORT).show();
break;
case LOOP_ALL:
loop_flag = LOOP_NONE;
LoopBtn.setBackgroundResource(R.drawable.loop_none);
Toast.makeText(PlayMusicActivity.this, "你选择的是单曲循环", Toast.LENGTH_SHORT).show();
break;
}
}
});
}
/** 播放按钮*/
private void ShowPlayBtn() {
play_btn.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
switch (flag) {
case STATE_PLAY:
pause();
break;
case STATE_PAUSE:
play();
break;
}
}
});
}
/** 显示进度条*/
private void ShowSeekBar() {
seekbar.setOnSeekBarChangeListener(new OnSeekBarChangeListener() {
@Override
public void onStopTrackingTouch(SeekBar seekBar) {
}
@Override
public void onStartTrackingTouch(SeekBar seekBar) {
}
@Override
public void onProgressChanged(SeekBar seekBar, int progress,
boolean fromUser) {
if (fromUser) {
seekbar_change(progress);
}
}
});
}
/** 显示下一首*/
public void ShowNextBtn() {
next_btn.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
nextOne();
}
});
}
/** 显示上一首*/
public void ShowLastBtn() {
last_btn.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
lastOne();
}
});
}
/** 播放音乐*/
public void play() {
flag = PLAY;
play_btn.setImageResource(R.drawable.pause_button);
Intent intent = new Intent();
intent.setAction("com.app.media.MUSIC_SERVICE");
intent.putExtra("op", PLAY);// 向服务传递数据
startService(intent);
}
/** 暂停播放音乐*/
public void pause() {
flag = PAUSE;
play_btn.setImageResource(R.drawable.play_button);
Intent intent = new Intent();
intent.setAction("com.app.media.MUSIC_SERVICE");
intent.putExtra("op", PAUSE);
startService(intent);
}
/*** 进度条改变*/
private void seekbar_change(int progress) {
Intent intent = new Intent();
intent.setAction("com.app.media.MUSIC_SERVICE");
intent.putExtra("op", PROGRESS_CHANGE);
intent.putExtra("progress", progress);
startService(intent);
}
/** 下一首*/
public void nextOne() {
if (_ids.length == 1 || loop_flag == LOOP_ONE) {
position = position;
Intent intent = new Intent();
intent.setAction("com.app.media.MUSIC_SERVICE");
intent.putExtra("length", 1);
startService(intent);
play();
return;
}
if (random_flag == true) {
if (randomNum < _ids.length - 1) {
randomIDs[randomNum] = position;
position = findRandomSound(_ids.length);
randomNum ;
} else {
randomNum = 0;
for (int i = 0; i < _ids.length; i ) {
randomIDs[i] = -1;
}
randomIDs[randomNum] = position;
position = findRandomSound(_ids.length);
randomNum ;
}
} else {
if (position == _ids.length - 1) {
position = 0;
} else if (position < _ids.length - 1) {
position ;
}
}
stop();
setup();
play();
}
/**
* 上一首
*/
public void lastOne() {
if (_ids.length == 1 || loop_flag == LOOP_ONE) {
position = position;
Intent intent = new Intent();
intent.setAction("com.app.media.MUSIC_SERVICE");
intent.putExtra("length", 1);
startService(intent);
play();
return;
}
if (random_flag == true) {
if (randomNum < _ids.length - 1) {
randomIDs[randomNum] = position;
position = findRandomSound(_ids.length);
randomNum ;
} else {
randomNum = 0;
for (int i = 0; i < _ids.length; i ) {
randomIDs[i] = -1;
}
randomIDs[randomNum] = position;
position = findRandomSound(_ids.length);
randomNum ;
}
} else {
if (position == 0) {
position = _ids.length - 1;
} else if (position > 0) {
position--;
}
}
stop();
setup();
play();
}
/**找到随机位置**/
public static int findRandomSound(int end) {
int ret = -1;
ret = (int) (Math.random() * end);
while (havePlayed(ret, end)) {
ret = (int) (Math.random() * end);
}
return ret;
}
/**是否在播放**/
public static boolean havePlayed(int position, int num) {
boolean ret = false;
for (int i = 0; i < num; i ) {
if (position == randomIDs[i]) {
ret = true;
break;
}
}
return ret;
}
/**
* 停止播放音乐
*/
private void stop() {
Intent isplay = new Intent("notifi.update");
sendBroadcast(isplay);// 发起后台支持
unregisterReceiver(musicReceiver);
Intent intent = new Intent();
intent.setAction("com.app.media.MUSIC_SERVICE");
intent.putExtra("op", STOP);
startService(intent);
}
@Override
protected void onStart() {
super.onStart();
setup();
play();
}
/**
* 当界面不可见时候,反注册的广播
*/
@Override
protected void onStop() {
super.onStop();
unregisterReceiver(musicReceiver);
}
/**
* 按下返回键事件
*/
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_BACK) {
Intent intent = new Intent(PlayMusicActivity.this,
TabHostMainActivity.class);
startActivity(intent);
finish();
}
return true;
}
/**
* 初始化
*/
private void setup() {
loadclip();
init();
ReadSDLrc();
}
/**
* 读歌词方法
*/
private void ReadSDLrc() {
/**我们现在的歌词就是要String数组的第4个参数-显示文件名字**/
cursor = getContentResolver().query(
MediaStore.Audio.Media.EXTERNAL_CONTENT_URI,
new String[] { MediaStore.Audio.Media.TITLE,
MediaStore.Audio.Media.DURATION,
MediaStore.Audio.Media.ARTIST,
MediaStore.Audio.Media.ALBUM,
MediaStore.Audio.Media.DISPLAY_NAME,
MediaStore.Audio.Media.ALBUM_ID }, "_id=?",
new String[] { _ids[position] "" }, null);
cursor.moveToFirst();// 将游标移至第一位
Bitmap bm = getArtwork(this, _ids[position], cursor.getInt(5), true);
/**切换播放时候专辑图片出现透明效果**/
Animation albumanim=AnimationUtils.loadAnimation(context, R.anim.album_replace);
/**开始播放动画效果**/
album.startAnimation(albumanim);
album.setImageBitmap(bm);
/**游标定位到DISPLAY_NAME**/
String name = cursor.getString(4);
/**sd卡的音乐名字截取字符窜并找到它的位置,这步重要,没有写一直表示歌词文件无法显示,顺便说声不同手机型号SD卡有不同的路径。**/
read("/sdcard/music/" name.substring(0, name.indexOf(".")) ".lrc");
/** 在调试时我先把音乐名字写死,运行时候在控制台打印出音乐名字,那么由此判断歌名没问题.只是没有获取位置**/
System.out.println(cursor.getString(4));
}
/**
* 读取歌词的方法,采用IO方法一行一行的显示
*/
private void read(String path) {
lrc_map.clear();
TreeMap<Integer, LRCbean> lrc_read = new TreeMap<Integer, LRCbean>();
String data = "";
BufferedReader br = null;
File file = new File(path);
System.out.println(path);
/**如果没有歌词,则用没有歌词显示**/
if (!file.exists()) {
Animation lrcanim=AnimationUtils.loadAnimation(context, R.anim.album_replace);
lrcTextview.setText(R.string.lrc_messenge);
lrcTextview.startAnimation(lrcanim);
return;
}
FileInputStream stream = null;
try {
stream = new FileInputStream(file);
br = new BufferedReader(new InputStreamReader(stream, "UTF-8"));
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
try {
while ((data = br.readLine()) != null) {
if (data.length() > 6) {
if (data.charAt(3) == ':' && data.charAt(6) == '.') {// 从歌词正文开始
data = data.replace("[", "");
data = data.replace("]", "@");
data = data.replace(".", ":");
String lrc[] = data.split("@");
String lrcContent = null;
if (lrc.length == 2) {
lrcContent = lrc[lrc.length - 1];// 歌词
} else {
lrcContent = "";
}
for (int i = 0; i < lrc.length - 1; i ) {
String lrcTime[] = lrc[0].split(":");
int m = Integer.parseInt(lrcTime[0]);// 分
int s = Integer.parseInt(lrcTime[1]);// 秒
int ms = Integer.parseInt(lrcTime[2]);// 毫秒
int begintime = (m * 60 s) * 1000 ms;// 转换成毫秒
LRCbean lrcbean = new LRCbean();
lrcbean.setBeginTime(begintime);// 设置歌词开始时间
lrcbean.setLrcBody(lrcContent);// 设置歌词的主体
lrc_read.put(begintime, lrcbean);
}
}
}
}
stream.close();
} catch (IOException e) {
e.printStackTrace();
}
// 计算每句歌词需要的时间
lrc_map.clear();
data = "";
Iterator<Integer> iterator = lrc_read.keySet().iterator();
LRCbean oldval = null;
int i = 0;
while (iterator.hasNext()) {
Object ob = iterator.next();
LRCbean val = lrc_read.get(ob);
if (oldval == null) {
oldval = val;
} else {
LRCbean item1 = new LRCbean();
item1 = oldval;
item1.setLineTime(val.getBeginTime() - oldval.getBeginTime());
lrc_map.put(new Integer(i), item1);
i ;
oldval = val;
}
}
}
/**
* 初始化服务
*/
private void init() {
IntentFilter filter = new IntentFilter();
filter.addAction(MUSIC_CURRENT);
filter.addAction(MUSIC_DURATION);
filter.addAction(MUSIC_NEXT);
filter.addAction(MUSIC_UPDATE);
filter.addAction("notifi.update");
registerReceiver(musicReceiver, filter);
}
/**
* 获取歌名,歌手的字符串
*/
private void loadclip() {
seekbar.setProgress(0);
/**设置歌曲名**/
if (_titles[position].length() > 15)
musicnames.setText(_titles[position].substring(0, 12) "...");// 设置歌曲名
else
musicnames.setText(_titles[position]);
/**设置艺术家名**/
if (_artists[position].equals("<unknown>"))
artisting.setText("未知艺术家");
else
artisting.setText(_artists[position]);
Intent intent = new Intent();
intent.putExtra("_ids", _ids);
intent.putExtra("_titles", _titles);
intent.putExtra("_artists", _artists);
intent.putExtra("position", position);
intent.setAction("com.app.media.MUSIC_SERVICE");// 给将这个action发送服务
startService(intent);
}
/**在后台MusicService里使用handler消息机制,不停的向前台发送广播,广播里面的数据是当前mp播放的时间点,
* 前台接收到广播后获得播放时间点来更新进度条,暂且先这样。但是一些人说虽然这样能实现。但是还是觉得开个子线程不错**/
protected BroadcastReceiver musicReceiver = new BroadcastReceiver() {
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
if (action.equals(MUSIC_CURRENT)) {
currentPosition = intent.getExtras().getInt("currentTime");// 获得当前播放位置
playtimes.setText(toTime(currentPosition));
seekbar.setProgress(currentPosition);// 设置进度条
Iterator<Integer> iterator = lrc_map.keySet().iterator();
while (iterator.hasNext()) {
Object o = iterator.next();
LRCbean val = lrc_map.get(o);
if (val != null) {
if (currentPosition > val.getBeginTime()
&& currentPosition < val.getBeginTime()
val.getLineTime()) {
lrcTextview.setText(val.getLrcBody());
break;
}
}
}
} else if (action.equals(MUSIC_DURATION)) {
duration = intent.getExtras().getInt("duration");
seekbar.setMax(duration);
durationTime.setText(toTime(duration));
} else if (action.equals(MUSIC_NEXT)) {
nextOne();
} else if (action.equals(MUSIC_UPDATE)) {
position = intent.getExtras().getInt("position");
setup();
}
}
};
/**
* 播放时间转换
*/
public String toTime(int time) {
time /= 1000;
int minute = time / 60;
int second = time % 60;
minute %= 60;
return String.format("%02d:%02d", minute, second);
}
/**
* 回调音量大小函数
*/
@Override
public boolean dispatchKeyEvent(KeyEvent event) {
int action = event.getAction();
int keyCode = event.getKeyCode();
switch (keyCode) {
case KeyEvent.KEYCODE_VOLUME_UP:
if (action == KeyEvent.ACTION_UP) {
if (currentVolume < maxVolume) {
currentVolume = currentVolume 1;
am.setStreamVolume(AudioManager.STREAM_MUSIC,
currentVolume, 0);
} else {
am.setStreamVolume(AudioManager.STREAM_MUSIC,
currentVolume, 0);
}
}
return false;
case KeyEvent.KEYCODE_VOLUME_DOWN:
if (action == KeyEvent.ACTION_UP) {
if (currentVolume > 0) {
currentVolume = currentVolume - 1;
am.setStreamVolume(AudioManager.STREAM_MUSIC,
currentVolume, 0);
} else {
am.setStreamVolume(AudioManager.STREAM_MUSIC,
currentVolume, 0);
}
}
return false;
default:
return super.dispatchKeyEvent(event);
}
}
/**
* 以下是歌曲放的时候显示专辑图片。和列表不同,播放时图片要大。所以cam那个方法写合适的图片吧
*/
public static Bitmap getArtwork(Context context, long song_id,
long album_id, boolean allowdefault) {
if (album_id < 0) {
if (song_id >= 0) {
Bitmap bm = getArtworkFromFile(context, song_id, -1);
if (bm != null) {
return bm;
}
}
if (allowdefault) {
return getDefaultArtwork(context);
}
return null;
}
ContentResolver res = context.getContentResolver();
Uri uri = ContentUris.withAppendedId(sArtworkUri, album_id);
if (uri != null) {
InputStream in = null;
try {
in = res.openInputStream(uri);
BitmapFactory.Options options = new BitmapFactory.Options();
/**先指定原始大小**/
options.inSampleSize = 1;
/** 只进行大小判断**/
options.inJustDecodeBounds = true;
/**调用此方法得到options得到图片的大小**/
BitmapFactory.decodeStream(in, null, options);
/**我们的目标是在你N pixel的画面上显示。 所以需要调用computeSampleSize得到图片缩放的比例**/
options.inSampleSize = computeSampleSize(options, 100);
/**我们得到了缩放的比例,现在开始正式读入BitMap数据**/
options.inJustDecodeBounds = false;
options.inDither = false;
options.inPreferredConfig = Bitmap.Config.ARGB_8888;
in = res.openInputStream(uri);
return BitmapFactory.decodeStream(in, null, options);
} catch (FileNotFoundException ex) {
Bitmap bm = getArtworkFromFile(context, song_id, album_id);
if (bm != null) {
if (bm.getConfig() == null) {
bm = bm.copy(Bitmap.Config.RGB_565, false);
if (bm == null && allowdefault) {
return getDefaultArtwork(context);
}
}
} else if (allowdefault) {
bm = getDefaultArtwork(context);
}
return bm;
} finally {
try {
if (in != null) {
in.close();
}
} catch (IOException ex) {
}
}
}
return null;
}
private static Bitmap getArtworkFromFile(Context context, long songid,
long albumid) {
Bitmap bm = null;
if (albumid < 0 && songid < 0) {
throw new IllegalArgumentException(
"Must specify an album or a song id");
}
try {
BitmapFactory.Options options = new BitmapFactory.Options();
FileDescriptor fd = null;
if (albumid < 0) {
Uri uri = Uri.parse("content://media/external/audio/media/"
songid "/albumart");
ParcelFileDescriptor pfd = context.getContentResolver()
.openFileDescriptor(uri, "r");
if (pfd != null) {
fd = pfd.getFileDescriptor();
}
} else {
Uri uri = ContentUris.withAppendedId(sArtworkUri, albumid);
ParcelFileDescriptor pfd = context.getContentResolver()
.openFileDescriptor(uri, "r");
if (pfd != null) {
fd = pfd.getFileDescriptor();
}
}
options.inSampleSize = 1;
// 只进行大小判断
options.inJustDecodeBounds = true;
// 调用此方法得到options得到图片的大小
BitmapFactory.decodeFileDescriptor(fd, null, options);
// 我们的目标是在800pixel的画面上显示。
// 所以需要调用computeSampleSize得到图片缩放的比例
options.inSampleSize = 100;
// OK,我们得到了缩放的比例,现在开始正式读入BitMap数据
options.inJustDecodeBounds = false;
options.inDither = false;
options.inPreferredConfig = Bitmap.Config.ARGB_8888;
// 根据options参数,减少所需要的内存
bm = BitmapFactory.decodeFileDescriptor(fd, null, options);
} catch (FileNotFoundException ex) {
}
return bm;
}
/**这个函数会对图片的大小进行判断,并得到合适的缩放比例,比如2即1/2,3即1/3**/
static int computeSampleSize(BitmapFactory.Options options, int target) {
int w = options.outWidth;
int h = options.outHeight;
int candidateW = w / target;
int candidateH = h / target;
int candidate = Math.max(candidateW, candidateH);
if (candidate == 0)
return 1;
if (candidate > 1) {
if ((w > target) && (w / candidate) < target)
candidate -= 1;
}
if (candidate > 1) {
if ((h > target) && (h / candidate) < target)
candidate -= 1;
}
return candidate;
}
private static Bitmap getDefaultArtwork(Context context) {
BitmapFactory.Options opts = new BitmapFactory.Options();
opts.inPreferredConfig = Bitmap.Config.RGB_565;
return BitmapFactory.decodeStream(context.getResources()
.openRawResource(R.drawable.default_album), null, opts);
}
private static final Uri sArtworkUri = Uri
.parse("content://media/external/audio/albumart");
/**简单的抽屉效果**/
private void ShowSliderDrawers() {
slidingdrawer.setOnDrawerOpenListener(new OnDrawerOpenListener() {
@Override
public void onDrawerOpened() {
/**当抽屉打开时候显示y轴动画同时把控制播放隐藏起来。其目的是更好的看到歌词吧*/
play_control.setVisibility(View.GONE);
/**隐藏进度条**/
play_seekbar.setVisibility(View.GONE);
/**下展开**/
ly_handle.setImageResource(R.drawable.lyr_handle_expand_default);
/**隐藏专辑图片**/
album.setVisibility(View.GONE);
}
});
slidingdrawer.setOnDrawerCloseListener(new OnDrawerCloseListener() {
@Override
public void onDrawerClosed() {
/**关闭抽屉时候把播放控制按钮还原**/
play_control.setVisibility(View.VISIBLE);
/**还原进度条**/
play_seekbar.setVisibility(View.VISIBLE);
/**还原默认的**/
ly_handle.setImageResource(R.drawable.lyr_handle_collapse_default);
/**关闭抽屉效果专辑图片显示**/
album.setVisibility(View.VISIBLE);
}
});
}
}
好例子网口号:伸出你的我的手 — 分享!
小贴士
感谢您为本站写下的评论,您的评论对其它用户来说具有重要的参考价值,所以请认真填写。
- 类似“顶”、“沙发”之类没有营养的文字,对勤劳贡献的楼主来说是令人沮丧的反馈信息。
- 相信您也不想看到一排文字/表情墙,所以请不要反馈意义不大的重复字符,也请尽量不要纯表情的回复。
- 提问之前请再仔细看一遍楼主的说明,或许是您遗漏了。
- 请勿到处挖坑绊人、招贴广告。既占空间让人厌烦,又没人会搭理,于人于己都无利。
关于好例子网
本站旨在为广大IT学习爱好者提供一个非营利性互相学习交流分享平台。本站所有资源都可以被免费获取学习研究。本站资源来自网友分享,对搜索内容的合法性不具有预见性、识别性、控制性,仅供学习研究,请务必在下载后24小时内给予删除,不得用于其他任何用途,否则后果自负。基于互联网的特殊性,平台无法对用户传输的作品、信息、内容的权属或合法性、安全性、合规性、真实性、科学性、完整权、有效性等进行实质审查;无论平台是否已进行审查,用户均应自行承担因其传输的作品、信息、内容而可能或已经产生的侵权或权属纠纷等法律责任。本站所有资源不代表本站的观点或立场,基于网友分享,根据中国法律《信息网络传播权保护条例》第二十二与二十三条之规定,若资源存在侵权或相关问题请联系本站客服人员,点此联系我们。关于更多版权及免责申明参见 版权及免责申明


网友评论
我要评论