浮动小插件效果

1、开启一个后台服务,保证app退出界面后,app依然活着

public class MserServes extends Service {
    //服务
    //这个类纯蛋疼用 只是为了在activity点击button后 在开启一个service

    @Override
    public IBinder onBind(Intent intent) {
        // TODO Auto-generated method stub
        return null;
    }

    public void onCreate() {
  //创建service时一个 实例化一个TableShowView对象并且调用他的fun()方法把它注册到windowManager上
        super.onCreate();
        new TableShowView(getApplicationContext()).fun();
        System.out.println("开启Mser服务......");
    }


    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        // TODO Auto-generated method stub
        return super.onStartCommand(intent, flags, startId);
    }
}
2、调用服务

public void funClick() {
   // 按钮被点击
   this.startService(new Intent(getApplicationContext(), MserServes.class));
   // new TableShowView(this).fun(); 如果只是在activity中启动
   // 当activity跑去后台的时候[暂停态,或者销毁态] 我们设置的显示到桌面的view也会消失
   // 所以这里采用的是启动一个服务,服务中创建我们需要显示到table上的view,并将其注册到windowManager上
   this.finish();
}

3、在服务中展示小插件,监听点击事件

public class TableShowView extends View {
    // 如果是想显示歌词则继承TextView并复写ondraw方法。
    // 开启一个线程不断的调用ondraw方法去更改你所写的继承自TextView的内容
    // 这里随便写了个集成自view的= =这个不是重点

    Context c;
    WindowManager mWM;        // WindowManager
    WindowManager.LayoutParams mWMParams;    // WindowManager参数
    View win;
    int tag = 0;
    int oldOffsetX;
    int oldOffsetY;

    public TableShowView(Context context) {
        // TODO Auto-generated constructor stub
        super(context);
        c = context;
    }

    public void fun() {
        // 设置载入view WindowManager参数
        mWM = (WindowManager) c.getSystemService(Context.WINDOW_SERVICE);
        win = LayoutInflater.from(c).inflate(R.layout.activity_imitate_widget_ctrl_window, null);
        win.setBackgroundColor(Color.TRANSPARENT);
        // 这里是随便载入的一个布局文件

        win.setOnTouchListener(new OnTouchListener() {
            // 触屏监听
            float lastX, lastY;

            public boolean onTouch(View v, MotionEvent event) {
                final int action = event.getAction();

                float x = event.getX();
                float y = event.getY();

                if (tag == 0) {
                    oldOffsetX = mWMParams.x; // 偏移量
                    oldOffsetY = mWMParams.y; // 偏移量
                }

                if (action == MotionEvent.ACTION_DOWN) {
                    lastX = x;
                    lastY = y;

                } else if (action == MotionEvent.ACTION_MOVE) {
                    mWMParams.x += (int) (x - lastX); // 偏移量
                    mWMParams.y += (int) (y - lastY); // 偏移量

                    tag = 1;
                    mWM.updateViewLayout(win, mWMParams);
                } else if (action == MotionEvent.ACTION_UP) {
                    int newOffsetX = mWMParams.x;
                    int newOffsetY = mWMParams.y;
                    if (oldOffsetX == newOffsetX && oldOffsetY == newOffsetY) {
                        Toast.makeText(c, "你点到我了……疼!!!!", 1).show();
                    } else {
                        tag = 0;
                    }
                }
                return true;
            }
        });

        WindowManager wm = mWM;
        WindowManager.LayoutParams wmParams = new WindowManager.LayoutParams();
        mWMParams = wmParams;
        wmParams.type = 2002; // type是关键,这里的2002表示系统级窗口,你也可以试试2003。
        wmParams.flags = 40;// 这句设置桌面可控

        wmParams.width = 50;
        wmParams.height = 50;
        wmParams.format = -3; // 透明

        wm.addView(win, wmParams);// 这句是重点 给WindowManager中丢入刚才设置的值
        // 只有addview后才能显示到页面上去。
        // 注册到WindowManager win是要刚才随便载入的layout,wmParams是刚才设置的WindowManager参数集
        // 效果是将win注册到WindowManager中并且它的参数是wmParams中设置饿
    }

}




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值