feat: 进港查询筛选弹窗改为内容区嵌入式面板
将筛选条件弹框从 XPopup DrawerPopupView 改为嵌入 Activity 内容区的滑动面板, 使筛选面板从右侧滑入时不遮挡顶部蓝色标题栏,暗色遮罩也只覆盖内容区域。 同时修复首次弹出时因布局测量时序导致的闪烁问题。 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -3,6 +3,9 @@ package com.lukouguoji.gjj.activity
|
||||
import android.content.Context
|
||||
import android.content.Intent
|
||||
import android.os.Bundle
|
||||
import android.view.Gravity
|
||||
import android.view.View
|
||||
import android.widget.FrameLayout
|
||||
import com.alibaba.android.arouter.facade.annotation.Route
|
||||
import com.lukouguoji.gjj.R
|
||||
import com.lukouguoji.gjj.databinding.ActivityIntImpQueryBinding
|
||||
@@ -43,10 +46,66 @@ class IntImpQueryActivity :
|
||||
|
||||
viewModel.initAgentList()
|
||||
viewModel.initSpecialCodeList()
|
||||
viewModel.initFilterLists()
|
||||
|
||||
// 观察筛选面板显示状态
|
||||
viewModel.filterVisible.observe(this) { visible ->
|
||||
if (visible) showFilterPanel() else hideFilterPanel()
|
||||
}
|
||||
|
||||
viewModel.refresh()
|
||||
}
|
||||
|
||||
private fun showFilterPanel() {
|
||||
val panel = binding.filterPanel.root
|
||||
val overlay = binding.filterOverlay
|
||||
val panelWidth = window.decorView.width / 3
|
||||
|
||||
panel.layoutParams = (panel.layoutParams as FrameLayout.LayoutParams).apply {
|
||||
width = panelWidth
|
||||
gravity = Gravity.END
|
||||
}
|
||||
|
||||
// 先 INVISIBLE 完成测量,避免第一次显示时闪烁
|
||||
panel.visibility = View.INVISIBLE
|
||||
panel.translationX = panelWidth.toFloat()
|
||||
overlay.visibility = View.VISIBLE
|
||||
overlay.alpha = 0f
|
||||
|
||||
panel.post {
|
||||
panel.visibility = View.VISIBLE
|
||||
panel.animate().translationX(0f).setDuration(250).start()
|
||||
overlay.animate().alpha(1f).setDuration(250).start()
|
||||
}
|
||||
}
|
||||
|
||||
private fun hideFilterPanel() {
|
||||
val panel = binding.filterPanel.root
|
||||
val overlay = binding.filterOverlay
|
||||
|
||||
if (panel.visibility != View.VISIBLE) return
|
||||
|
||||
panel.animate()
|
||||
.translationX(panel.width.toFloat())
|
||||
.setDuration(250)
|
||||
.withEndAction { panel.visibility = View.GONE }
|
||||
.start()
|
||||
|
||||
overlay.animate()
|
||||
.alpha(0f)
|
||||
.setDuration(250)
|
||||
.withEndAction { overlay.visibility = View.GONE }
|
||||
.start()
|
||||
}
|
||||
|
||||
override fun onBackPressed() {
|
||||
if (viewModel.filterVisible.value == true) {
|
||||
viewModel.closeFilter()
|
||||
} else {
|
||||
super.onBackPressed()
|
||||
}
|
||||
}
|
||||
|
||||
companion object {
|
||||
@JvmStatic
|
||||
fun start(context: Context) {
|
||||
|
||||
Reference in New Issue
Block a user