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

public class MainActivity extends Activity implements View.OnTouchListener{    MyView myView;    WindowManager wm;    WindowManager.LayoutParams layoutParams;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        wm = (WindowManager) getApplicationContext().getSystemService(Context.WINDOW_SERVICE);        //设置TextView的属性        layoutParams = new WindowManager.LayoutParams();        layoutParams.width = WindowManager.LayoutParams.WRAP_CONTENT;        layoutParams.height = WindowManager.LayoutParams.WRAP_CONTENT;        //这里是关键,使控件始终在最上方        layoutParams.type = WindowManager.LayoutParams.TYPE_SYSTEM_ALERT | WindowManager.LayoutParams.TYPE_SYSTEM_OVERLAY;        layoutParams.flags = WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL | WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE;        //这个Gravity也不能少,不然的话,下面"移动歌词"的时候就会出问题了~ 可以试试[官网文档有说明]        layoutParams.gravity = Gravity.LEFT|Gravity.TOP;        //创建自定义的TextView        myView = new MyView(this);        myView.setText("Test Touch");        myView.setTextColor(Color.BLACK);        myView.setBackgroundColor(Color.WHITE);        //监听 OnTouch 事件 为了实现"移动歌词"功能        myView.setOnTouchListener(this);        wm.addView(myView, layoutParams);    }    @Override    public boolean onTouch(View v, MotionEvent event) {         switch (event.getAction()){            case MotionEvent.ACTION_UP:                //getRawX/Y 是获取相对于Device的坐标位置 注意区别getX/Y[相对于View]                layoutParams.x = (int) event.getRawX();                layoutParams.y = (int) event.getRawY();                //更新"桌面歌词"的位置                wm.updateViewLayout(myView,layoutParams);                //下面的removeView 可以去掉"桌面歌词"                //wm.removeView(myView);                break;            case MotionEvent.ACTION_MOVE:                layoutParams.x = (int) event.getRawX();                layoutParams.y = (int) event.getRawY();                wm.updateViewLayout(myView,layoutParams);                break;        }        return false;    }    //继承 TextView  好吧,貌似有点多此一举,其实直接用TextView就好    public class MyView extends TextView{        public MyView(Context context) {            super(context);        }    }}



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

还要添加权限

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


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

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

【转载请注明出处】

Author: MummyDing

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



更多相关文章

  1. 浅谈Android软件安全自动化审计
  2. Android(安卓)动态权限申请的封装
  3. android实现桌面icon未读信息图标(类似与iPhone的badge)
  4. android的 各种权限,有个印象就好
  5. Android(安卓)权限中文描述大全
  6. Android(安卓)M 新的运行时权限开发者需要知道的一切 (安卓6.0新
  7. Android(安卓)App兼容android10.0系统需要修改那些东西,看这个就
  8. Android权限目录
  9. Android(安卓)Activity提供服务(被调用Activity 给调用Activity

随机推荐

  1. EditText属性
  2. Android(安卓)Binder驱动源码下载地址
  3. 基于Platinum库的DLNA开发
  4. 【Android(安卓)界面效果6】Android(安卓
  5. Android(安卓)中文 API (101) —— Async
  6. android 向serverGet和Post请求的两种方
  7. Android(安卓)studio 开发第一篇 APP项目
  8. android 开发之旅 R.java 常见问题
  9. android数据库使用小结
  10. 直播软件源码Android(安卓)多个ImageView