Kaynağa Gözat

feat: 悬浮窗,系统悬浮窗可拖拽

DoggyZhang 1 ay önce
ebeveyn
işleme
494f51bc0c

+ 36 - 11
app/src/main/java/com/adealink/weparty/commonui/widget/floatview/view/BaseDragFloatView.kt

@@ -14,12 +14,15 @@ import com.adealink.frame.util.DisplayUtil.getScreenHeight
 import com.adealink.frame.util.DisplayUtil.getScreenWidth
 import com.adealink.frame.util.isTouchPointInView
 import com.adealink.weparty.commonui.widget.floatview.data.IWindowFloatData
+import com.adealink.weparty.commonui.widget.floatview.data.MODE_APPLICATION
+import com.adealink.weparty.commonui.widget.floatview.data.MODE_SYSTEM
 import com.adealink.weparty.commonui.widget.floatview.data.TAG_FLOAT_DRAG_VIEW
 import com.adealink.weparty.commonui.widget.floatview.data.TAG_FLOAT_VIEW
 import java.lang.Math.abs
 
 
-abstract class BaseDragFloatView(baseFloatData: IWindowFloatData) : BaseWindowFloatView(baseFloatData) {
+abstract class BaseDragFloatView(baseFloatData: IWindowFloatData) :
+    BaseWindowFloatView(baseFloatData) {
 
     companion object {
         private const val TAG = "BaseDragFloatView"
@@ -185,7 +188,7 @@ abstract class BaseDragFloatView(baseFloatData: IWindowFloatData) : BaseWindowFl
         format = PixelFormat.TRANSLUCENT
         flags = (WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH
                 or WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
-                or WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL
+                //or WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL
                 or WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS)
         gravity = Gravity.START or Gravity.TOP
         val layoutX = getLayoutParamX()
@@ -201,15 +204,37 @@ abstract class BaseDragFloatView(baseFloatData: IWindowFloatData) : BaseWindowFl
         }
     }
 
-    private fun updateViewLayout(){
-        if (windowParams.token != null) {
-            try {
-                windowManager?.getCurrentWindowManager()?.updateViewLayout(this@BaseDragFloatView, windowParams)
-            } catch (e: Throwable) {
-                Log.e(
-                    TAG_FLOAT_VIEW,
-                    "$TAG_FLOAT_DRAG_VIEW, updateViewLayout crash, $e"
-                )
+    private fun updateViewLayout() {
+        when (baseFloatData.windowMode()) {
+            MODE_APPLICATION -> {
+                if (windowParams.token != null) {
+                    try {
+                        windowManager?.getCurrentWindowManager()
+                            ?.updateViewLayout(this@BaseDragFloatView, windowParams)
+                    } catch (e: Throwable) {
+                        Log.e(
+                            TAG_FLOAT_VIEW,
+                            "$TAG_FLOAT_DRAG_VIEW, updateViewLayout crash, $e"
+                        )
+                    }
+                } else {
+                    Log.w(
+                        TAG_FLOAT_VIEW,
+                        "$TAG_FLOAT_DRAG_VIEW, updateViewLayout fail(${this}), windowParams.token is null"
+                    )
+                }
+            }
+
+            MODE_SYSTEM -> {
+                try {
+                    windowManager?.getCurrentWindowManager()
+                        ?.updateViewLayout(this@BaseDragFloatView, windowParams)
+                } catch (e: Throwable) {
+                    Log.e(
+                        TAG_FLOAT_VIEW,
+                        "$TAG_FLOAT_DRAG_VIEW, updateViewLayout crash(${this}), $e"
+                    )
+                }
             }
         }
     }

+ 15 - 6
module/call/src/main/java/com/adealink/weparty/call/widget/float/calling/CallingFloatView.kt

@@ -2,7 +2,6 @@ package com.adealink.weparty.call.widget.float.calling
 
 import android.content.Intent
 import android.view.View
-import android.view.WindowManager
 import com.adealink.frame.log.Log
 import com.adealink.frame.router.Router
 import com.adealink.frame.util.AppUtil
@@ -41,7 +40,17 @@ class CallingFloatView(floatData: CallingFloatData) :
         CallingView(context)
 
     init {
-        setContentView(callingView)
+        setContentView(
+            callingView, LayoutParams(
+                LayoutParams.WRAP_CONTENT,
+                LayoutParams.WRAP_CONTENT,
+            ).apply {
+                topToTop = LayoutParams.PARENT_ID
+                bottomToBottom = LayoutParams.PARENT_ID
+                startToStart = LayoutParams.PARENT_ID
+                endToEnd = LayoutParams.PARENT_ID
+            }
+        )
         callingView.setOnClickListener {
             cancelCallingView()
             if (CallUtils.getSelfCallStatus() != CallParticipantStatus.None) {
@@ -97,11 +106,11 @@ class CallingFloatView(floatData: CallingFloatData) :
     }
 
     override fun getLayoutParamWidth(): Int {
-        return 80.dp()
+        return 100.dp()
     }
 
     override fun getLayoutParamHeight(): Int {
-        return WindowManager.LayoutParams.WRAP_CONTENT
+        return 100.dp()
     }
 
     override fun getClickableViews(): List<View> {
@@ -109,11 +118,11 @@ class CallingFloatView(floatData: CallingFloatData) :
     }
 
     override fun getLayoutParamX(): Int {
-        return DisplayUtil.getScreenWidth() - getLayoutParamWidth() - 20.dp()
+        return DisplayUtil.getScreenWidth() - getLayoutParamWidth()
     }
 
     override fun getLayoutParamY(): Int {
-        return 100.dp()
+        return DisplayUtil.getScreenWidth() - getLayoutParamHeight() - 80.dp()
     }
 
     override fun applySnapToEdge(): Boolean {

+ 1 - 0
module/call/src/main/res/layout/call_float_call_view.xml

@@ -6,6 +6,7 @@
     android:layout_height="wrap_content">
 
     <androidx.constraintlayout.widget.ConstraintLayout
+        android:id="@+id/cl_content"
         android:layout_width="@dimen/call_calling_float_view_width"
         android:layout_height="@dimen/call_calling_float_view_width"
         android:background="@color/white">