From 0c1a4d70720fd77e2704b390ecffebdea0ddfbbc Mon Sep 17 00:00:00 2001 From: tanlongsheng <252620078@qq.com> Date: Mon, 17 Nov 2025 15:50:30 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E5=AE=89=E5=8D=93=E6=82=AC?= =?UTF-8?q?=E6=B5=AE=E7=AA=97=E5=8F=AF=E4=BB=A5=E6=8B=96=E5=8A=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../saitong/voitrans/FloatingWindowService.kt | 51 ++++++++++--------- 1 file changed, 26 insertions(+), 25 deletions(-) diff --git a/android/app/src/main/kotlin/com/saitong/voitrans/FloatingWindowService.kt b/android/app/src/main/kotlin/com/saitong/voitrans/FloatingWindowService.kt index 8d4f460e9..b6e861db2 100644 --- a/android/app/src/main/kotlin/com/saitong/voitrans/FloatingWindowService.kt +++ b/android/app/src/main/kotlin/com/saitong/voitrans/FloatingWindowService.kt @@ -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) } }