FloatWindowService.java 3.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. package com.izouma.mobilecybergames;
  2. import android.app.Service;
  3. import android.content.Intent;
  4. import android.graphics.Color;
  5. import android.graphics.PixelFormat;
  6. import android.os.Build;
  7. import android.os.IBinder;
  8. import android.provider.Settings;
  9. import android.support.annotation.Nullable;
  10. import android.view.Gravity;
  11. import android.view.MotionEvent;
  12. import android.view.View;
  13. import android.view.WindowManager;
  14. import android.widget.Button;
  15. public class FloatWindowService extends Service {
  16. private WindowManager windowManager;
  17. private WindowManager.LayoutParams layoutParams;
  18. @Override
  19. public void onCreate() {
  20. super.onCreate();
  21. windowManager = (WindowManager) getSystemService(WINDOW_SERVICE);
  22. layoutParams = new WindowManager.LayoutParams();
  23. if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
  24. layoutParams.type = WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY;
  25. } else {
  26. layoutParams.type = WindowManager.LayoutParams.TYPE_PHONE;
  27. }
  28. layoutParams.format = PixelFormat.RGBA_8888;
  29. layoutParams.gravity = Gravity.LEFT | Gravity.TOP;
  30. layoutParams.flags = WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL | WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE;
  31. layoutParams.width = 500;
  32. layoutParams.height = 100;
  33. layoutParams.x = 300;
  34. layoutParams.y = 300;
  35. }
  36. @Nullable
  37. @Override
  38. public IBinder onBind(Intent intent) {
  39. return null;
  40. }
  41. @Override
  42. public int onStartCommand(Intent intent, int flags, int startId) {
  43. if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {//判断系统版本
  44. if (Settings.canDrawOverlays(this)) {
  45. Button button = new Button(getApplicationContext());
  46. button.setText("我是个button窗口");
  47. button.setBackgroundColor(Color.BLUE);
  48. windowManager.addView(button, layoutParams);
  49. button.setOnTouchListener(new FloatingOnTouchListener());
  50. }
  51. } else {
  52. Button button = new Button(getApplicationContext());
  53. button.setText("我是个button窗口");
  54. button.setBackgroundColor(Color.BLUE);
  55. windowManager.addView(button, layoutParams);
  56. button.setOnTouchListener(new FloatingOnTouchListener());
  57. }
  58. return super.onStartCommand(intent, flags, startId);
  59. }
  60. private class FloatingOnTouchListener implements View.OnTouchListener {
  61. private int x;
  62. private int y;
  63. @Override
  64. public boolean onTouch(View view, MotionEvent event) {
  65. switch (event.getAction()) {
  66. case MotionEvent.ACTION_DOWN:
  67. x = (int) event.getRawX();
  68. y = (int) event.getRawY();
  69. break;
  70. case MotionEvent.ACTION_MOVE:
  71. int nowX = (int) event.getRawX();
  72. int nowY = (int) event.getRawY();
  73. int movedX = nowX - x;
  74. int movedY = nowY - y;
  75. x = nowX;
  76. y = nowY;
  77. layoutParams.x = layoutParams.x + movedX;
  78. layoutParams.y = layoutParams.y + movedY;
  79. windowManager.updateViewLayout(view, layoutParams);
  80. break;
  81. default:
  82. break;
  83. }
  84. return false;
  85. }
  86. }
  87. }