zoukankan      html  css  js  c++  java
  • 【Android】桌面歌词悬浮效果简单实现

    在使用"网易云音乐"的时候,发现有一个显示"桌面歌词"的功能,于是就想着自己实现下。查了下资料,是用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/



  • 相关阅读:
    浅谈.NET和JAVA的跨平台
    ADO.NET获取TIPTOP存储过程的返回值
    Hide DataGrid Columns via HeaderText
    笑话一则:开车的最高境界
    [推薦]面试时最常问的15问题
    美国小学生守则 VS 中国小学生守则
    Embedded UserControls: Revisited
    SOA认识存误区 详解SOA企业部署的六大关键要素
    Java、.NET,为什么不合二为一?
    [轉]informix语句祥解
  • 原文地址:https://www.cnblogs.com/cxchanpin/p/7069317.html
Copyright © 2011-2022 走看看