沉浸式状态栏

This commit is contained in:
renhaoting 2025-11-04 16:49:44 +08:00
parent 2fe723aead
commit 9264a8c8be
11 changed files with 83 additions and 85 deletions

View File

@ -5,6 +5,7 @@ import com.remax.visualnovel.entity.response.basenew.ResponseNew
import com.remax.visualnovel.entity.request.ParamActorList import com.remax.visualnovel.entity.request.ParamActorList
import com.remax.visualnovel.entity.request.ParamActorTag import com.remax.visualnovel.entity.request.ParamActorTag
import com.remax.visualnovel.entity.response.ActorBean import com.remax.visualnovel.entity.response.ActorBean
import com.remax.visualnovel.entity.response.ChatSound
import com.remax.visualnovel.widget.custom.ActorTag import com.remax.visualnovel.widget.custom.ActorTag
import retrofit2.http.Body import retrofit2.http.Body
import retrofit2.http.GET import retrofit2.http.GET
@ -19,5 +20,7 @@ interface ActorsService {
suspend fun requestActorList(@Body param: ParamActorList): ResponseNew<List<ActorBean>> suspend fun requestActorList(@Body param: ParamActorList): ResponseNew<List<ActorBean>>
@GET(BuildConfig.API_BASE + "/tts/config/select/list")
suspend fun requestSoundList(): ResponseNew<List<ChatSound>>
} }

View File

@ -4,5 +4,5 @@ package com.remax.visualnovel.entity.request
data class ParamActorList( data class ParamActorList(
var index: Int = 0, var index: Int = 0,
var limit: Int = 5, var limit: Int = 5,
var tagIds: List<Long> = listOf<Long>(), var tagIds: MutableList<Int> = mutableListOf<Int>(),
) )

View File

