sound 模块 RadioGroup Ui 调整

This commit is contained in:
renhaoting 2025-10-30 19:35:26 +08:00
parent 35481519c5
commit d9ca052d8e
14 changed files with 153 additions and 40 deletions

View File

@ -117,7 +117,7 @@ class ChatSettingView @JvmOverloads constructor(
id = 2L, id = 2L,
name = "Sound-2", name = "Sound-2",
description = "This is description for sound-2", description = "This is description for sound-2",
isMale = true, isMale = false,
imgUrl = "" imgUrl = ""
), ),
@ -133,7 +133,7 @@ class ChatSettingView @JvmOverloads constructor(
id = 4L, id = 4L,
name = "Sound-4", name = "Sound-4",
description = "This is description for sound-4", description = "This is description for sound-4",
isMale = true, isMale = false,
imgUrl = "" imgUrl = ""
), ),

View File

@ -20,6 +20,8 @@ class FontSetView @JvmOverloads constructor(
private var mBinding: LayoutFontSetViewBinding private var mBinding: LayoutFontSetViewBinding
private var mFontValue = 16 // 12, 14, 16, 18, 20 private var mFontValue = 16 // 12, 14, 16, 18, 20
private val mFontMinValue = 16
private val mFontMaxValue = 20
init { init {
mBinding = LayoutFontSetViewBinding.inflate(LayoutInflater.from(context), this, true) mBinding = LayoutFontSetViewBinding.inflate(LayoutInflater.from(context), this, true)
@ -32,13 +34,17 @@ class FontSetView @JvmOverloads constructor(
private fun setupClickListeners() { private fun setupClickListeners() {
with (mBinding) { with (mBinding) {
ivFontPlus.setOnClickListener { ivFontPlus.setOnClickListener {
mFontValue -= GAP if (mFontValue > mFontMinValue) {
mFontValue -= GAP
}
tvFontValue.text = mFontValue.toString() tvFontValue.text = mFontValue.toString()
levelSeekbar.setLevel((mFontValue - 16)/GAP) levelSeekbar.setLevel((mFontValue - 16)/GAP)
} }
ivFontAdd.setOnClickListener { ivFontAdd.setOnClickListener {
mFontValue += GAP if (mFontValue < mFontMinValue) {
mFontValue += GAP
}
tvFontValue.text = mFontValue.toString() tvFontValue.text = mFontValue.toString()
levelSeekbar.setLevel((mFontValue - 16)/GAP) levelSeekbar.setLevel((mFontValue - 16)/GAP)
} }
@ -50,6 +56,12 @@ class FontSetView @JvmOverloads constructor(
fromUser: Boolean fromUser: Boolean
) { ) {
mFontValue = 16 + level * GAP mFontValue = 16 + level * GAP
if (mFontValue > mFontMaxValue) {
mFontValue = mFontMaxValue
}
if (mFontValue < mFontMinValue) {
mFontValue = mFontMinValue
}
tvFontValue.text = mFontValue.toString() tvFontValue.text = mFontValue.toString()
} }

View File

@ -110,7 +110,7 @@ class LevelSeekBar @JvmOverloads constructor(
} }
private fun drawTrack(canvas: Canvas) { private fun drawTrack(canvas: Canvas) {
val centerY = height / 2f val centerY = height / 2f + 3 // TODO check y location
val trackTop = centerY - trackHeight / 2 val trackTop = centerY - trackHeight / 2
val trackBottom = centerY + trackHeight / 2 val trackBottom = centerY + trackHeight / 2

View File

@ -46,7 +46,7 @@ class ExpandBubbleSubView @JvmOverloads constructor(
}.setup { }.setup {
addType<ChatBubble>(R.layout.layout_item_setting_bubble) addType<ChatBubble>(R.layout.layout_item_setting_bubble)
onClick(R.id.tv_select) { onClick(R.id.iv_select) {
val bubble = getModel<ChatBubble>() val bubble = getModel<ChatBubble>()
if (!bubble.select) { if (!bubble.select) {
itemsRv.bindingAdapter.models?.filterIsInstance<ChatBubble>()?.forEach { item -> itemsRv.bindingAdapter.models?.filterIsInstance<ChatBubble>()?.forEach { item ->

View File

@ -5,18 +5,15 @@ import android.animation.AnimatorListenerAdapter
import android.animation.ObjectAnimator import android.animation.ObjectAnimator
import android.animation.ValueAnimator import android.animation.ValueAnimator
import android.content.Context import android.content.Context
import android.graphics.drawable.GradientDrawable
import android.util.AttributeSet import android.util.AttributeSet
import android.view.LayoutInflater import android.view.LayoutInflater
import android.view.View import android.view.View
import android.view.animation.AccelerateDecelerateInterpolator import android.view.animation.AccelerateDecelerateInterpolator
import android.widget.LinearLayout import android.widget.LinearLayout
import android.widget.TextView
import com.remax.visualnovel.R import com.remax.visualnovel.R
import com.remax.visualnovel.databinding.LayoutExpandSelectViewBinding import com.remax.visualnovel.databinding.LayoutExpandSelectViewBinding
import com.remax.visualnovel.databinding.LayoutSettingSoundSubViewBinding
import com.remax.visualnovel.entity.response.ChatSound import com.remax.visualnovel.entity.response.ChatSound
import com.remax.visualnovel.utils.spannablex.utils.dp
class ExpandSoundSelectView @JvmOverloads constructor( class ExpandSoundSelectView @JvmOverloads constructor(
@ -43,6 +40,12 @@ class ExpandSoundSelectView @JvmOverloads constructor(
setTitleText(R.string.title_sound_actor) setTitleText(R.string.title_sound_actor)
setTitleIcon(R.mipmap.setting_sound_icon) setTitleIcon(R.mipmap.setting_sound_icon)
setupClickListeners() setupClickListeners()
mExpandView.setEventListener(object: ExpandSoundSubView.IEventListener {
override fun onSoundSelected(sound: ChatSound) {
setTitleText(sound.name)
}
})
} }
private fun setupClickListeners() { private fun setupClickListeners() {
@ -58,6 +61,10 @@ class ExpandSoundSelectView @JvmOverloads constructor(
mBinding.titleText.text = context.resources.getString(titleRes) mBinding.titleText.text = context.resources.getString(titleRes)
} }
fun setTitleText(title: String) {
mBinding.titleText.text = title
}
fun setItems(newItems: List<ChatSound>) { fun setItems(newItems: List<ChatSound>) {
mExpandView.setItems(newItems) mExpandView.setItems(newItems)
} }

View File

@ -8,7 +8,6 @@ import androidx.recyclerview.widget.RecyclerView
import com.drake.brv.annotaion.DividerOrientation import com.drake.brv.annotaion.DividerOrientation
import com.drake.brv.utils.bindingAdapter import com.drake.brv.utils.bindingAdapter
import com.drake.brv.utils.divider import com.drake.brv.utils.divider
import com.drake.brv.utils.grid
import com.drake.brv.utils.linear import com.drake.brv.utils.linear
import com.drake.brv.utils.models import com.drake.brv.utils.models
import com.drake.brv.utils.setup import com.drake.brv.utils.setup
@ -17,7 +16,8 @@ import com.remax.visualnovel.databinding.LayoutItemSettingSoundBinding
import com.remax.visualnovel.databinding.LayoutSettingSoundSubViewBinding import com.remax.visualnovel.databinding.LayoutSettingSoundSubViewBinding
import com.remax.visualnovel.entity.response.ChatSound import com.remax.visualnovel.entity.response.ChatSound
import com.remax.visualnovel.extension.glide.load import com.remax.visualnovel.extension.glide.load
import com.remax.visualnovel.widget.uitoken.changeBackground import com.remax.visualnovel.utils.ResUtil
import com.remax.visualnovel.widget.uitoken.setBgColorDirectly
import com.remax.visualnovel.widget.uitoken.view.UITokenLinearLayout import com.remax.visualnovel.widget.uitoken.view.UITokenLinearLayout
class ExpandSoundSubView @JvmOverloads constructor( class ExpandSoundSubView @JvmOverloads constructor(
@ -28,6 +28,13 @@ class ExpandSoundSubView @JvmOverloads constructor(
private lateinit var items: List<ChatSound> private lateinit var items: List<ChatSound>
private var mBinding: LayoutSettingSoundSubViewBinding private var mBinding: LayoutSettingSoundSubViewBinding
private lateinit var mEventListener: IEventListener
interface IEventListener {
fun onSoundSelected(sound: ChatSound)
}
init { init {
mBinding = LayoutSettingSoundSubViewBinding.inflate(LayoutInflater.from(context), this, true) mBinding = LayoutSettingSoundSubViewBinding.inflate(LayoutInflater.from(context), this, true)
@ -45,14 +52,15 @@ class ExpandSoundSubView @JvmOverloads constructor(
} }
fun setSelectedSound() {
fun setEventListener(eventListener: IEventListener) {
mEventListener = eventListener
} }
private fun initRv(itemsRv: RecyclerView) { private fun initRv(itemsRv: RecyclerView) {
itemsRv.linear(VERTICAL) itemsRv.linear(VERTICAL)
.divider { .divider {
setDivider(16, true) setDivider(5, true)
orientation = DividerOrientation.VERTICAL orientation = DividerOrientation.VERTICAL
}.setup { }.setup {
addType<ChatSound>(R.layout.layout_item_setting_sound) addType<ChatSound>(R.layout.layout_item_setting_sound)
@ -62,14 +70,14 @@ class ExpandSoundSubView @JvmOverloads constructor(
playActorSound(bubble) playActorSound(bubble)
} }
onClick(R.id.tv_select) { onClick(R.id.item_root) {
val bubble = getModel<ChatSound>() val sound = getModel<ChatSound>()
if (!bubble.select) { if (!sound.select) {
itemsRv.bindingAdapter.models?.filterIsInstance<ChatSound>()?.forEach { item -> itemsRv.bindingAdapter.models?.filterIsInstance<ChatSound>()?.forEach { item ->
item.select = item == bubble item.select = item == sound
} }
itemsRv.bindingAdapter.notifyDataSetChanged() itemsRv.bindingAdapter.notifyDataSetChanged()
setSelectedSound() mEventListener.onSoundSelected(sound)
} }
} }
@ -83,9 +91,10 @@ class ExpandSoundSubView @JvmOverloads constructor(
} }
tvSoundName.text = item.name tvSoundName.text = item.name
itemRoot.changeBackground(backgroundUIColorToken = if (item.isMale) R.string.male_bg else R.string.female_bg) itemRoot.setBgColorDirectly(bgColor = if (item.isMale) R.color.male_bg else R.color.female_bg, radius = ResUtil.getPixelSize(R.dimen.dp_10).toFloat())
tvSoundDescrible.setTextColor(context.resources.getColor(if (item.isMale) R.color.male_text_color else R.color.female_text_color)) tvSoundDescrible.setTextColor(ResUtil.getColor(if (item.isMale) R.color.male_text_color else R.color.female_text_color))
tvSoundDescrible.text = item.description tvSoundDescrible.text = item.description
ivSelect.setImageResource(if (item.select) R.drawable.sound_item_selected else R.drawable.sound_item_unselected)
} }
} }
} }

View File

@ -0,0 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<!-- 选中状态 -->
<item android:drawable="@drawable/radio_checked" android:state_checked="true" />
<!-- 未选中状态 -->
<item android:drawable="@drawable/radio_unchecked" android:state_checked="false" />
</selector>

View File

@ -0,0 +1,8 @@
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="oval">
<solid android:color="@android:color/white" />
<size
android:width="@dimen/dp_10"
android:height="@dimen/dp_10" />
</shape>

View File

@ -0,0 +1,12 @@
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<!-- 外层彩色圆环 -->
<item>
<shape android:shape="oval">
<solid android:color="@color/transparent" />
<size android:width="@dimen/dp_10" android:height="@dimen/dp_10" />
<stroke android:color="@color/grayf6" android:width="@dimen/dp_2" />
</shape>
</item>
</layer-list>

View File

@ -0,0 +1,16 @@
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item>
<shape android:shape="oval">
<solid android:color="@color/black" />
<size android:width="@dimen/dp_13" android:height="@dimen/dp_13" />
</shape>
</item>
<item>
<shape android:shape="oval">
<size android:width="@dimen/dp_13" android:height="@dimen/dp_13" />
<stroke android:color="@color/glo_color_green_90" android:width="@dimen/dp_2" />
</shape>
</item>
</layer-list>

View File

@ -0,0 +1,10 @@
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item>
<shape android:shape="oval">
<solid android:color="@color/black" />
<size android:width="@dimen/dp_13" android:height="@dimen/dp_13" />
</shape>
</item>
</layer-list>

View File

@ -4,9 +4,9 @@
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:id="@+id/item_root" android:id="@+id/item_root"
app:backgroundColorToken="@string/color_glo_color_orange_10"
app:radiusToken="@string/radius_m"
android:padding="@dimen/dp_10" android:padding="@dimen/dp_10"
app:advRadius="@dimen/dp_10"
app:advBgColor="@color/male_bg"
> >
@ -21,8 +21,8 @@
android:id="@+id/userAvatar" android:id="@+id/userAvatar"
android:layout_width="@dimen/dp_55" android:layout_width="@dimen/dp_55"
android:layout_height="@dimen/dp_55" android:layout_height="@dimen/dp_55"
app:backgroundColorToken="@string/color_primary_normal" app:advBgColor="@color/black"
app:radiusToken="@string/radius_round" /> app:advRadius="@dimen/dp_28" />
<com.remax.visualnovel.widget.uitoken.view.UITokenImageView <com.remax.visualnovel.widget.uitoken.view.UITokenImageView
android:layout_width="@dimen/dp_20" android:layout_width="@dimen/dp_20"
@ -36,20 +36,13 @@
</FrameLayout> </FrameLayout>
<com.remax.visualnovel.widget.uitoken.view.UITokenTextView <com.remax.visualnovel.widget.uitoken.view.UITokenImageView
android:id="@+id/tv_select" android:id="@+id/iv_select"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_alignParentEnd="true" android:layout_alignParentEnd="true"
android:layout_centerVertical="true" android:layout_centerVertical="true"
android:paddingVertical="@dimen/dp_8" android:src="@drawable/sound_item_selected"
android:paddingHorizontal="@dimen/dp_10"
android:text="@string/select"
android:textSize="@dimen/sp_12"
android:textStyle="bold"
app:backgroundColorToken="@string/color_txt_primary_normal"
app:radiusToken="@string/radius_pill"
android:textColor="@color/chat_setting_ai_model_recommend_color"
/> />
@ -58,7 +51,7 @@
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_toEndOf="@+id/left_container" android:layout_toEndOf="@+id/left_container"
android:layout_toStartOf="@+id/tv_select" android:layout_toStartOf="@+id/iv_select"
android:layout_marginHorizontal="@dimen/dp_9" android:layout_marginHorizontal="@dimen/dp_9"
android:layout_centerVertical="true" android:layout_centerVertical="true"
android:orientation="vertical" android:orientation="vertical"

View File

@ -12,12 +12,12 @@
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:gravity="center_vertical" android:gravity="center_vertical"
android:orientation="horizontal" android:orientation="horizontal"
app:backgroundColorToken="@string/color_chat_setting_item_bg" app:advRadius="@dimen/dp_12"
app:radiusToken="@string/radius_m" app:advBgColor="@color/chat_setting_sex_radio_bg"
android:padding="@dimen/dp_12" android:padding="@dimen/dp_12"
> >
<com.remax.visualnovel.widget.ui.RadioCheckButton <!--<com.remax.visualnovel.widget.ui.RadioCheckButton
android:id="@+id/radio_all" android:id="@+id/radio_all"
android:layout_width="16dp" android:layout_width="16dp"
android:layout_height="16dp" android:layout_height="16dp"
@ -35,7 +35,43 @@
android:layout_width="16dp" android:layout_width="16dp"
android:layout_height="16dp" android:layout_height="16dp"
android:layout_marginLeft="@dimen/dp_20" android:layout_marginLeft="@dimen/dp_20"
app:radioCheck="true" /> app:radioCheck="true" />-->
<RadioGroup
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<RadioButton
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/all"
android:button="@drawable/radio_button_selector"
android:paddingHorizontal="@dimen/dp_5"
android:textColor="@color/white"
android:checked="true"
/>
<RadioButton
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/male"
android:layout_marginLeft="10dp"
android:layout_marginRight="10dp"
android:paddingHorizontal="@dimen/dp_5"
android:button="@drawable/radio_button_selector"
android:textSize="@dimen/sp_13"
android:textColor="@color/white" />
<RadioButton
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/female"
android:paddingHorizontal="@dimen/dp_5"
android:button="@drawable/radio_button_selector"
android:textColor="@color/white"
/>
</RadioGroup>
</com.remax.visualnovel.widget.uitoken.view.UITokenLinearLayout> </com.remax.visualnovel.widget.uitoken.view.UITokenLinearLayout>

View File

@ -216,6 +216,9 @@
<!-- Font seekbar --> <!-- Font seekbar -->
<color name="seekbar_color">#ffa4a8b7</color> <color name="seekbar_color">#ffa4a8b7</color>
<color name="chat_setting_sex_radio_bg">#ff241e2f</color>