Procházet zdrojové kódy

[feat]键盘插件,增加LifecycleViewGroup类,让View支持Jetpack Lifecycle组件

hezihao před 7 měsíci
rodič
revize
1c6d24ffc2

+ 14 - 0
plugins/keyboard_android/android/src/main/kotlin/com/atmob/keyboard_android/component/base/AnimationComponent.kt

@@ -18,6 +18,11 @@ abstract class AnimationComponent @JvmOverloads constructor(
      */
     private val mComponentAnimator: ComponentAnimator
 
+    /**
+     * 组件是否正在显示
+     */
+    private var isComponentShowing: Boolean = false
+
     init {
         // 创建组件动画执行器
         mComponentAnimator = getComponentAnimator().newInstance() as ComponentAnimator
@@ -26,6 +31,7 @@ abstract class AnimationComponent @JvmOverloads constructor(
 
     override fun show(onStart: (() -> Unit)?, onFinish: (() -> Unit)?) {
         mComponentAnimator.show(onStart, onFinish = {
+            isComponentShowing = true
             onComponentShow()
             onFinish?.invoke()
         })
@@ -33,6 +39,7 @@ abstract class AnimationComponent @JvmOverloads constructor(
 
     override fun hide(onStart: (() -> Unit)?, onFinish: (() -> Unit)?) {
         mComponentAnimator.hide(onStart, onFinish = {
+            isComponentShowing = false
             onComponentHide()
             onFinish?.invoke()
         })
@@ -61,4 +68,11 @@ abstract class AnimationComponent @JvmOverloads constructor(
      */
     protected open fun onComponentHide() {
     }
+
+    /**
+     * 组件是否正在展示
+     */
+    fun isComponentShowing(): Boolean {
+        return isComponentShowing
+    }
 }

+ 3 - 7
plugins/keyboard_android/android/src/main/kotlin/com/atmob/keyboard_android/component/widget/CustomOrderFrameLayout.java

@@ -3,15 +3,16 @@ package com.atmob.keyboard_android.component.widget;
 import android.content.Context;
 import android.util.AttributeSet;
 import android.view.View;
-import android.widget.FrameLayout;
 
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
 
+import com.atmob.keyboard_android.component.widget.lifecycle.LifecycleViewGroup;
+
 /**
  * 可以自定义绘制顺序的FrameLayout
  */
-public class CustomOrderFrameLayout extends FrameLayout {
+public class CustomOrderFrameLayout extends LifecycleViewGroup {
     // 置顶的View索引
     private int frontIndex = -1;
     // 置底的View索引
@@ -30,11 +31,6 @@ public class CustomOrderFrameLayout extends FrameLayout {
         init();
     }
 
-    public CustomOrderFrameLayout(@NonNull Context context, @Nullable AttributeSet attrs, int defStyleAttr, int defStyleRes) {
-        super(context, attrs, defStyleAttr, defStyleRes);
-        init();
-    }
-
     private void init() {
         // 启用自定义绘制顺序
         setChildrenDrawingOrderEnabled(true);

+ 72 - 0
plugins/keyboard_android/android/src/main/kotlin/com/atmob/keyboard_android/component/widget/lifecycle/LifecycleViewGroup.kt

@@ -0,0 +1,72 @@
+package com.atmob.keyboard_android.component.widget.lifecycle
+
+import android.content.Context
+import android.util.AttributeSet
+import android.view.View
+import android.widget.FrameLayout
+import androidx.lifecycle.Lifecycle
+import androidx.lifecycle.LifecycleOwner
+import androidx.lifecycle.LifecycleRegistry
+
+/**
+ * 普通的ViewGroup,不支持Jetpack的Lifecycle组件,该类进行自定义支持
+ */
+open class LifecycleViewGroup @JvmOverloads constructor(
+    context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0
+) : FrameLayout(context, attrs, defStyleAttr), LifecycleOwner {
+    private val lifecycleRegistry = LifecycleRegistry(this)
+
+    override val lifecycle: Lifecycle
+        get() = lifecycleRegistry
+
+    init {
+        // 初始化状态
+        lifecycleRegistry.currentState = Lifecycle.State.INITIALIZED
+        lifecycleRegistry.currentState = Lifecycle.State.CREATED
+    }
+
+    override fun onAttachedToWindow() {
+        super.onAttachedToWindow()
+        // View添加到View树中,变更状态为可见
+        lifecycleRegistry.currentState = Lifecycle.State.STARTED
+        updateStateOnVisibility()
+    }
+
+    override fun onDetachedFromWindow() {
+        // View从View树中移除,变更状态为销毁
+        lifecycleRegistry.currentState = Lifecycle.State.DESTROYED
+        super.onDetachedFromWindow()
+    }
+
+    override fun onVisibilityChanged(changedView: View, visibility: Int) {
+        super.onVisibilityChanged(changedView, visibility)
+        // 监听可见性变化,变更状态
+        updateStateOnVisibility()
+    }
+
+    /**
+     * 可见性变化,变更状态
+     */
+    private fun updateStateOnVisibility() {
+        when (visibility) {
+            VISIBLE -> {
+                if (lifecycleRegistry.currentState.isAtLeast(Lifecycle.State.STARTED)) {
+                    lifecycleRegistry.currentState = Lifecycle.State.RESUMED
+                }
+            }
+
+            INVISIBLE, GONE -> {
+                if (lifecycleRegistry.currentState.isAtLeast(Lifecycle.State.RESUMED)) {
+                    lifecycleRegistry.currentState = Lifecycle.State.STARTED
+                }
+            }
+        }
+    }
+
+    /**
+     * 获取LifecycleOwner
+     */
+    fun getLifecycleOwner(): LifecycleOwner {
+        return this
+    }
+}

+ 15 - 0
plugins/keyboard_android/android/src/main/kotlin/com/atmob/keyboard_android/ext/LiveDataExt.kt

@@ -0,0 +1,15 @@
+package com.atmob.keyboard_android.ext
+
+import androidx.lifecycle.LifecycleOwner
+import androidx.lifecycle.LiveData
+import androidx.lifecycle.Observer
+
+/**
+ * 拓展LiveData的observe方法,设置观察者后,返回自身
+ */
+fun <T> LiveData<T>.observeNow(
+    owner: LifecycleOwner, observer: Observer<in T>
+): LiveData<T> {
+    observe(owner, observer)
+    return this
+}

+ 3 - 4
plugins/keyboard_android/android/src/main/kotlin/com/atmob/keyboard_android/keyboard/CustomKeyboardService.kt

@@ -4,7 +4,6 @@ import android.inputmethodservice.InputMethodService
 import android.view.View
 import android.view.Window
 import android.view.inputmethod.EditorInfo
-import androidx.lifecycle.LifecycleOwner
 import com.atmob.keyboard_android.R
 import com.atmob.keyboard_android.keyboard.ext.InputMethodLifecycleService
 import com.atmob.keyboard_android.mvvm.ViewModelManager
@@ -59,9 +58,9 @@ class CustomKeyboardService : InputMethodLifecycleService(), ICustomKeyboardServ
         return mKeyboardViewModel
     }
 
-    override fun getLifecycleOwner(): LifecycleOwner {
-        return this
-    }
+//    override fun getLifecycleOwner(): LifecycleOwner {
+//        return this
+//    }
 
     override fun asInputMethodService(): InputMethodService {
         return this

+ 1 - 2
plugins/keyboard_android/android/src/main/kotlin/com/atmob/keyboard_android/keyboard/ICustomKeyboardService.kt

@@ -2,7 +2,6 @@ package com.atmob.keyboard_android.keyboard
 
 import android.inputmethodservice.InputMethodService
 import android.view.Window
-import androidx.lifecycle.LifecycleOwner
 import com.atmob.keyboard_android.mvvm.viewmodel.KeyboardViewModel
 
 /**
@@ -22,7 +21,7 @@ interface ICustomKeyboardService {
     /**
      * 获取LifecycleOwner
      */
-    fun getLifecycleOwner(): LifecycleOwner
+    // fun getLifecycleOwner(): LifecycleOwner
 
     /**
      * 转换为InputMethodService类型返回