在使用"网易云音乐"的时候,发现有一个显示"桌面歌词"的功能,于是就想着自己实现下。查了下资料,是用WindowManage实现的。实现过程中也出现了些问题,看了官方文档,也算攻克了。这里贴上简单代码。

  1. public class MainActivity extends Activity implements View.OnTouchListener{
  2. MyView myView;
  3. WindowManager wm;
  4. WindowManager.LayoutParams layoutParams;
  5. @Override
  6. protected void onCreate(Bundle savedInstanceState) {
  7. super.onCreate(savedInstanceState);
  8. wm = (WindowManager) getApplicationContext().getSystemService(Context.WINDOW_SERVICE);
  9. //设置TextView的属性
  10. layoutParams = new WindowManager.LayoutParams();
  11. layoutParams.width = WindowManager.LayoutParams.WRAP_CONTENT;
  12. layoutParams.height = WindowManager.LayoutParams.WRAP_CONTENT;
  13. //这里是关键。使控件始终在最上方
  14. layoutParams.type = WindowManager.LayoutParams.TYPE_SYSTEM_ALERT | WindowManager.LayoutParams.TYPE_SYSTEM_OVERLAY;
  15. layoutParams.flags = WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL | WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE;
  16. //这个Gravity也不能少。不然的话,以下"移动歌词"的时候就会出问题了~ 能够试试[官网文档有说明]
  17. layoutParams.gravity = Gravity.LEFT|Gravity.TOP;
  18.  
  19. //创建自己定义的TextView
  20. myView = new MyView(this);
  21. myView.setText("Test Touch");
  22. myView.setTextColor(Color.BLACK);
  23. myView.setBackgroundColor(Color.WHITE);
  24. //监听 OnTouch 事件 为了实现"移动歌词"功能
  25. myView.setOnTouchListener(this);
  26.  
  27. wm.addView(myView, layoutParams);
  28.  
  29. }
  30.  
  31. @Override
  32. public boolean onTouch(View v, MotionEvent event) {
  33. switch (event.getAction()){
  34. case MotionEvent.ACTION_UP:
  35. //getRawX/Y 是获取相对于Device的坐标位置 注意差别getX/Y[相对于View]
  36. layoutParams.x = (int) event.getRawX();
  37. layoutParams.y = (int) event.getRawY();
  38. //更新"桌面歌词"的位置
  39. wm.updateViewLayout(myView,layoutParams);
  40. //以下的removeView 能够去掉"桌面歌词"
  41. //wm.removeView(myView);
  42. break;
  43. case MotionEvent.ACTION_MOVE:
  44. layoutParams.x = (int) event.getRawX();
  45. layoutParams.y = (int) event.getRawY();
  46. wm.updateViewLayout(myView,layoutParams);
  47. break;
  48. }
  49. return false;
  50. }
  51. //继承 TextView 好吧,貌似有点多此一举,事实上直接用TextView就好
  52. public class MyView extends TextView{
  53. public MyView(Context context) {
  54. super(context);
  55. }
  56. }
  57. }

------------Update 补充  ------

还要加入权限

  1. <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />

MIUI 则还要在设置中打开同意弹出悬浮窗的权限

完整代码:https://github.com/MummyDing/DisplayLyricsonDesktop

【转载请注明出处】

Author: MummyDing

出处:http://blog.csdn.net/mummyding/article/details/

