|
|
|
@ -19,6 +19,7 @@ class FloatingWindowService : Service() { |
|
|
|
private var windowManager: WindowManager? = null |
|
|
|
private var floatingView: View? = null |
|
|
|
private var isMinimized = true |
|
|
|
private lateinit var layoutParams: WindowManager.LayoutParams |
|
|
|
|
|
|
|
private lateinit var sourceTextView: TextView |
|
|
|
private lateinit var translatedTextView: TextView |
|
|
|
@ -73,7 +74,7 @@ class FloatingWindowService : Service() { |
|
|
|
setupClickListeners() |
|
|
|
|
|
|
|
// 设置窗口参数 |
|
|
|
val layoutParams = WindowManager.LayoutParams().apply { |
|
|
|
layoutParams = WindowManager.LayoutParams().apply { |
|
|
|
width = WindowManager.LayoutParams.WRAP_CONTENT |
|
|
|
height = WindowManager.LayoutParams.WRAP_CONTENT |
|
|
|
type = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { |
|
|
|
@ -255,26 +256,12 @@ class FloatingWindowService : Service() { |
|
|
|
} |
|
|
|
|
|
|
|
private fun setupClickListeners() { |
|
|
|
// 最小化状态点击展开 |
|
|
|
minimizedView.setOnClickListener { |
|
|
|
isMinimized = false |
|
|
|
updateViewState(false) |
|
|
|
notifyStateChange("expanded") |
|
|
|
} |
|
|
|
|
|
|
|
// 展开状态点击最小化 |
|
|
|
expandedView.setOnClickListener { |
|
|
|
isMinimized = true |
|
|
|
updateViewState(true) |
|
|
|
notifyStateChange("minimized") |
|
|
|
} |
|
|
|
|
|
|
|
// 长按关闭 |
|
|
|
floatingView!!.setOnLongClickListener { |
|
|
|
closeFloatingWindow() |
|
|
|
true |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
// 拖拽功能 |
|
|
|
setupDragListener() |
|
|
|
} |
|
|
|
@ -284,25 +271,40 @@ class FloatingWindowService : Service() { |
|
|
|
var initialY = 0 |
|
|
|
var initialTouchX = 0f |
|
|
|
var initialTouchY = 0f |
|
|
|
|
|
|
|
var dragging = false |
|
|
|
val threshold = (4 * resources.displayMetrics.density).toInt() |
|
|
|
floatingView!!.setOnTouchListener { _, event -> |
|
|
|
when (event.action) { |
|
|
|
MotionEvent.ACTION_DOWN -> { |
|
|
|
val layoutParams = floatingView!!.layoutParams as WindowManager.LayoutParams |
|
|
|
initialX = layoutParams.x |
|
|
|
initialY = layoutParams.y |
|
|
|
initialTouchX = event.rawX |
|
|
|
initialTouchY = event.rawY |
|
|
|
dragging = false |
|
|
|
true |
|
|
|
} |
|
|
|
MotionEvent.ACTION_MOVE -> { |
|
|
|
val layoutParams = floatingView!!.layoutParams as WindowManager.LayoutParams |
|
|
|
layoutParams.x = initialX + (event.rawX - initialTouchX).toInt() |
|
|
|
layoutParams.y = initialY + (event.rawY - initialTouchY).toInt() |
|
|
|
val dx = (event.rawX - initialTouchX).toInt() |
|
|
|
val dy = (event.rawY - initialTouchY).toInt() |
|
|
|
if (Math.abs(dx) > threshold || Math.abs(dy) > threshold) dragging = true |
|
|
|
val dm = resources.displayMetrics |
|
|
|
val maxX = dm.widthPixels - (floatingView?.width ?: 0) |
|
|
|
val maxY = dm.heightPixels - (floatingView?.height ?: 0) |
|
|
|
layoutParams.x = (initialX + dx).coerceIn(0, maxX) |
|
|
|
layoutParams.y = (initialY + dy).coerceIn(0, maxY) |
|
|
|
windowManager?.updateViewLayout(floatingView, layoutParams) |
|
|
|
true |
|
|
|
} |
|
|
|
else -> false |
|
|
|
MotionEvent.ACTION_UP -> { |
|
|
|
if (!dragging) { |
|
|
|
isMinimized = !isMinimized |
|
|
|
updateViewState(isMinimized) |
|
|
|
notifyStateChange(if (isMinimized) "minimized" else "expanded") |
|
|
|
} |
|
|
|
dragging = false |
|
|
|
true |
|
|
|
} |
|
|
|
else -> true |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
@ -347,11 +349,10 @@ class FloatingWindowService : Service() { |
|
|
|
val x = intent.getIntExtra(EXTRA_X, 0) |
|
|
|
val y = intent.getIntExtra(EXTRA_Y, 0) |
|
|
|
|
|
|
|
floatingView?.let { view -> |
|
|
|
val layoutParams = view.layoutParams as WindowManager.LayoutParams |
|
|
|
floatingView?.let { |
|
|
|
layoutParams.x = x |
|
|
|
layoutParams.y = y |
|
|
|
windowManager?.updateViewLayout(view, layoutParams) |
|
|
|
windowManager?.updateViewLayout(it, layoutParams) |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|