Android中在界面上动态显示歌词

原创 2012年03月26日 19:34:11

大家一定都在windows下使用过音乐播放器,可以在桌面显示歌词,并且可以随意的移动歌词显示位置,当歌词盖住其他应用程序快捷图标时并不影响鼠标的点击。不知在android中如何实现这种效果?经过几番尝试,终于……还是先上图吧,一看就明白!

现将代码分享给大家,希望大家加以指正并提出宝贵的建议

1.主程序MyFloatViewActivity.java

import java.util.Timer;
import java.util.TimerTask;
import android.app.Activity;
import android.graphics.Color;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
import android.view.Gravity;
import android.view.WindowManager;

public class MyFloatViewActivity extends Activity {
    /** Called when the activity is first created. */    
    WindowManager wm=null;
    WindowManager.LayoutParams wmParams=null;    
    MyFloatView myFV=null;
    public Timer timer;
    public int index=0;
    public String[] msgs;
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        //获取歌词并存放在数组中
        msgs =getResources().getStringArray(R.array.ge);
        //创建悬浮窗口
        createView();
    }   
    private void createView(){
        myFV=new MyFloatView(getApplicationContext());
        myFV.setText(msgs[index]);
        myFV.setTextColor(Color.RED);//设置字体颜色
        //获取WindowManager
        wm=(WindowManager)getApplicationContext().getSystemService("window");
        //设置LayoutParams(全局变量)相关参数
        wmParams = ((MyApplication)getApplication()).getMywmParams();
        wmParams.type=2002;
        wmParams.format=1;
        wmParams.flags|=8;              
        wmParams.gravity=Gravity.LEFT|Gravity.TOP;//调整悬浮窗口至左上角
        //以屏幕左上角为原点,设置x、y初始值
        wmParams.x=0;
        wmParams.y=0;       
        //设置悬浮窗口长宽数据
        wmParams.width=120;
        wmParams.height=40;
        //显示myFloatView
        wm.addView(myFV, wmParams);
        changeText();
    }
    //动态显示歌词
    private void changeText(){
        final Handler handler=new Handler(){
            public void handleMessage(Message msg){
                switch(msg.what){
                case 1:                  
                    myFV.setText(msgs[index]);
                    index++;
                    Log.d("index", String.valueOf(index));
                    //歌词显示完毕时将数组索引值设为0,使其重头开始
                    if(index==msgs.length){
                        index=0;
                    }
                    break;
                }
                super.handleMessage(msg);
            }
        };             
        TimerTask task=new TimerTask(){
            public void run(){
                Message message=new Message();
                message.what=1;
                handler.sendMessage(message);
            }
        };             
        timer=new Timer();
        //在此可以设置歌词更换时间
        timer.schedule(task,1000,2000);
    }
//    @Override
//    public void onDestroy(){
//        super.onDestroy();
//        //在程序退出(Activity销毁)时销毁悬浮窗口
//        wm.removeView(myFV);
//    }   

}

2.MyFloatView.java该类继承TextView,显示歌词,处理移动事件

import android.content.Context;
import android.util.Log;
import android.view.MotionEvent;
import android.view.WindowManager;
import android.widget.TextView;

public class MyFloatView extends TextView {
    private float mTouchStartX;
    private float mTouchStartY;
    private float x;
    private float y;
    
    private WindowManager wm=(WindowManager)getContext().getApplicationContext().getSystemService("window");
    private WindowManager.LayoutParams wmParams = ((MyApplication)getContext().getApplicationContext()).getMywmParams();

    public MyFloatView(Context context) {
        super(context);        
        // TODO Auto-generated constructor stub
    }
    
     @Override
     public boolean onTouchEvent(MotionEvent event) {        
         //获取相对屏幕的坐标,即以屏幕左上角为原点    
         x = event.getRawX();
         y = event.getRawY()-25;   //25是系统状态栏的高度
         Log.i("currP", "currX"+x+"====currY"+y);
         switch (event.getAction()) {
                //手指按下时
            case MotionEvent.ACTION_DOWN:
                //获取相对View的坐标,即以此View左上角为原点
                mTouchStartX =  event.getX();  
                mTouchStartY =  event.getY();               
                Log.i("startP", "startX"+mTouchStartX+"====startY"+mTouchStartY);                
                break;
                //手指移动时
            case MotionEvent.ACTION_MOVE:
                //更新视图
                updateViewPosition();
                break;
                //手指松开时
            case MotionEvent.ACTION_UP:
                updateViewPosition();
                mTouchStartX=mTouchStartY=0;
                break;
            }
            return true;
        }    
     private void updateViewPosition(){
        //更新浮动窗口位置参数
        wmParams.x=(int)( x-mTouchStartX);
        wmParams.y=(int) (y-mTouchStartY);
        wm.updateViewLayout(this, wmParams);
     }
}

