结合上一篇文章的背景 ,下面写播放器(用windowmanager悬浮窗写的)可以自动隐藏,界面是上一篇的掉音乐符,可用到自己的项目中哈。直接上代码
这是主Activity
package com.example.music;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.app.Activity;
import android.content.Context;
import android.telephony.PhoneStateListener;
import android.telephony.TelephonyManager;
import android.util.DisplayMetrics;
import android.view.Gravity;
import android.view.Menu;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.View.OnTouchListener;
import android.view.ViewGroup;
import android.view.Window;
import android.view.WindowManager;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.BaseAdapter;
import android.widget.FrameLayout;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.ProgressBar;
import android.widget.SeekBar;
import android.widget.TextView;
import android.widget.Toast;
public class MainActivity extends Activity {
//windowmanager里的歌曲名
private TextView titile;
//判断WindowManager是都存在
private boolean flagg;
//WindowManager布局view
private FrameLayout fl;
private View view;
private WindowManager wm;
private WindowManager.LayoutParams mLayoutParams;
private ProgressBar progressBar1;
private MusicView mMusicView;
//播放器
private MusicPlayer player;
//播放进度
private SeekBar skbProgress;
//播放时的图片暂停开始下一首上一首
private ImageView img1, img2, img3;
//播歌的当前位置
private int pos;
//定时隐藏windowmanager
private Handler handler=new Handler(){
@Override
public void handleMessage(Message msg) {
// TODO Auto-generated method stub]
if(msg.what==0){
if(fl.getVisibility()==View.VISIBLE){
fl.setVisibility(View.GONE);
}
} else if (msg.what == 1) {
progressBar1.setVisibility(View.GONE);
img2.setImageDrawable(getResources().getDrawable(R.drawable.music2));
}
}
};
//开启一个定时器 不停的更新onDraw方法
private Handler mHandler=new Handler(){
public void handleMessage(Message msg) {
mMusicView.invalidate();
this.removeMessages(0);
sendMessageDelayed(obtainMessage(0), 100);
};
};
//用来封装播放音乐的数据
private ArrayList<Map<String, Object>> mlist;
private Map<String, Object> map;
private ListView mlv;
//因为没有服务器,只能在客户端上做操作,所以设置先设置歌曲数为2
private static final int MAX_MUSIC_SUM=2;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//去掉标题头部
requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.activity_main);
//在mmlist中存两首歌
findView();
addListioner();
Myadapter myadapter=new Myadapter();
mlv.setAdapter(myadapter);
}
private void addListioner() {
// TODO Auto-generated method stub
mlv.setOnTouchListener(new OnTouchListener() {
@Override
public boolean onTouch(View arg0, MotionEvent event) {
// TODO Auto-generated method stub
if(MotionEvent.ACTION_UP==event.getAction()){
fl.setVisibility(View.VISIBLE);
getTimeGone();
}
return false;
}
});
mlv.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> arg0, View arg1, int position,
long arg3) {
// TODO Auto-generated method stub
String url=mlist.get(position).get("url").toString();
String sname=mlist.get(position).get("Sname").toString();
titile.setText(sname);
//播放的位置
pos=position;
if(flagg){
wm.updateViewLayout(view, mLayoutParams);
}else{
shows();
}
progressBar1.setVisibility(View.VISIBLE);
skbProgress.setProgress(0);
img2.setImageDrawable(getResources().getDrawable(R.drawable.music1));
//
//player.stop();
player.play(url,skbProgress,progressBar1,img2);
}
});
}
public void shows(){
//初始化WindowManager布局参数
mLayoutParams=new WindowManager.LayoutParams();
mLayoutParams.type = 2002; // 这里是关键,你也可以试试2003
mLayoutParams.format = 1;
mLayoutParams.gravity = Gravity.CENTER;
// 这里的flags也很关键 代码实际是mLayoutParams.flags |= FLAG_NOT_FOCUSABLE;
// 40的由来是mLayoutParams的默认属性(32)+ FLAG_NOT_FOCUSABLE(8)
mLayoutParams.flags = 40;
mLayoutParams.width = mLayoutParams.MATCH_PARENT;
mLayoutParams.height = mLayoutParams.WRAP_CONTENT;
wm.addView(view, mLayoutParams);
flagg=true;
//一段时间后隐藏
getTimeGone();
}
private void getTimeGone() {
// TODO Auto-generated method stub
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
handler.sendEmptyMessage(0);
}
}, 12000);
}
private void findView() {
// TODO Auto-generated method stub
mlv=(ListView) findViewById(R.id.listview);
//初始化音乐播放器
player=new MusicPlayer(MainActivity.this, handler);
view=View.inflate(MainActivity.this, R.layout.music, null);
fl=(FrameLayout) view.findViewById(R.id.fl);
//歌曲名
titile=(TextView) view.findViewById(R.id.titile);
//播放进度
skbProgress = (SeekBar) view.findViewById(R.id.seekBar1);
//加载进度
progressBar1=(ProgressBar) view.findViewById(R.id.progressBar1);
img1 = (ImageView) view.findViewById(R.id.img1);
img2 = (ImageView) view.findViewById(R.id.img2);
img3 = (ImageView) view.findViewById(R.id.img3);
img1.setOnClickListener(new ClickEvent());
img2.setOnClickListener(new ClickEvent());
img3.setOnClickListener(new ClickEvent());
skbProgress.setOnSeekBarChangeListener(new SeekBarChangeEvent());
TelephonyManager telephonyManager=(TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
telephonyManager.listen(new MyPhoneListener(), PhoneStateListener.LISTEN_CALL_STATE);
//根据context可以确定windmanager在哪个界面
wm=(WindowManager) getSystemService("window");
//加载windowmanager界面
mlist=new ArrayList<Map<String,Object>>();
mMusicView=(MusicView) findViewById(R.id.music);
// 获取当前屏幕的高和宽
DisplayMetrics dm = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(dm);
//加载图片并设置屏幕宽高
mMusicView.loadMusicImg(dm.heightPixels, dm.widthPixels);
//设置图片初始的位置
mMusicView.setMusicRandom();
//发信息
Message message=new Message();
message.what=0;
mHandler.sendMessageDelayed(message, 600);
map=new HashMap<String, Object>();
//歌曲名
map.put("Sname", "爱你一生不后悔");
//歌唱者
map.put("name", "孙志刚");
//歌曲头像
map.put("img", R.drawable.img);
//歌曲链接地址
map.put("url", "http://sc1.111ttt.com/2015/1/01/14/94141023408.mp3");
mlist.add(map);
map=new HashMap<String, Object>();
//歌曲名
map.put("Sname", "烟火");
//歌唱者
map.put("name", "陈翔");
//歌曲头像
map.put("img", R.drawable.thumbnail);
//歌曲链接地址
map.put("url", "http://ws.stream.qqmus...3EFC769E30D0B73A");
mlist.add(map);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
private class Myadapter extends BaseAdapter{
@Override
public int getCount() {
// TODO Auto-generated method stub
return mlist.size();
}
@Override
public Object getItem(int arg0) {
// TODO Auto-generated method stub
return mlist.get(arg0);
}
@Override
public long getItemId(int arg0) {
// TODO Auto-generated method stub
return arg0;
}
@Override
public View getView(int position, View converView, ViewGroup arg2) {
// TODO Auto-generated method stub
Holder holder=null;
if(converView==null){
holder=new Holder();
converView=View.inflate(MainActivity.this, R.layout.music_item, null);
holder.tv_Sname=(TextView) converView.findViewById(R.id.Sname);
holder.tv_name=(TextView) converView.findViewById(R.id.name);
holder.img=(ImageView) converView.findViewById(R.id.img);
converView.setTag(holder);
}else{
holder=(Holder) converView.getTag();
}
holder.tv_Sname.setText(mlist.get(position).get("Sname").toString());
holder.tv_name.setText(mlist.get(position).get("name").toString());
holder.img.setImageResource(((Integer)mlist.get(position).get("img")).intValue());
return converView;
}
}
private class Holder{
private TextView tv_Sname,tv_name,tv_url;
private ImageView img;
}
class ClickEvent implements OnClickListener {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
if (v == img1) {
if(flagg){
//wm.removeView(view);
wm.updateViewLayout(view, mLayoutParams);
}
//show();
progressBar1.setVisibility(View.VISIBLE);
skbProgress.setProgress(0);
img2.setImageDrawable(getResources().getDrawable(R.drawable.music1));
if(pos-1<0){
Toast.makeText(MainActivity.this, "已经是第一首歌了", 1).show();
return;
}else{
pos=pos-1;
//Toast.makeText(MainActivity.this, ""+pos, 1).show();
String yurl = (String) mlist.get(pos).get("url");
titile.setText((String)mlist.get(pos).get("Sname"));
//Toast.makeText(MainActivity.this, "ttttt", 1).show();
//player.stop();
player.play(yurl,skbProgress,progressBar1,img2);
}
} else if (v == img2) {
boolean pause=player.pause();
if(pause){
img2.setImageDrawable(getResources().getDrawable(R.drawable.music1));
}else{
img2.setImageDrawable(getResources().getDrawable(R.drawable.music2));
}
} else if (v == img3) {
if(flagg){
//wm.removeView(view);
wm.updateViewLayout(view, mLayoutParams);
}
progressBar1.setVisibility(View.VISIBLE);
skbProgress.setProgress(0);
img2.setImageDrawable(getResources().getDrawable(R.drawable.music1));
//show();
if(pos+1>mlist.size()){
Toast.makeText(MainActivity.this, "已经是第一首歌了", 1).show();
return;
}else{
pos=pos+1;
if(pos==mlist.size()){
pos=0;
}
//Toast.makeText(MainActivity.this, ""+pos, 1).show();
String yurl = (String) mlist.get(pos).get("url");
titile.setText((String)mlist.get(pos).get("Sname"));
//Toast.makeText(MainActivity.this, "ttttt", 1).show();
//player.stop();
player.play(yurl,skbProgress,progressBar1,img2);
}
}
}
}
private class SeekBarChangeEvent implements SeekBar.OnSeekBarChangeListener {
int progress;
@Override
public void onProgressChanged(SeekBar seekBar, int progress,
boolean arg2) {
// TODO Auto-generated method stub
this.progress = progress * player.mediaPlayer.getDuration()
/ seekBar.getMax();
}
@Override
public void onStartTrackingTouch(SeekBar arg0) {
// TODO Auto-generated method stub
}
@Override
public void onStopTrackingTouch(SeekBar arg0) {
// TODO Auto-generated method stub
player.mediaPlayer.seekTo(progress);
}
}
private final class MyPhoneListener extends android.telephony.PhoneStateListener{
@Override
public void onCallStateChanged(int state, String incomingNumber) {
switch (state) {
case TelephonyManager.CALL_STATE_RINGING://电话来了
player.callIsComing();
break;
case TelephonyManager.CALL_STATE_IDLE: //通话结束
player.callIsDown();
break;
}
}
}
protected void onDestroy() {
//wm.removeView(view);
if(player!=null){
player.stop();
}else{
}
player.play("",skbProgress,progressBar1,img2);
//snow.removeImg();
super.onDestroy();
}
}
网上找的别人封装好的player,经过自己一些优化,直接用上
package com.example.music;
import java.io.IOException;
import java.util.Timer;
import java.util.TimerTask;
import android.content.Context;
import android.media.AudioManager;
import android.media.MediaPlayer;
import android.media.MediaPlayer.OnBufferingUpdateListener;
import android.media.MediaPlayer.OnCompletionListener;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
import android.view.View;
import android.widget.ImageView;
import android.widget.ProgressBar;
import android.widget.SeekBar;
public class MusicPlayer implements OnBufferingUpdateListener, OnCompletionListener,
MediaPlayer.OnPreparedListener {
public MediaPlayer mediaPlayer;
private SeekBar skbProgress;
private Timer mTimer = new Timer();
private String videoUrl;
private boolean pause;
private int playPosition;
public ProgressBar progressBar1;
private Context context;
private ImageView img2;
private Handler mHandler;
public MusicPlayer( Context context, Handler handler2) {
mHandler = handler2;
this.context=context;
try {
mediaPlayer = new MediaPlayer();
mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
mediaPlayer.setOnBufferingUpdateListener(this);
mediaPlayer.setOnPreparedListener(this);
} catch (Exception e) {
Log.e("mediaPlayer", "error", e);
}
mTimer.schedule(mTimerTask, 0, 1000);
}
/*******************************************************
* 通过定时器和Handler来更新进度条
******************************************************/
TimerTask mTimerTask = new TimerTask() {
@Override
public void run() {
if (mediaPlayer == null)
return;
if (mediaPlayer.isPlaying() && skbProgress.isPressed() == false) {
handleProgress.sendEmptyMessage(0);
}
}
};
Handler handleProgress = new Handler() {
public void handleMessage(Message msg) {
int position = mediaPlayer.getCurrentPosition();
int duration = mediaPlayer.getDuration();
if (duration > 0) {
progressBar1.setVisibility(View.GONE);
img2.setImageDrawable(context.getResources().getDrawable(R.drawable.music2));
if (duration == 1) {
mHandler.sendEmptyMessage(1);
}
long pos = skbProgress.getMax() * position / duration;
skbProgress.setProgress((int) pos);
}
};
};
/**
* 来电话了
*/
public void callIsComing() {
if (mediaPlayer.isPlaying()) {
playPosition = mediaPlayer.getCurrentPosition();// 获得当前播放位置
mediaPlayer.stop();
}
}
/**
* 通话结束
*/
public void callIsDown() {
if (playPosition > 0) {
playNet(playPosition);
playPosition = 0;
}
}
/**
* 播放
*/
public void play(String videoUrl,SeekBar skbProgress,ProgressBar progressBar1,ImageView img2) {
this.progressBar1=progressBar1;
this.img2=img2;
this.videoUrl = videoUrl;
this.skbProgress = skbProgress;
playNet(0);
}
/**
* 重播
*/
public void replay() {
if (mediaPlayer.isPlaying()) {
mediaPlayer.seekTo(0);// 从开始位置开始播放音乐
} else {
playNet(0);
}
}
public boolean isPlay(){
return mediaPlayer.isPlaying();
}
/**
* 暂停
*/
public boolean pause() {
if (mediaPlayer.isPlaying()) {// 如果正在播放
mediaPlayer.pause();// 暂停
pause = true;
} else {
if (pause) {// 如果处于暂停状态
mediaPlayer.start();// 继续播放
pause = false;
}
}
return pause;
}
/**
* 停止
*/
public void stop() {
if (mediaPlayer != null && mediaPlayer.isPlaying()) {
//mediaPlayer.stop();
//mediaPlayer.release();
mediaPlayer.reset();
}
}
@Override
/**
* 通过onPrepared播放
*/
public void onPrepared(MediaPlayer arg0) {
arg0.start();
Log.e("mediaPlayer", "onPrepared");
}
@Override
public void onCompletion(MediaPlayer arg0) {
Log.e("mediaPlayer", "onCompletion");
}
@Override
public void onBufferingUpdate(MediaPlayer arg0, int bufferingProgress) {
skbProgress.setSecondaryProgress(bufferingProgress);
int currentProgress = skbProgress.getMax()
* mediaPlayer.getCurrentPosition() / mediaPlayer.getDuration();
Log.e(currentProgress + "% play", bufferingProgress + "% buffer");
}
/**
* 播放音乐
*
* @param playPosition
*/
private void playNet(final int playPosition) {
try {
// 把各项参数恢复到初始状态
/**
* 通过MediaPlayer.setDataSource()
* 的方法,将URL或文件路径以字符串的方式传入.使用setDataSource ()方法时,要注意以下三点:
* 1.构建完成的MediaPlayer 必须实现Null 对像的检查.
* 2.必须实现接收IllegalArgumentException 与IOException
* 等异常,在很多情况下,你所用的文件当下并不存在. 3.若使用URL 来播放在线媒体文件,该文件应该要能支持pragressive
* 下载.
*/
new Thread(){
public void run() {
try {
mediaPlayer.reset();
mediaPlayer.setDataSource(videoUrl);
mediaPlayer.prepare();// 进行缓冲
mediaPlayer.setOnPreparedListener(new MyPreparedListener(
playPosition));
} catch (IllegalArgumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SecurityException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalStateException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
};
}.start();
} catch (Exception e) {
e.printStackTrace();
}
}
private final class MyPreparedListener implements
android.media.MediaPlayer.OnPreparedListener {
private int playPosition;
public MyPreparedListener(int playPosition) {
this.playPosition = playPosition;
}
@Override
public void onPrepared(MediaPlayer mp) {
mediaPlayer.start();// 开始播放
if (playPosition > 0) {
mediaPlayer.seekTo(playPosition);
}
}
}
}
然后就是上一篇里的背景动态界面
package com.example.music;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
import java.util.Random;
import android.R.integer;
import android.content.Context;
import android.content.res.Resources;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Matrix;
import android.graphics.Paint;
import android.graphics.drawable.BitmapDrawable;
import android.util.AttributeSet;
import android.util.Log;
import android.view.View;
public class MusicView extends View{
//判断是否第一次执行ondraw
private boolean flag=false;
//有8个音乐符在掉
private static final int MUSIC_COUNT=8;
//音乐图片
private Bitmap mBitmap;
// 随即生成器
private static final Random random = new Random();
// 画笔
private final Paint mPaint = new Paint();
// 屏幕的高度和宽度(用于设置音乐符的位置)
private int view_height = 0;
private int view_width = 0;
//音乐符最大掉的速度
private int MAX_SPEED = 30;
//存取音乐符的坐标
private ArrayList<Map<String, Integer>> list=new ArrayList<Map<String,Integer>>();
public MusicView(Context context) {
super(context);
}
public MusicView(Context context, AttributeSet attrs) {
super(context, attrs);
// TODO Auto-generated constructor stub
}
//得到音乐符图片并设置屏幕的宽高
public void loadMusicImg(int height, int width){
Resources r = this.getContext().getResources();
mBitmap = ((BitmapDrawable) r.getDrawable(R.drawable.snow))
.getBitmap();
view_height=height;
view_width=width;
}
//设置每个music的随机位置并封装起来
public void setMusicRandom(){
Map<String, Integer> map=null;
for(int i=0;i<MUSIC_COUNT;i++){
map=new HashMap<String, Integer>();
//坐标x位置
map.put("imgX", random.nextInt(view_width-20));
//坐标y位置
map.put("imgY", 0);
//坐标y下落的位置
int speed=random.nextInt(MAX_SPEED);
while(speed<8){
speed=random.nextInt(MAX_SPEED);
}
map.put("speed", speed);
list.add(map);
}
}
@Override
protected void onDraw(Canvas canvas) {
// TODO Auto-generated method stub
super.onDraw(canvas);
if(flag){
Map<String, Integer> map=null;
for(int i=0;i<MUSIC_COUNT;i++){
if(list!=null){
Bitmap resizeBmp=null;
int imgX=list.get(i).get("imgX");
int imgY=list.get(i).get("imgY");
int imgSpeed=list.get(i).get("speed");
if(imgX>=view_width||imgY>=view_height){
imgX=random.nextInt(view_width);
imgY=-1;
}
imgY+=imgSpeed;
list.remove(i);
map=new HashMap<String, Integer>();
map.put("imgX", imgX);
map.put("imgY", imgY);
map.put("speed", imgSpeed);
list.add(i, map);
Log.i("values", "msg:"+imgY);
//画笔风格空心
mPaint.setStyle(Paint.Style.STROKE);
if(mBitmap!=null){
if(i==0){
//画笔透明度
mPaint.setAlpha(40);
//矩阵 设置图片大小
Matrix matrix = new Matrix();
matrix.postScale(0.8f,0.8f);
resizeBmp=Bitmap.createBitmap(mBitmap,0,0,mBitmap.getWidth(),mBitmap.getHeight(),matrix,true);
}
if(i==1){
mPaint.setAlpha(80);
Matrix matrix = new Matrix();
matrix.postScale(0.6f,0.6f);
resizeBmp=Bitmap.createBitmap(mBitmap,0,0,mBitmap.getWidth(),mBitmap.getHeight(),matrix,true);
}
if(i==2){
mPaint.setAlpha(120);
Matrix matrix = new Matrix();
matrix.postScale(0.7f,0.7f);
resizeBmp=Bitmap.createBitmap(mBitmap,0,0,mBitmap.getWidth(),mBitmap.getHeight(),matrix,true);
}
if(i==3){
mPaint.setAlpha(140);
Matrix matrix = new Matrix();
matrix.postScale(1.2f,1.2f);
resizeBmp=Bitmap.createBitmap(mBitmap,0,0,mBitmap.getWidth(),mBitmap.getHeight(),matrix,true);
}
if(i==4){
mPaint.setAlpha(180);
Matrix matrix = new Matrix();
matrix.postScale(0.5f,0.5f);
resizeBmp=Bitmap.createBitmap(mBitmap,0,0,mBitmap.getWidth(),mBitmap.getHeight(),matrix,true);
}
if(i==5){
mPaint.setAlpha(200);
Matrix matrix = new Matrix();
matrix.postScale(1.1f,1.1f);
resizeBmp=Bitmap.createBitmap(mBitmap,0,0,mBitmap.getWidth(),mBitmap.getHeight(),matrix,true);
}
if(i==6){
mPaint.setAlpha(210);
Matrix matrix = new Matrix();
matrix.postScale(0.9f,0.9f);
resizeBmp=Bitmap.createBitmap(mBitmap,0,0,mBitmap.getWidth(),mBitmap.getHeight(),matrix,true);
}
if(i==7){
mPaint.setAlpha(160);
Matrix matrix = new Matrix();
matrix.postScale(0.4f,0.4f);
resizeBmp=Bitmap.createBitmap(mBitmap,0,0,mBitmap.getWidth(),mBitmap.getHeight(),matrix,true);
}
//在画布上执行
canvas.drawBitmap(resizeBmp, imgX,
imgY, mPaint);
}
}
}
}else{
flag=true;
}
}
}
最后上布局activity_main
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:background="@drawable/song" >
<com.example.music.MusicView
android:id="@+id/music"
android:layout_width="match_parent"
android:layout_height="match_parent"
tileSize="24" />
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#00000000"
android:orientation="vertical" >
<ListView
android:id="@+id/listview"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:layout_margin="0dp"
android:background="#55FFFFFF"
android:cacheColorHint="#00000000"
android:dividerHeight="2dp"
android:fastScrollEnabled="true"
android:focusable="true" >
</ListView>
</RelativeLayout>
</FrameLayout>
musicitem.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center_vertical"
android:orientation="horizontal" >
<ImageView
android:layout_marginLeft="5dp"
android:id="@+id/img"
android:layout_width="50dp"
android:layout_height="50dp"
android:src="@drawable/ic_launcher" />
<LinearLayout
android:layout_marginLeft="5dp"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical" >
<TextView
android:id="@+id/Sname"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="15sp"
android:layout_margin="5dp"
android:text="asdas" />
<TextView
android:id="@+id/name"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="15sp"
android:layout_margin="5dp"
android:text="asdas" />
</LinearLayout>
</LinearLayout>
</LinearLayout>
music.xml
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/fl"
android:layout_width="fill_parent"
android:layout_height="fill_parent" >
<LinearLayout
android:id="@+id/ll_style"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="#8866ffff"
android:gravity="center_horizontal"
android:orientation="vertical" >
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="10dp"
android:gravity="clip_vertical"
android:orientation="horizontal" >
</LinearLayout>
<TextView
android:id="@+id/titile"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text=""
android:textColor="#B16828"
android:textSize="25sp" />
<FrameLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal" >
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:src="@drawable/musics" />
<ProgressBar
android:visibility="gone"
android:id="@+id/progressBar1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center" />
</FrameLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center_horizontal"
android:orientation="horizontal" >
<ImageView
android:id="@+id/img1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="5dp"
android:src="@drawable/music4" />
<ImageView
android:id="@+id/img2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="55dp"
android:src="@drawable/music1" />
<ImageView
android:id="@+id/img3"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="55dp"
android:src="@drawable/music5" />
</LinearLayout>
<SeekBar
android:id="@+id/seekBar1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginLeft="5dp"
android:layout_marginRight="5dp"
android:paddingBottom="15dp" />
</LinearLayout>
</FrameLayout>
注意权限
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
<uses-permission android:name="android.permission.READ_PHONE_STATE"/>
最后给大家上下载地址
http://download.csdn.net/detail/u012303938/8360185