前几天接触了安卓,了解了一些知识。首先就是Activity,这个在之前有提到,所以在这里就不多说了。然后就是在实现了一个能够画直线,曲线的app,在这里,说下onTouchEvent()方法(就是对手机屏幕进行监听),在这个方法中,系统可以监听到你对屏幕的所作所为,所以呢,你画图形的所有坐标应该是从这个方法中获得;
当坐标获取之后,然后就是获取画布和画笔,这个和java相比,就比较容易一些,可以直接去创建画布、画笔对象;然后就可以画图形了。之前的这些操作只是让你能够画出图形,但是想要保存你画的图形,也就是重绘,那么就要用到Bitmap这个类,具体操作是让你的画布和这个Bitmap关联起来,当你把图形画完之后,最后在将这个Bitmap画出来,就能实现重绘功能了。具体代码如下:
protected void onDraw(Canvas canvas){
//创建一个画布,并且和Bitmap关联起来
c=new Canvas(bitmap);
//创建一个画笔
Paint paint=new Paint();
//设置画笔颜色
paint.setColor(Color.RED);
//画直线
c.drawLine(x1, y1, x2, y2, paint);
//最后将Bitmap在画一次
canvas.drawBitmap(bitmap, 0,0, null);
}
接下来就是我的音乐播放器的实现了
在这里,我就简单介绍下我实现对音乐文件的搜索、歌词搜索、歌词和歌曲同步的方法
对音乐文件的搜索,这个是根据Cursor实现的,调用ContentResolver 的query方法可以将内存卡上的所以音乐文件都找到,然后放在cursor中,遍历cursor的时候,根据cursor.moveToNext()方法,如果corsor中没有数据,那么这个方法返回false。然后根据MediaStroe可以找出音乐文件的信息,
while(cursor.moveToNext()){
Map<String,Object> map=new HashMap<String,Object>();
//获取歌曲的绝对路径
String path=cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.DATA));
//获取歌曲名
String name = cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.DISPLAY_NAME));
String title=cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.TITLE));
//获取歌曲总时间
long time = cursor.getLong(cursor.getColumnIndex(MediaStore.Audio.Media.DURATION));
//转换格式
Date date=new Date(time);
SimpleDateFormat format=new SimpleDateFormat("mm:ss");
String s=format.format(date);
//将得到的内容添加到map中
map.put("image", R.drawable.backs);
map.put("songname", name);
map.put("time", s);
map.put("path", path);
map.put("title", title);
//将map添加到list中
list.add(map);
}
首先歌词的搜索,这个就相当于是将你的内存卡遍历一遍,然后找出后缀是.lrc的文件,最后把找到的文件放到一个list中,以便后面方便查询,下面是具体的代码
public void findLrc(String path){
//创建一个file对象
File file=new File(path);
if(file.exists()){
if(file.isFile()){
if(file.getName().contains(".lrc")){
String s=file.getAbsolutePath();
Map<String,Object> map=new HashMap<String,Object>();
map.put("url",s );
map.put("title", file.getName().substring(0, file.getName().length()-".lrc".length()));
FindMusic.list_lrc.add(map);
}
}
else if(file.isDirectory()){
//如果是文件夹,就要遍历文件夹下的所有文件或目录
//创建一个File数组
File[] files=file.listFiles();
if(files!=null){
for(File f:files){
//递归调用自身
findLrc(f.getAbsolutePath());
}
}
}
}
}
然后实现歌词和歌曲同步,这个就要牵扯到文件的读写,再之前找音乐文件的时候,可以通过cursor找到歌曲的标题,所以在你播放音乐的时候,音乐的标题就可以获得,因为歌词名和歌曲名的标题都是一样的,所以就可以根据当前播放的音乐的标题在歌词list中找到歌词,当找到歌词后,就要读写了,因为歌词都是一行一行出现的,所以,在读的时候,我是把歌词文件封装成一个流,然后去一行一行的读,这样不容易出错,效率也相对高一些,下面的代码就是将一个文件封装成一个流
FileInputStream fis =new FileInputStream(file);
InputStreamReader is=new InputStreamReader(fis);
BufferedReader br=new BufferedReader(is);
然后调用br.readline()方法。
当歌词读到之后,就是要分离歌词中信息了,这个主要是把时间分离出来。因为br.readline()这个方法的返回类型是一个String类型,所以分离的时候就用replace()、split()来分离,具体操作如下
String time=line.substring(0, line.indexOf("]")+1); //因为在歌词中,时间都是放在一对【】中,所以要把时间取出来
time=time.replace("[", ""); //歌词中时间的格式是mm:ss.xx,所以要把:和.代替掉,
time=time.replace("]", "");
time=time.replace(".", ":"); //在这里不能写成time=time.replace(":", ".");因为‘.’会转义
lrc_time=time.split(":"); //根据:将time分离出来
然后再将时间和对应的歌词加到list中,
List<Map<String,String>> time_list=new ArrayList<Map<String,String>>();
Map<String,String> map=new HashMap<String,String>();
map.put("time",lrc_time[0]+":"+lrc_time[1]);
map.put("line",line);
time_list.add(map);
歌词中的时间分离出来后,就要和音乐播放的时间去比较,如果相同的话,就显示歌词时间对应的歌词
p=mp.getCurrentPosition();
Date date=new Date(p);
SimpleDateFormat format=new SimpleDateFormat("mm:ss");
s=format.format(date);
//判断当前播放时间和歌词时间列表中的内容,如果相同,就显示到TextView上
for(final Map<String, String> t:time_list){
String str = t.get("time");
if(s.equals(str)){
show_loyic.post(new Runnable(){
public void run(){
show_loyic.setText(t.get("line"));
}
});
}
}
以上操作就能够把歌词和音乐同步了看下效果图