关闭

[置顶] Android中在界面上动态显示歌词

标签: androidapplicationtimerfloatconstructorclass
814人阅读 评论(0) 收藏 举报
分类:

大家一定都在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" />


0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:175328次
    • 积分:3361
    • 等级:
    • 排名:第9991名
    • 原创:155篇
    • 转载:55篇
    • 译文:1篇
    • 评论:29条
    最新评论