Runt
2022-05-01 1c757c667d4d827cc0bcf692dae663f7ca49b01c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
package com.auto.lyric.service;
 
import android.app.Service;
import android.content.Intent;
import android.graphics.PixelFormat;
import android.os.Build;
import android.os.Handler;
import android.os.IBinder;
import android.os.Message;
import android.util.Log;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.View;
import android.view.WindowManager;
 
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.core.view.LayoutInflaterFactory;
 
import com.auto.lyric.R;
import com.auto.lyric.databinding.FloatViewBinding;
import com.auto.lyric.util.DeviceUtil;
 
/**
 * 全局悬浮窗
 * Created by Runt (qingingrunt2010@qq.com) on 2022/4/30.
 */
public class FloatingWindowService extends Service {
 
    private WindowManager manager;
    private WindowManager.LayoutParams params;
    FloatViewBinding binding;
    Handler handler;
    final String TAG = "FloatingWindowService";
 
    @Override
    public void onCreate() {
        super.onCreate();
        Log.e(TAG,"onCreate ");
        View view = LayoutInflater.from(getBaseContext()).inflate(R.layout.float_view,null);
        binding = FloatViewBinding.bind(view);
        manager = (WindowManager) getSystemService(WINDOW_SERVICE);
        params = new WindowManager.LayoutParams();
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
            params.type = WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY;
        }else {
            params.type = WindowManager.LayoutParams.TYPE_SYSTEM_ALERT;
        }
        params.format = PixelFormat.RGBA_8888;
        params.gravity = Gravity.LEFT | Gravity.TOP;
        params.flags = WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL | WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE;
        params.width = WindowManager.LayoutParams.MATCH_PARENT;
        params.height = DeviceUtil.convertDpToPixel(200,getBaseContext());
        handler = new Handler(this.getMainLooper()){
            @Override
            public void handleMessage(@NonNull Message msg) {
                binding.lyric.setText(msg.obj.toString());
                int offset = binding.lyric.getLineCount() * binding.lyric.getLineHeight();
 
            }
        };
        binding.close.setOnClickListener(v ->{
            stopService(new Intent(this,this.getClass()));
            stopService(new Intent(this,AutoInputService.class));
        });
        binding.floating.setOnTouchListener(new View.OnTouchListener() {
            int startY;
            @Override
            public boolean onTouch(View v, MotionEvent event) {
                if(event.getAction() == MotionEvent.ACTION_DOWN){
                    startY = (int) event.getY();
 
                }else if(event.getAction() == MotionEvent.ACTION_MOVE
                    || event.getAction() == MotionEvent.ACTION_UP){
                    params.y = (int) event.getRawY() - DeviceUtil.getStatusBarHeight(getBaseContext()) - startY;
                    manager.updateViewLayout(binding.getRoot(), params);
                    Log.e(TAG,"ACTION_MOVE V:"+params.y);
                }
                Log.e(TAG,"onTouch event:"+event);
                Log.e(TAG,"onTouch getRawY:"+event.getRawY());
                return true;
            }
        });
 
    }
 
    @Nullable
    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }
 
    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        Log.e(TAG,"onStartCommand flags:"+flags+" startId:"+startId+ " intent:"+intent);
        manager.addView(binding.getRoot(),params);
        return super.onStartCommand(intent, flags, startId);
    }
 
    @Override
    public void onDestroy() {
        super.onDestroy();
        Log.e(TAG,"onDestroy ");
        manager.removeView(binding.getRoot());
 
    }
}