@ -54,10 +54,6 @@ class ChatActivity : BaseBindingActivity<ActivityActorChatBinding>() {
override fun initView() { override fun initView() {
/*ARouter.getInstance().inject(this)
StatusBarUtils.setStatusBarAndNavBarIsLight(this, false)
StatusBarUtils.setTransparent(this)
StatusBarUtil2.initImmersive(this, lightStatusBar = true) */
StatusBarUtil3.setImmersiveStatusBar(this, true) StatusBarUtil3.setImmersiveStatusBar(this, true)
binding.toolbar.addRightIcon(R.mipmap.chat_title_setting) { binding.toolbar.addRightIcon(R.mipmap.chat_title_setting) {
binding.drawerMenu.openDrawer(GravityCompat.END) binding.drawerMenu.openDrawer(GravityCompat.END)

View File

@ -17,12 +17,10 @@ import com.remax.visualnovel.event.model.tab.ContactTab
import com.remax.visualnovel.event.model.tab.MainTab import com.remax.visualnovel.event.model.tab.MainTab
import com.remax.visualnovel.event.model.tab.OnTabChangedEvent import com.remax.visualnovel.event.model.tab.OnTabChangedEvent
import com.remax.visualnovel.extension.launchWithRequest import com.remax.visualnovel.extension.launchWithRequest
import com.remax.visualnovel.extension.setMargin
import com.remax.visualnovel.extension.setOnClick import com.remax.visualnovel.extension.setOnClick
import com.remax.visualnovel.extension.toast import com.remax.visualnovel.extension.toast
import com.remax.visualnovel.manager.login.LoginManager import com.remax.visualnovel.manager.login.LoginManager
import com.remax.visualnovel.utils.Routers import com.remax.visualnovel.utils.Routers
import com.remax.visualnovel.utils.StatusBarUtils
import com.hjq.permissions.XXPermissions import com.hjq.permissions.XXPermissions
import com.hjq.permissions.permission.PermissionLists import com.hjq.permissions.permission.PermissionLists
import com.pengxr.modular.eventbus.generated.events.EventDefineOfUIEvents import com.pengxr.modular.eventbus.generated.events.EventDefineOfUIEvents
@ -31,6 +29,7 @@ import com.remax.visualnovel.ui.main.actor.ActorListFragment
import com.remax.visualnovel.ui.main.book.BookListFragment import com.remax.visualnovel.ui.main.book.BookListFragment
import com.remax.visualnovel.ui.main.history.HistoryFragment import com.remax.visualnovel.ui.main.history.HistoryFragment
import com.remax.visualnovel.ui.main.managa.MangaListFragment import com.remax.visualnovel.ui.main.managa.MangaListFragment
import com.remax.visualnovel.utils.StatusBarUtil3
import dagger.hilt.android.AndroidEntryPoint import dagger.hilt.android.AndroidEntryPoint
@ -44,10 +43,9 @@ class MainActivity : BaseBindingActivity<ActivityMainBinding>() {
override fun initView() { override fun initView() {
ImmersionBar.with(this) ImmersionBar.with(this)
.transparentStatusBar() .transparentStatusBar()
.statusBarColor(R.color.transparent) .init()
.statusBarDarkFont(true) StatusBarUtil3.setImmersiveStatusBar(this, false)
.fitsSystemWindows(true)
.init();
onBackPressedDispatcher.addCallback(this) { onBackPressedDispatcher.addCallback(this) {
if (mainViewModel.canBack) { if (mainViewModel.canBack) {
@ -60,8 +58,6 @@ class MainActivity : BaseBindingActivity<ActivityMainBinding>() {
with(binding) { with(binding) {
with(viewPager2) { with(viewPager2) {
setMargin(topMargin = StatusBarUtils.statusBarHeight)
val fragments = listOf( val fragments = listOf(
BookListFragment.newInstance(), BookListFragment.newInstance(),
MangaListFragment.newInstance(), MangaListFragment.newInstance(),

View File

@ -2,8 +2,6 @@ package com.remax.visualnovel.ui.main.actor
import android.os.Bundle import android.os.Bundle
import android.util.Log
import android.widget.Toast
import androidx.fragment.app.viewModels import androidx.fragment.app.viewModels
import androidx.recyclerview.widget.DefaultItemAnimator import androidx.recyclerview.widget.DefaultItemAnimator
import androidx.recyclerview.widget.StaggeredGridLayoutManager import androidx.recyclerview.widget.StaggeredGridLayoutManager
@ -21,7 +19,6 @@ import com.remax.visualnovel.entity.response.ActorBean
import com.remax.visualnovel.extension.launchAndCollect2 import com.remax.visualnovel.extension.launchAndCollect2
import com.remax.visualnovel.utils.Routers import com.remax.visualnovel.utils.Routers
import com.remax.visualnovel.utils.StatusBarUtil3 import com.remax.visualnovel.utils.StatusBarUtil3
import com.remax.visualnovel.widget.custom.ActorTag
import dagger.hilt.android.AndroidEntryPoint import dagger.hilt.android.AndroidEntryPoint
import kotlin.getValue import kotlin.getValue
import kotlin.math.max import kotlin.math.max
@ -52,13 +49,8 @@ class ActorListFragment : BaseBindingFragment<FragmentMainActorBinding>() {
} }
private fun setUI() { private fun setUI() {
with(binding.root) { with (binding.toolbar) {
setPadding( setPadding(paddingLeft, paddingTop + StatusBarUtil3.getStatusBarHeight(context), paddingRight, paddingBottom)
paddingLeft,
paddingTop + StatusBarUtil3.getStatusBarHeight(context),
paddingRight,
paddingBottom
)
} }
initTagLayout() initTagLayout()
@ -105,12 +97,10 @@ class ActorListFragment : BaseBindingFragment<FragmentMainActorBinding>() {
tagFlowLayout.setTagDataList(tags) tagFlowLayout.setTagDataList(tags)
*/ */
tagFlowLayout.setOnTagClickListener { tag -> tagFlowLayout.setOnSelectedTagsChangedListener { selectedTagIdList: List<Int> ->
Toast.makeText(context, "Clicked: ${tag.name}", Toast.LENGTH_SHORT).show() mRequestParam.tagIds.clear()
} mRequestParam.tagIds.addAll(selectedTagIdList)
getActorList(true, false)
tagFlowLayout.setOnExpandStateChangeListener { isExpanded ->
Log.d("TagFlowLayout", "Expand state: $isExpanded")
} }
} }
} }

View File

@ -5,6 +5,7 @@ import androidx.fragment.app.viewModels
import com.alibaba.android.arouter.facade.annotation.Route import com.alibaba.android.arouter.facade.annotation.Route
import com.alibaba.android.arouter.launcher.ARouter import com.alibaba.android.arouter.launcher.ARouter
import com.dylanc.loadingstateview.BgColorType import com.dylanc.loadingstateview.BgColorType
import com.gyf.immersionbar.ImmersionBar
import com.remax.visualnovel.app.base.BaseBindingFragment import com.remax.visualnovel.app.base.BaseBindingFragment
import com.remax.visualnovel.databinding.FragmentMainBookBinding import com.remax.visualnovel.databinding.FragmentMainBookBinding
import com.remax.visualnovel.utils.Routers import com.remax.visualnovel.utils.Routers
@ -29,13 +30,8 @@ class BookListFragment : BaseBindingFragment<FragmentMainBookBinding>() {
} }
private fun setUI() { private fun setUI() {
with(binding.root) { with (binding.toolbar) {
setPadding( setPadding(paddingLeft, paddingTop + StatusBarUtil3.getStatusBarHeight(context), paddingRight, paddingBottom)
paddingLeft,
paddingTop + StatusBarUtil3.getStatusBarHeight(context),
paddingRight,
paddingBottom
)
} }
} }

View File

@ -5,6 +5,7 @@ import androidx.fragment.app.viewModels
import com.alibaba.android.arouter.facade.annotation.Route import com.alibaba.android.arouter.facade.annotation.Route
import com.alibaba.android.arouter.launcher.ARouter import com.alibaba.android.arouter.launcher.ARouter
import com.dylanc.loadingstateview.BgColorType import com.dylanc.loadingstateview.BgColorType
import com.gyf.immersionbar.ImmersionBar
import com.remax.visualnovel.app.base.BaseBindingFragment import com.remax.visualnovel.app.base.BaseBindingFragment
import com.remax.visualnovel.databinding.FragmentMainHistoryBinding import com.remax.visualnovel.databinding.FragmentMainHistoryBinding
import com.remax.visualnovel.utils.Routers import com.remax.visualnovel.utils.Routers
@ -18,7 +19,7 @@ import kotlin.getValue
@Route(path = Routers.ROUTE_FRAG_HISTORY) @Route(path = Routers.ROUTE_FRAG_HISTORY)
class HistoryFragment : BaseBindingFragment<FragmentMainHistoryBinding>() { class HistoryFragment : BaseBindingFragment<FragmentMainHistoryBinding>() {
private val contactViewModel by viewModels<HistoryViewModel>() private val mViewModel by viewModels<HistoryViewModel>()
override fun onCreated(bundle: Bundle?) { override fun onCreated(bundle: Bundle?) {
setUI() setUI()
@ -29,13 +30,8 @@ class HistoryFragment : BaseBindingFragment<FragmentMainHistoryBinding>() {
} }
private fun setUI() { private fun setUI() {
with(binding.root) { with (binding.toolbar) {
setPadding( setPadding(paddingLeft, paddingTop + StatusBarUtil3.getStatusBarHeight(context), paddingRight, paddingBottom)
paddingLeft,
paddingTop + StatusBarUtil3.getStatusBarHeight(context),
paddingRight,
paddingBottom
)
} }
} }

View File

@ -5,6 +5,7 @@ import androidx.fragment.app.viewModels
import com.alibaba.android.arouter.facade.annotation.Route import com.alibaba.android.arouter.facade.annotation.Route
import com.alibaba.android.arouter.launcher.ARouter import com.alibaba.android.arouter.launcher.ARouter
import com.dylanc.loadingstateview.BgColorType import com.dylanc.loadingstateview.BgColorType
import com.gyf.immersionbar.ImmersionBar
import com.remax.visualnovel.app.base.BaseBindingFragment import com.remax.visualnovel.app.base.BaseBindingFragment
import com.remax.visualnovel.databinding.FragmentMainMangaBinding import com.remax.visualnovel.databinding.FragmentMainMangaBinding
import com.remax.visualnovel.utils.Routers import com.remax.visualnovel.utils.Routers
@ -18,7 +19,7 @@ import kotlin.getValue
@Route(path = Routers.ROUTE_FRAG_MANGALIST) @Route(path = Routers.ROUTE_FRAG_MANGALIST)
class MangaListFragment : BaseBindingFragment<FragmentMainMangaBinding>() { class MangaListFragment : BaseBindingFragment<FragmentMainMangaBinding>() {
private val contactViewModel by viewModels<MangaListViewModel>() private val mViewModel by viewModels<MangaListViewModel>()
override fun onCreated(bundle: Bundle?) { override fun onCreated(bundle: Bundle?) {
setUI() setUI()
@ -29,13 +30,12 @@ class MangaListFragment : BaseBindingFragment<FragmentMainMangaBinding>() {
} }
private fun setUI() { private fun setUI() {
with(binding.root) { with (binding.toolbar) {
setPadding( setPadding(paddingLeft, paddingTop + StatusBarUtil3.getStatusBarHeight(context), paddingRight, paddingBottom)
paddingLeft, }
paddingTop + StatusBarUtil3.getStatusBarHeight(context),
paddingRight, with(binding) {
paddingBottom
)
} }
} }

View File

@ -13,10 +13,10 @@ import androidx.appcompat.widget.AppCompatImageView
import androidx.core.content.ContextCompat import androidx.core.content.ContextCompat
import com.remax.visualnovel.R import com.remax.visualnovel.R
import com.remax.visualnovel.extension.dpToPx import com.remax.visualnovel.extension.dpToPx
import com.remax.visualnovel.extension.spToPx
import kotlin.math.max import kotlin.math.max
import kotlin.math.min import kotlin.math.min
import androidx.core.content.withStyledAttributes import androidx.core.content.withStyledAttributes
import com.remax.visualnovel.utils.ResUtil
import kotlin.collections.mutableListOf import kotlin.collections.mutableListOf
class TagFlowLayout2 @JvmOverloads constructor( class TagFlowLayout2 @JvmOverloads constructor(
@ -26,11 +26,11 @@ class TagFlowLayout2 @JvmOverloads constructor(
) : ViewGroup(context, attrs, defStyleAttr) { ) : ViewGroup(context, attrs, defStyleAttr) {
// 属性变量 // 属性变量
private var horizontalSpacing = 10f.dpToPx() private var horizontalSpacing = ResUtil.getPixelSize(R.dimen.dp_10).toFloat()
private var verticalSpacing = 8f.dpToPx() private var verticalSpacing = ResUtil.getPixelSize(R.dimen.dp_8).toFloat()
private var textSize = 12f.spToPx() private var textSize = ResUtil.getPixelSize(R.dimen.dp_12).toFloat()
private var textColor = context.resources.getColor(R.color.tag_text_color) private var textColor = ResUtil.getColor(R.color.tag_text_color)
private var textColorSelected = context.resources.getColor(R.color.white) private var textColorSelected = ResUtil.getColor(R.color.white)
private var tagBackground: Drawable? = null private var tagBackground: Drawable? = null
private var maxLinesWhileShrink = 1 private var maxLinesWhileShrink = 1
private var eachLineMaxTagNum = 2 private var eachLineMaxTagNum = 2
@ -39,19 +39,19 @@ class TagFlowLayout2 @JvmOverloads constructor(
// 状态变量 // 状态变量
private var isExpanded = false private var isExpanded = true // TODO- enable this as true if wanna default state is collapse
private var actualLineCount = 0 private var actualLineCount = 0
private var showExpandButton = false private var showExpandButton = false
private var eachLineAvailableWidth = 0 private var eachLineAvailableWidth = 0
// 数据 // 数据
private val tagItems = mutableListOf<ActorTag>() private val mTagDataList = mutableListOf<ActorTag>()
private val tagViews = mutableListOf<TextView>() private val tagViews = mutableListOf<TextView>()
private lateinit var expandIcon: ImageView private lateinit var expandIcon: ImageView
// 监听器 // 监听器
private var onTagClickListener: ((ActorTag) -> Unit)? = null private var onSelectedTagsChanged: ((List<Int>) -> Unit)? = null
private var onExpandStateChangeListener: ((Boolean) -> Unit)? = null
init { init {
initAttributes(attrs) initAttributes(attrs)
@ -110,23 +110,25 @@ class TagFlowLayout2 @JvmOverloads constructor(
} }
} }
addView(expandIcon) addView(expandIcon)
expandIcon.bringToFront()
updateExpandButton() updateExpandButton()
} }
fun setTagDataList(tags: List<ActorTag>) { fun setTagDataList(tags: List<ActorTag>) {
tagItems.clear() mTagDataList.clear()
tagViews.forEach { removeView(it) } tagViews.forEach { removeView(it) }
tagViews.clear() tagViews.clear()
tagItems.addAll(tags) mTagDataList.addAll(tags)
tags.forEach { tag -> tags.forEach { tag ->
val textView = createTagView(tag) val textView = createTagView(tag)
tagViews.add(textView) tagViews.add(textView)
addView(textView) addView(textView)
} }
expandIcon.bringToFront()
requestLayout() requestLayout()
} }
@ -135,7 +137,7 @@ class TagFlowLayout2 @JvmOverloads constructor(
text = tag.name text = tag.name
setTextColor(textColor) setTextColor(textColor)
textSize = textSize / resources.displayMetrics.scaledDensity textSize = textSize / resources.displayMetrics.scaledDensity
setPadding(10.dpToPx(), 7.dpToPx(), 10.dpToPx(), 7.dpToPx()) setPadding(10.dpToPx(), 5.dpToPx(), 10.dpToPx(), 5.dpToPx())
setBackgroundResource(R.drawable.tag_flow_item_bg) setBackgroundResource(R.drawable.tag_flow_item_bg)
isSingleLine = true isSingleLine = true
ellipsize = TextUtils.TruncateAt.END ellipsize = TextUtils.TruncateAt.END
@ -143,14 +145,17 @@ class TagFlowLayout2 @JvmOverloads constructor(
includeFontPadding = false includeFontPadding = false
setOnClickListener { setOnClickListener {
onTagClickListener?.invoke(tag)
with(tag) { with(tag) {
isSelected = !isSelected isSelected = !isSelected
} }
setTextColor(if (tag.isSelected) textColorSelected else textColor) setTextColor(if (tag.isSelected) textColorSelected else textColor)
setBackgroundResource(if (tag.isSelected) R.drawable.tag_flow_item_bg_selected else R.drawable.tag_flow_item_bg) setBackgroundResource(if (tag.isSelected) R.drawable.tag_flow_item_bg_selected else R.drawable.tag_flow_item_bg)
requestLayout() requestLayout()
onSelectedTagsChanged?.invoke(
mTagDataList
.filter { it.isSelected }
.map { it.id })
} }
} }
} }
@ -290,7 +295,6 @@ class TagFlowLayout2 @JvmOverloads constructor(
isExpanded = !isExpanded isExpanded = !isExpanded
updateExpandButton() updateExpandButton()
requestLayout() requestLayout()
onExpandStateChangeListener?.invoke(isExpanded)
} }
private fun updateExpandButton() { private fun updateExpandButton() {
@ -298,13 +302,10 @@ class TagFlowLayout2 @JvmOverloads constructor(
expandIcon.setImageDrawable(indicator) expandIcon.setImageDrawable(indicator)
} }
fun setOnTagClickListener(listener: (ActorTag) -> Unit) { fun setOnSelectedTagsChangedListener(listener: (List<Int>) -> Unit) {
onTagClickListener = listener onSelectedTagsChanged = listener
} }
fun setOnExpandStateChangeListener(listener: (Boolean) -> Unit) {
onExpandStateChangeListener = listener
}
fun expand() { fun expand() {
if (!isExpanded) { if (!isExpanded) {
@ -327,7 +328,7 @@ class TagFlowLayout2 @JvmOverloads constructor(
} }
fun getSelectedTagList() : List<ActorTag> { fun getSelectedTagList() : List<ActorTag> {
return tagItems.filter { it.isSelected } return mTagDataList.filter { it.isSelected }
} }

View File

@ -5,13 +5,14 @@
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent"
android:fitsSystemWindows="false" android:fitsSystemWindows="false"
android:background="@mipmap/bg_level_1_page"
android:orientation="vertical"> android:orientation="vertical">
<androidx.viewpager2.widget.ViewPager2 <androidx.viewpager2.widget.ViewPager2
android:id="@+id/viewPager2" android:id="@+id/viewPager2"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="0dp" android:layout_height="0dp"
android:layout_weight="1"
app:layout_constraintBottom_toTopOf="@+id/bottomLayout" app:layout_constraintBottom_toTopOf="@+id/bottomLayout"
app:layout_constraintTop_toTopOf="parent"/> app:layout_constraintTop_toTopOf="parent"/>
@ -26,8 +27,8 @@
<androidx.appcompat.widget.AppCompatImageView <androidx.appcompat.widget.AppCompatImageView
android:id="@+id/bookItem" android:id="@+id/bookItem"
android:layout_width="32dp" android:layout_width="@dimen/dp_32"
android:layout_height="32dp" android:layout_height="@dimen/dp_32"
android:src="@mipmap/main_tab_book_on" android:src="@mipmap/main_tab_book_on"
app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toStartOf="@+id/mangaItem" app:layout_constraintEnd_toStartOf="@+id/mangaItem"
@ -36,8 +37,8 @@
<androidx.appcompat.widget.AppCompatImageView <androidx.appcompat.widget.AppCompatImageView
android:id="@+id/mangaItem" android:id="@+id/mangaItem"
android:layout_width="32dp" android:layout_width="@dimen/dp_32"
android:layout_height="32dp" android:layout_height="@dimen/dp_32"
android:src="@mipmap/main_tab_manga_off" android:src="@mipmap/main_tab_manga_off"
app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toStartOf="@+id/actorItem" app:layout_constraintEnd_toStartOf="@+id/actorItem"
@ -46,8 +47,8 @@
<androidx.appcompat.widget.AppCompatImageView <androidx.appcompat.widget.AppCompatImageView
android:id="@+id/actorItem" android:id="@+id/actorItem"
android:layout_width="32dp" android:layout_width="@dimen/dp_32"
android:layout_height="32dp" android:layout_height="@dimen/dp_32"
android:src="@mipmap/main_tab_actor_off" android:src="@mipmap/main_tab_actor_off"
app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toStartOf="@+id/historyItem" app:layout_constraintEnd_toStartOf="@+id/historyItem"
@ -56,8 +57,8 @@
<androidx.appcompat.widget.AppCompatImageView <androidx.appcompat.widget.AppCompatImageView
android:id="@+id/historyItem" android:id="@+id/historyItem"
android:layout_width="32dp" android:layout_width="@dimen/dp_32"
android:layout_height="32dp" android:layout_height="@dimen/dp_32"
android:src="@mipmap/main_tab_history_off" android:src="@mipmap/main_tab_history_off"
app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent" app:layout_constraintEnd_toEndOf="parent"

View File

@ -1564,4 +1564,23 @@
</declare-styleable> </declare-styleable>
<!--历史fragment顶部 tab-->
<declare-styleable name="CustomTabLayout">
<attr name="tabBackground" format="reference" />
<attr name="tabCornerRadius" format="dimension" />
<attr name="selectedTabBackground" format="reference" />
<attr name="textColorNormal" format="color" />
<attr name="textColorSelected" format="color" />
<attr name="textSize" format="dimension" />
<attr name="iconSize" format="dimension" />
<attr name="animDuration" format="integer" />
<attr name="tabSpacing" format="dimension" />
</declare-styleable>
<declare-styleable name="TabItem">
<attr name="tabText" format="string" />
<attr name="tabIcon" format="reference" />
</declare-styleable>
</resources> </resources>