@@ -45,12 +45,18 @@ import com.xiaocydx.inputview.EditorChangedListener
4545import com.xiaocydx.inputview.EditorMode
4646import com.xiaocydx.inputview.FadeEditorAnimator
4747import com.xiaocydx.inputview.InputView
48+ import com.xiaocydx.inputview.ViewTreeWindow
4849import com.xiaocydx.inputview.current
4950import com.xiaocydx.inputview.disableGestureNavBarOffset
50- import com.xiaocydx.inputview.isVisible
5151import com.xiaocydx.inputview.notifyHideCurrent
5252import com.xiaocydx.inputview.notifyShow
53+ import com.xiaocydx.inputview.requireViewTreeWindow
5354import com.xiaocydx.inputview.transform.Overlay.Companion.ROOT_PARENT_ID
55+ import com.xiaocydx.insets.consumeInsets
56+ import com.xiaocydx.insets.navigationBarHeight
57+ import com.xiaocydx.insets.navigationBars
58+ import com.xiaocydx.insets.setOnApplyWindowInsetsListenerCompat
59+ import com.xiaocydx.insets.updateMargins
5460
5561/* *
5662 * [Overlay]的实现类
@@ -102,6 +108,15 @@ internal class OverlayImpl<S : Scene<C, E>, C : Content, E : Editor>(
102108 transformerDispatcher.initialize(rootView, editorAnimator)
103109 }
104110
111+ // 兼容insets-systembar的层级关系,补充未消费的导航栏间距
112+ var viewTreeWindow: ViewTreeWindow ? = null
113+ transformState.rootView.setOnApplyWindowInsetsListenerCompat { v, insets ->
114+ viewTreeWindow = viewTreeWindow ? : v.requireViewTreeWindow()
115+ val isSupport = viewTreeWindow!! .run { insets.supportGestureNavBarEdgeToEdge }
116+ v.updateMargins(bottom = if (isSupport) 0 else insets.navigationBarHeight)
117+ if (isSupport) insets else insets.consumeInsets(navigationBars())
118+ }
119+
105120 if (rootParent != null && rootParent.id != ROOT_PARENT_ID ) {
106121 rootParent.addView(transformState.rootView)
107122 } else {
@@ -486,18 +501,26 @@ internal class OverlayImpl<S : Scene<C, E>, C : Content, E : Editor>(
486501 backgroundView = View (context)
487502 contentView = ContentContainer (context)
488503 inputView = InputView (context)
489- rootView.isVisible = false
490504 rootView.addView(backgroundView, MATCH_PARENT , MATCH_PARENT )
491505 rootView.addView(contentView, MATCH_PARENT , MATCH_PARENT )
492506 rootView.addView(inputView, MATCH_PARENT , MATCH_PARENT )
507+ setVisible(isVisible = false )
508+ }
509+
510+ fun setVisible (isVisible : Boolean ) {
511+ rootView.isEnabled = isVisible
512+ // 设置View.INVISIBLE是为了让rootView能布局,在执行变换操作之前rootView有尺寸。
513+ // 当current = null时,Content和Editor的视图都会被移除,布局流程不会有性能问题。
514+ val visibility = if (isVisible) View .VISIBLE else View .INVISIBLE
515+ if (visibility != rootView.visibility) rootView.visibility = visibility
493516 }
494517
495518 fun invalidate () {
496519 isInvalidated = true
497520 }
498521
499522 fun prepare (previous : S ? , current : S ? ) {
500- rootView.isVisible = true
523+ setVisible( true )
501524 if (! isInvalidated) return
502525 isInvalidated = false
503526
@@ -545,7 +568,7 @@ internal class OverlayImpl<S : Scene<C, E>, C : Content, E : Editor>(
545568 }
546569
547570 fun postEnd (animation : AnimationState ) {
548- rootView.isVisible = current != null
571+ setVisible( current != null )
549572 contentView.removeChangeRecordPrevious()
550573 previous = current
551574 setOffset(animation.endOffset)
0 commit comments