【Android】桌面歌词悬浮效果简单实现的更多相关文章

  1. Android桌面悬浮窗效果实现,仿360手机卫士悬浮窗效果

    大家好,今天给大家带来一个仿360手机卫士悬浮窗效果的教程,在开始之前请允许我说几句不相干的废话. 不知不觉我发现自己接触Android已有近三个年头了,期间各种的成长少不了各位高手的帮助,总是有很多 ...

  2. android桌面悬浮窗仿QQ手机管家加速效果

    主要还是用到了WindowManager对桌面悬浮进行管理. 需要一个火箭的悬浮窗 一个发射台悬浮窗  ,判断火箭是否放到了发射台,如果放上了,则使用AsyTask 慢慢将火箭的图片往上移.结束后., ...

  3. Android -- 桌面悬浮,QQ管家火箭实现

    续上一篇博客<Android -- 桌面悬浮,仿360>,传送门:http://www.cnblogs.com/yydcdut/p/3909888.html,在此代码上继续添加实现. 比起 ...

  4. Android -- 桌面悬浮,仿360

    实现原理                                                                               这种桌面悬浮窗的效果很类似与Wid ...

  5. Android 仿美团网,大众点评购买框悬浮效果之修改版

    转帖请注明本文出自xiaanming的博客(http://blog.csdn.net/xiaanming/article/details/17761431),请尊重他人的辛勤劳动成果,谢谢! 我之前写 ...

  6. Android对ScrollView滚动监听,实现美团、大众点评的购买悬浮效果

    转帖请注明本文出自xiaanming的博客(http://blog.csdn.net/xiaanming/article/details/17761431),请尊重他人的辛勤劳动成果,谢谢! 我之前写 ...

  7. Android 对ScrollView滚动监听,实现美团、大众点评的购买悬浮效果

    转帖请注明本文出自xiaanming的博客(http://blog.csdn.net/xiaanming),请尊重他人的辛勤劳动成果,谢谢! 随着移动互联网的快速发展,它已经和我们的生活息息相关了,在 ...

  8. Android桌面悬浮清内存app概述

    今天闲来无事写了一个清内存的小东西,类似360,在桌面上悬浮,点击后清除后台无用程序,清除后台程序是通过调用ActivityManger.killBackgroundProcesses的方式来进行的, ...

  9. Android 应用内悬浮控件实践总结

    在工作中遇到一个需求,需要在整个应用的上层悬浮显示控件,目标效果如下图: 首先想到的是申请悬浮窗权限,OK~ 打开搜索引擎,映入眼帘的并不是如何申请,而是“Android 悬浮窗权限各机型各系统适配大 ...

随机推荐

  1. CC2540 与 CC2541 差别 1

    CC2540 的 1234 PIN 是 USB 功能,4 PIN 是 USB 的电压输入引脚. CC2541 没有 USB 功能.它的 1234 PIN 是 I2C 功能,为了与 CC2540 引脚兼 ...

  2. Android 获取屏幕截图 和保存到本地的sd卡路径下

    /** * 获取和保存当前屏幕的截图 */ private void GetandSaveCurrentImage() { //1.构建Bitmap WindowManager windowManag ...

  3. iOS-为方便项目开发在pch加入一些经常使用宏定义

    1.关于NSLog输出 /** * 当Xcode为Release时不输出,为Debug时输出 * * @param ... * * @return */ #ifndef __OPTIMIZE__ #d ...

  4. kentico在使用局域网ip访问的时候提示Missing license或者Invalid website

    Missing license Requested URL: http://172.31.212.20/kentico10/ License status: Missing license If yo ...

  5. EOJ 3 玩具谜题

    小南有一套可爱的玩具小人,它们各有不同的职业. 有一天,这些玩具小人把小南的眼镜藏了起来.小南发现玩具小人们围成了一个圈,它们有的面朝圈内,有的面朝圈外.如下图: 这时 singer 告诉小南一个谜题 ...

  6. oracle故障处理之删除大表空间hang住

    背景 数据库分区表数据越来越大,需要对过期话的数据进行迁移,以及大的分区表需要进行数据的清理和删除,达到释放磁盘空间的目的. 问题说明 环境:linux 6.X 数据库:oracle 11.2.0.4 ...

  7. SQL Server的三种分页方式

    直接上代码 --top not in方式 select top 条数 * from tablename where Id not in (select top 条数*页数 Id from tablen ...

  8. EF Code First 使用 代码优先迁移(三)

    迁移到特定版本(包括降级) 到目前为止,我们一直升级到最新的迁移,但有时您可能需要升级/降级到特定的迁移. 这是目前我数据库中的表:有四个表,我降级到addEndTime这个版本(这个版本是没有gra ...

  9. C# 3.0的新特性

    自动属性. 之前定义属性的步骤: private filed + public property. 现在的形式:int id{get;set;}. 可以分别设置get/set的保护级别(protect ...

  10. Functional programming-函数式编程

    In computer science, functional programming is a programming paradigm—a style of building the struct ...