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


更多相关文章

  1. Android: 自定义窗口大小
  2. Activity之生命周期
  3. Android(安卓)Studio开发脱离鼠标之路
  4. 关于Android(安卓)popupWindow的位置显示 showAtLocation理解
  5. Android(安卓)退出Activity
  6. Android系统的过滤机制大揭秘——原创
  7. Android(安卓)SurfaceFlinger对VSync信号的处理过程分析
  8. Android(安卓)popupwindow以及windowManager总结——实现悬浮效
  9. 【转】Android状态栏、导航栏、DecorView高度

随机推荐

  1. [Gradle for Android(安卓)笔记系列]二
  2. 将Android项目导入到Eclipse开发环境
  3. Android修改system只读权限:remount
  4. Android帧缓冲区(Frame Buffer)硬件抽象层(H
  5. Android应用程序四大组件
  6. android 控制屏幕亮度
  7. android实现自定义相机以及图片的水印
  8. Android中UI设计的一些技巧!!!
  9. Android通过OpenSL ES播放音频套路详解
  10. 【实习周记】Android(安卓)getevent.c源