3.MyApplication.java创建全局变量

import android.app.Application;
import android.view.WindowManager;

public class MyApplication extends Application {
    /**
     * 创建全局变量
     * 全局变量一般都比较倾向于创建一个单独的数据类文件,并使用static静态变量
     *
     * 这里使用了在Application中添加数据的方法实现全局变量
     * 注意在AndroidManifest.xml中的Application节点添加android:name=".MyApplication"属性
     */
    private WindowManager.LayoutParams wmParams=new WindowManager.LayoutParams();
    public WindowManager.LayoutParams getMywmParams(){
        return wmParams;
    }

}

4.res/values/下的array.xml文件,用于存放歌词(大家可以尝试一下将歌词文件放在txt文档中)

<?xml version="1.0" encoding="utf-8"?>
<resources>
<string-array name="ge">
<item>金莎 - 星月神话</item>
<item>作词:金莎   作曲:金莎</item>
<item>我的一生最美好的场景</item>
<item>就是遇见你</item>
<item>在人海茫茫中静静凝望着你</item>
<item>陌生又熟悉</item>
<item>尽管呼吸着同一天空的气息</item>
<item>却无法拥抱到你</item>
<item>如果转换了时空身份和姓名</item>
<item>但愿认得你眼睛</item>
<item>千年之后的你会在哪里</item>
<item>身边有怎样风景</item>
<item>我们的故事并不算美丽</item>
<item>却如此难以忘记</item>
<item>尽管呼吸着同一天空的气息</item>
<item>却无法拥抱到你</item>
<item>如果转换了时空身份和姓名</item>
<item>但愿认得你眼睛</item>
<item>千年之后的你会在哪里</item>
<item>身边有怎样风景</item>
<item>我们的故事并不算美丽</item>
<item>却如此难以忘记</item>
<item>如果当初勇敢的在一起</item>
<item>会不会不同结局</item>
<item>你会不会也有千言万语</item>
<item>埋在沉默的梦里</item>
</string-array>
</resources>

注意3代码中的注释,记得在AndroidManifest.xml中的Application节点添加android:name=".MyApplication"属性

在AndroidManifest.xml文件中添加权限:  <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />


Android开发--桌面浮动歌词窗口

随着Android手机的屏幕越来越大,Android浮动窗口的应用也越来越多。像经常会用到的,音乐播放器的桌面歌词以及一些手机卫士软件,像腾讯手机管家的小火箭清理内存,都应用到了浮动窗口的原理,今天拿...
  • smbroe
  • smbroe
  • 2015年02月06日 19:53
  • 1800

Android中歌词显示的实现

之前想写一个音乐播放器,但是一直不明白歌词应该怎么显示。 用UI Automator观察了一下各大音乐播放器,发现QQ音乐和百度音乐是在ScrollView里显示歌词。不清楚ScrollView里面具...

android实现歌词的自动滚动

最近在做android 的MP3播放的项目,要实现歌词的自动滚动,以及同步显示。lyric的歌词解析主要用yoyoplayer里面的,显示部分参考了http://ishelf.iteye.com/bl...

android自定义view显示歌词

通过从写onDraw方法,在view中绘制字符串实现歌词显示 public class DrawTextView extends View { private Paint paint=null;...

Android开源滚动显示歌词控件

效果图 滚动显示的歌词控件,可以设置背景、字体大小、当前行歌词颜色、其他行歌词颜色、行间距。 使用方法: 1.布局中引入 ...

android编程实例-音乐播放器之歌词显示

/** * 处理歌词中的一行内容 * * @param text * @return */ private static String analyzeLRC(String te...
  • cjyusha
  • cjyusha
  • 2016年03月24日 14:10
  • 2019

Android 为应用增加可移动的悬浮窗口

需求描述: 在使用手机客户端浏览内嵌网页的时候,界面出现一个悬浮的刷新按钮,点击网页重新加载。 布局: ...
  • jdsjlzx
  • jdsjlzx
  • 2016年01月23日 17:14
  • 1602

Android开发--桌面浮动歌词窗口

随着Android手机的屏幕越来越大,Android浮动窗口的应用也越来越多。像经常会用到的,音乐播放器的桌面歌词以及一些手机卫士软件,像腾讯手机管家的小火箭清理内存,都应用到了浮动窗口的原理,今天拿...
  • smbroe
  • smbroe
  • 2015年02月06日 19:53
  • 1800

动态显示歌词

一、在Android中,不能在主线程中更新布局,这样可能抛出Response Exception。      需要开启一个线程来不断更新动态的视图,如此才不会影响到主线程的运行。      同样的,也...
  • synwith
  • synwith
  • 2011年05月08日 12:41
  • 1248
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Android中在界面上动态显示歌词
举报原因:
原因补充:

(最多只允许输入30个字)