sound,bg,bubble 等其他expandView 初步
This commit is contained in:
parent
9b71247893
commit
64fdf6f4ac
|
|
@ -202,7 +202,14 @@
|
||||||
"color.chat.setting.item.bg": "$glo.color.chat.setting.item.bg",
|
"color.chat.setting.item.bg": "$glo.color.chat.setting.item.bg",
|
||||||
"color.switch.view.normal": "$glo.color.switchview.normal",
|
"color.switch.view.normal": "$glo.color.switchview.normal",
|
||||||
"color.switch.view.checked": "$glo.color.switchview.checked",
|
"color.switch.view.checked": "$glo.color.switchview.checked",
|
||||||
"color.switch.view.stroke": "$glo.color.switchview.stroke"
|
"color.switch.view.stroke": "$glo.color.switchview.stroke",
|
||||||
|
|
||||||
|
"female.text.color": "$female.text.color",
|
||||||
|
"male.text.color": "$male.text.color",
|
||||||
|
"female.bg": "$female.bg",
|
||||||
|
"male.bg": "$male.bg"
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -3,9 +3,7 @@ package com.remax.visualnovel.entity.response
|
||||||
import android.os.Parcelable
|
import android.os.Parcelable
|
||||||
import kotlinx.parcelize.Parcelize
|
import kotlinx.parcelize.Parcelize
|
||||||
|
|
||||||
/**
|
|
||||||
* Created by HJW on 2025/8/18
|
|
||||||
*/
|
|
||||||
@Parcelize
|
@Parcelize
|
||||||
data class ChatBubble(
|
data class ChatBubble(
|
||||||
/**
|
/**
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,60 @@
|
||||||
|
package com.remax.visualnovel.entity.response
|
||||||
|
|
||||||
|
import android.os.Parcelable
|
||||||
|
import kotlinx.parcelize.Parcelize
|
||||||
|
|
||||||
|
|
||||||
|
@Parcelize
|
||||||
|
data class ChatSound(
|
||||||
|
/**
|
||||||
|
* code
|
||||||
|
*/
|
||||||
|
val code: String,
|
||||||
|
|
||||||
|
/**
|
||||||
|
* id
|
||||||
|
*/
|
||||||
|
val id: Long,
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 图片url
|
||||||
|
*/
|
||||||
|
val imgUrl: String?,
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 名称
|
||||||
|
*/
|
||||||
|
val name: String,
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 名称
|
||||||
|
*/
|
||||||
|
val description: String,
|
||||||
|
|
||||||
|
/**
|
||||||
|
* actor 性别
|
||||||
|
*/
|
||||||
|
var isMale: Boolean,
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 当前用户是否解锁 false:未解锁,true:解锁
|
||||||
|
*/
|
||||||
|
val isUnlock: Boolean? = null,
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 解锁心动等级 类型为HEARTBEAT_LEVEL时才有用
|
||||||
|
*/
|
||||||
|
val unlockHeartbeatLevel: String? = null,
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 解锁类型 MEMBER:会员 HEARTBEAT_LEVEL:心动等级
|
||||||
|
*/
|
||||||
|
val unlockType: String? = null,
|
||||||
|
var isDefault: Boolean,
|
||||||
|
var select: Boolean = false
|
||||||
|
) : Parcelable {
|
||||||
|
companion object {
|
||||||
|
const val MEMBER = "MEMBER"
|
||||||
|
const val HEARTBEAT_LEVEL = "HEARTBEAT_LEVEL"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -1,35 +0,0 @@
|
||||||
package com.remax.visualnovel.ui.chat.ui
|
|
||||||
|
|
||||||
|
|
||||||
import android.content.Context
|
|
||||||
import android.util.AttributeSet
|
|
||||||
import android.view.LayoutInflater
|
|
||||||
import android.view.View
|
|
||||||
import android.widget.LinearLayout
|
|
||||||
import com.remax.visualnovel.databinding.ChatSettingItemBinding
|
|
||||||
|
|
||||||
class ChatSettingItemView @JvmOverloads constructor(
|
|
||||||
context: Context,
|
|
||||||
attrs: AttributeSet? = null,
|
|
||||||
defStyleAttr: Int = 0
|
|
||||||
) : LinearLayout(context, attrs, defStyleAttr) {
|
|
||||||
|
|
||||||
private var mLeftIconRes : Int = 0
|
|
||||||
private var mTitleRes : Int = 0
|
|
||||||
private var mRightIconRes : Int = 0
|
|
||||||
private lateinit var mRightView : View
|
|
||||||
|
|
||||||
private var mBinding = ChatSettingItemBinding.inflate(LayoutInflater.from(context))
|
|
||||||
|
|
||||||
|
|
||||||
fun setItemClickListener (clickHandler: () -> Unit) {
|
|
||||||
setOnClickListener {
|
|
||||||
clickHandler.invoke()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
fun setLeftIconRes (leftIconRes: Int) {
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
@ -0,0 +1,42 @@
|
||||||
|
package com.remax.visualnovel.ui.chat.ui.expandableSelector
|
||||||
|
|
||||||
|
import android.content.Context
|
||||||
|
import android.util.AttributeSet
|
||||||
|
import android.view.LayoutInflater
|
||||||
|
import android.widget.LinearLayout
|
||||||
|
import androidx.recyclerview.widget.RecyclerView
|
||||||
|
import com.drake.brv.annotaion.DividerOrientation
|
||||||
|
import com.drake.brv.utils.divider
|
||||||
|
import com.drake.brv.utils.grid
|
||||||
|
import com.drake.brv.utils.setup
|
||||||
|
import com.remax.visualnovel.databinding.LayoutSettingBgSubViewBinding
|
||||||
|
|
||||||
|
class ExpandBgSubView @JvmOverloads constructor(
|
||||||
|
context: Context,
|
||||||
|
attrs: AttributeSet? = null,
|
||||||
|
defStyleAttr: Int = 0
|
||||||
|
) : LinearLayout(context, attrs, defStyleAttr) {
|
||||||
|
|
||||||
|
private var mBinding: LayoutSettingBgSubViewBinding
|
||||||
|
|
||||||
|
|
||||||
|
init {
|
||||||
|
mBinding = LayoutSettingBgSubViewBinding.inflate(LayoutInflater.from(context))
|
||||||
|
with(mBinding) {
|
||||||
|
initRv(itemsRv)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
private fun initRv(itemsRv: RecyclerView) {
|
||||||
|
itemsRv.grid(2)
|
||||||
|
.divider {
|
||||||
|
setDivider(16, true)
|
||||||
|
orientation = DividerOrientation.VERTICAL
|
||||||
|
}.setup {
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,41 @@
|
||||||
|
package com.remax.visualnovel.ui.chat.ui.expandableSelector
|
||||||
|
|
||||||
|
import android.content.Context
|
||||||
|
import android.util.AttributeSet
|
||||||
|
import android.view.LayoutInflater
|
||||||
|
import android.widget.LinearLayout
|
||||||
|
import androidx.recyclerview.widget.RecyclerView
|
||||||
|
import com.drake.brv.annotaion.DividerOrientation
|
||||||
|
import com.drake.brv.utils.divider
|
||||||
|
import com.drake.brv.utils.grid
|
||||||
|
import com.drake.brv.utils.setup
|
||||||
|
import com.remax.visualnovel.databinding.LayoutSettingBubbleSubViewBinding
|
||||||
|
|
||||||
|
class ExpandBubbleSubView @JvmOverloads constructor(
|
||||||
|
context: Context,
|
||||||
|
attrs: AttributeSet? = null,
|
||||||
|
defStyleAttr: Int = 0
|
||||||
|
) : LinearLayout(context, attrs, defStyleAttr) {
|
||||||
|
|
||||||
|
private var mBinding: LayoutSettingBubbleSubViewBinding
|
||||||
|
|
||||||
|
|
||||||
|
init {
|
||||||
|
mBinding = LayoutSettingBubbleSubViewBinding.inflate(LayoutInflater.from(context))
|
||||||
|
with(mBinding) {
|
||||||
|
initRv(itemsRv)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun initRv(itemsRv: RecyclerView) {
|
||||||
|
itemsRv.grid(2)
|
||||||
|
.divider {
|
||||||
|
setDivider(16, true)
|
||||||
|
orientation = DividerOrientation.VERTICAL
|
||||||
|
}.setup {
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
@ -5,29 +5,25 @@ 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.ViewGroup
|
||||||
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.LayoutExpandSoundSelectViewBinding
|
||||||
import com.remax.visualnovel.utils.spannablex.utils.dp
|
|
||||||
|
|
||||||
|
|
||||||
class MaxNumView @JvmOverloads constructor(
|
class ExpandSoundSelectView @JvmOverloads constructor(
|
||||||
context: Context,
|
context: Context,
|
||||||
attrs: AttributeSet? = null,
|
attrs: AttributeSet? = null,
|
||||||
defStyleAttr: Int = 0
|
defStyleAttr: Int = 0
|
||||||
) : LinearLayout(context, attrs, defStyleAttr) {
|
) : LinearLayout(context, attrs, defStyleAttr) {
|
||||||
|
|
||||||
private lateinit var mBinding: LayoutExpandSelectViewBinding
|
private lateinit var mBinding: LayoutExpandSoundSelectViewBinding
|
||||||
|
|
||||||
private var isExpanded = false
|
private var isExpanded = false
|
||||||
private var animationDuration = 300
|
private var animationDuration = 300
|
||||||
private var items: List<SelectorItem> = emptyList()
|
|
||||||
private var itemSelectedListener: OnItemSelectedListener? = null
|
private var itemSelectedListener: OnItemSelectedListener? = null
|
||||||
|
|
||||||
init {
|
init {
|
||||||
|
|
@ -35,7 +31,7 @@ class MaxNumView @JvmOverloads constructor(
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun initView(context: Context, attrs: AttributeSet?) {
|
private fun initView(context: Context, attrs: AttributeSet?) {
|
||||||
mBinding = LayoutExpandSelectViewBinding.inflate(LayoutInflater.from(context), this, true)
|
mBinding = LayoutExpandSoundSelectViewBinding.inflate(LayoutInflater.from(context))
|
||||||
setupAttributes(attrs)
|
setupAttributes(attrs)
|
||||||
setupClickListeners()
|
setupClickListeners()
|
||||||
}
|
}
|
||||||
|
|
@ -63,76 +59,6 @@ class MaxNumView @JvmOverloads constructor(
|
||||||
mBinding.titleText.text = context.resources.getString(titleRes)
|
mBinding.titleText.text = context.resources.getString(titleRes)
|
||||||
}
|
}
|
||||||
|
|
||||||
fun setItems(newItems: List<SelectorItem>) {
|
|
||||||
items = newItems
|
|
||||||
updateItemsView()
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
private fun updateItemsView() {
|
|
||||||
mBinding.itemsContainer.removeAllViews()
|
|
||||||
|
|
||||||
items.forEachIndexed { index, item ->
|
|
||||||
val itemView = createItemView(item, index)
|
|
||||||
mBinding.itemsContainer.addView(itemView)
|
|
||||||
|
|
||||||
if (index < items.size - 1) {
|
|
||||||
addDivider()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun createItemView(item: SelectorItem, position: Int): View {
|
|
||||||
val itemView = LayoutInflater.from(context)
|
|
||||||
.inflate(R.layout.layout_expand_view_item, mBinding.itemsContainer, false)
|
|
||||||
|
|
||||||
val colorIndicator = itemView.findViewById<View>(R.id.colorIndicator)
|
|
||||||
val itemName = itemView.findViewById<TextView>(R.id.itemName)
|
|
||||||
val itemDesc = itemView.findViewById<TextView>(R.id.itemDesc)
|
|
||||||
val recommendedTag = itemView.findViewById<TextView>(R.id.recommendedTag)
|
|
||||||
val selectedDot = itemView.findViewById<View>(R.id.selectedDot)
|
|
||||||
|
|
||||||
(colorIndicator.background as? GradientDrawable)?.setColor(item.color)
|
|
||||||
|
|
||||||
itemName.text = item.name
|
|
||||||
itemDesc.text = item.description
|
|
||||||
recommendedTag.text = item.pointsInfo
|
|
||||||
selectedDot.visibility = if (item.isSelected) VISIBLE else GONE
|
|
||||||
|
|
||||||
itemView.setOnClickListener {
|
|
||||||
selectItem(position)
|
|
||||||
itemSelectedListener?.onItemSelected(position, item)
|
|
||||||
}
|
|
||||||
|
|
||||||
return itemView
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun addDivider() {
|
|
||||||
val divider = View(context).apply {
|
|
||||||
layoutParams = LayoutParams(LayoutParams.MATCH_PARENT, 1.dp).apply {
|
|
||||||
setBackgroundColor(context.resources.getColor(R.color.chat_setting_divider_color))
|
|
||||||
marginStart = 10.dp
|
|
||||||
marginEnd = 10.dp
|
|
||||||
}
|
|
||||||
}
|
|
||||||
mBinding.itemsContainer.addView(divider)
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
fun selectItem(position: Int) {
|
|
||||||
items.forEachIndexed { index, item ->
|
|
||||||
item.isSelected = index == position
|
|
||||||
}
|
|
||||||
updateItemsView()
|
|
||||||
|
|
||||||
if (position in items.indices) {
|
|
||||||
mBinding.titleText.text = items[position].name
|
|
||||||
}
|
|
||||||
|
|
||||||
collapse()
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
fun toggle() {
|
fun toggle() {
|
||||||
if (isExpanded) collapse() else expand()
|
if (isExpanded) collapse() else expand()
|
||||||
|
|
@ -208,4 +134,11 @@ class MaxNumView @JvmOverloads constructor(
|
||||||
interface OnItemSelectedListener {
|
interface OnItemSelectedListener {
|
||||||
fun onItemSelected(position: Int, item: SelectorItem)
|
fun onItemSelected(position: Int, item: SelectorItem)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* new added */
|
||||||
|
fun setCustomExpandView(expandView: ViewGroup) {
|
||||||
|
mBinding.itemsContainer.addView(expandView)
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
@ -0,0 +1,91 @@
|
||||||
|
package com.remax.visualnovel.ui.chat.ui.expandableSelector
|
||||||
|
|
||||||
|
import android.content.Context
|
||||||
|
import android.util.AttributeSet
|
||||||
|
import android.view.LayoutInflater
|
||||||
|
import android.widget.LinearLayout
|
||||||
|
import androidx.recyclerview.widget.RecyclerView
|
||||||
|
import com.drake.brv.annotaion.DividerOrientation
|
||||||
|
import com.drake.brv.utils.bindingAdapter
|
||||||
|
import com.drake.brv.utils.divider
|
||||||
|
import com.drake.brv.utils.grid
|
||||||
|
import com.drake.brv.utils.setup
|
||||||
|
import com.remax.visualnovel.R
|
||||||
|
import com.remax.visualnovel.databinding.LayoutItemSettingSoundBinding
|
||||||
|
import com.remax.visualnovel.databinding.LayoutSettingSoundSubViewBinding
|
||||||
|
import com.remax.visualnovel.entity.response.ChatSound
|
||||||
|
import com.remax.visualnovel.widget.uitoken.changeBackground
|
||||||
|
import com.remax.visualnovel.widget.uitoken.view.UITokenLinearLayout
|
||||||
|
|
||||||
|
class ExpandSoundSubView @JvmOverloads constructor(
|
||||||
|
context: Context,
|
||||||
|
attrs: AttributeSet? = null,
|
||||||
|
defStyleAttr: Int = 0
|
||||||
|
) : LinearLayout(context, attrs, defStyleAttr) {
|
||||||
|
private var mBinding: LayoutSettingSoundSubViewBinding
|
||||||
|
|
||||||
|
|
||||||
|
init {
|
||||||
|
mBinding = LayoutSettingSoundSubViewBinding.inflate(LayoutInflater.from(context))
|
||||||
|
with(mBinding) {
|
||||||
|
initRadioGroup(radioGroup)
|
||||||
|
initRv(itemsRv)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun initRadioGroup(radioGroup: UITokenLinearLayout) {
|
||||||
|
// TODO("Not yet implemented")
|
||||||
|
}
|
||||||
|
|
||||||
|
fun playActorSound(bubble : ChatSound) {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
fun setSelectedSound() {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun initRv(itemsRv: RecyclerView) {
|
||||||
|
itemsRv.grid(2)
|
||||||
|
.divider {
|
||||||
|
setDivider(16, true)
|
||||||
|
orientation = DividerOrientation.VERTICAL
|
||||||
|
}.setup {
|
||||||
|
addType<ChatSound>(R.layout.layout_item_setting_sound)
|
||||||
|
|
||||||
|
onClick(R.id.left_container) {
|
||||||
|
val bubble = getModel<ChatSound>()
|
||||||
|
playActorSound(bubble)
|
||||||
|
}
|
||||||
|
|
||||||
|
onClick(R.id.tv_select) {
|
||||||
|
val bubble = getModel<ChatSound>()
|
||||||
|
if (!bubble.select) {
|
||||||
|
itemsRv.bindingAdapter.models?.filterIsInstance<ChatSound>()?.forEach { item ->
|
||||||
|
item.select = item == bubble
|
||||||
|
}
|
||||||
|
itemsRv.bindingAdapter.notifyDataSetChanged()
|
||||||
|
setSelectedSound()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
onBind {
|
||||||
|
val item = getModel<ChatSound>()
|
||||||
|
with(getBinding<LayoutItemSettingSoundBinding>()) {
|
||||||
|
if (!item.imgUrl.isNullOrEmpty()) {
|
||||||
|
userAvatar.setImageResource(R.mipmap.sex_man_big)
|
||||||
|
} else {
|
||||||
|
userAvatar.setImageResource(if (item.isMale) R.mipmap.ic_gender_male else R.mipmap.ic_gender_female)
|
||||||
|
}
|
||||||
|
|
||||||
|
tvSoundName.text = item.name
|
||||||
|
itemRoot.changeBackground(backgroundUIColorToken = if (item.isMale) R.string.male_bg else R.string.female_bg)
|
||||||
|
tvSoundDescrible.setTextColor(context.resources.getColor(if (item.isMale) R.color.male_text_color else R.color.female_text_color))
|
||||||
|
tvSoundDescrible.text = item.description
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
@ -120,7 +120,7 @@
|
||||||
android:layout_marginTop="10dp" >
|
android:layout_marginTop="10dp" >
|
||||||
|
|
||||||
<!-- sound selector -->
|
<!-- sound selector -->
|
||||||
<com.remax.visualnovel.ui.chat.ui.expandableSelector.ExpandSelectView
|
<com.remax.visualnovel.ui.chat.ui.expandableSelector.ExpandSoundSelectView
|
||||||
android:id="@+id/sound_actor_selector"
|
android:id="@+id/sound_actor_selector"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,58 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||||
|
android:orientation="vertical">
|
||||||
|
|
||||||
|
<com.remax.visualnovel.widget.uitoken.view.UITokenRelativeLayout
|
||||||
|
android:id="@+id/titleLayout"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
app:backgroundColorToken="@string/color_chat_setting_item_bg"
|
||||||
|
app:radiusToken="@string/radius_m"
|
||||||
|
android:padding="@dimen/dp_12"
|
||||||
|
>
|
||||||
|
|
||||||
|
<com.remax.visualnovel.widget.uitoken.view.UITokenImageView
|
||||||
|
android:id="@+id/icon"
|
||||||
|
android:layout_width="24dp"
|
||||||
|
android:layout_height="24dp"
|
||||||
|
android:layout_centerVertical="true" />
|
||||||
|
|
||||||
|
<com.remax.visualnovel.widget.uitoken.view.UITokenTextView
|
||||||
|
android:id="@+id/titleText"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_toEndOf="@id/icon"
|
||||||
|
android:layout_centerVertical="true"
|
||||||
|
android:layout_marginStart="12dp"
|
||||||
|
android:textSize="16sp"
|
||||||
|
android:textColor="#333333"
|
||||||
|
android:textStyle="normal"/>
|
||||||
|
|
||||||
|
<com.remax.visualnovel.widget.uitoken.view.UITokenImageView
|
||||||
|
android:id="@+id/arrow"
|
||||||
|
android:layout_width="16dp"
|
||||||
|
android:layout_height="16dp"
|
||||||
|
android:layout_alignParentEnd="true"
|
||||||
|
android:layout_centerVertical="true"
|
||||||
|
android:src="@mipmap/setting_arrow_right"/>
|
||||||
|
|
||||||
|
</com.remax.visualnovel.widget.uitoken.view.UITokenRelativeLayout>
|
||||||
|
|
||||||
|
<com.remax.visualnovel.widget.uitoken.view.UITokenLinearLayout
|
||||||
|
android:id="@+id/itemsContainer"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:orientation="vertical"
|
||||||
|
android:layout_marginTop="@dimen/dp_2"
|
||||||
|
android:visibility="visible">
|
||||||
|
<com.remax.visualnovel.ui.chat.ui.expandableSelector.ExpandSoundSubView
|
||||||
|
android:id="@+id/sound_sub_view"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
/>
|
||||||
|
</com.remax.visualnovel.widget.uitoken.view.UITokenLinearLayout>
|
||||||
|
|
||||||
|
</LinearLayout>
|
||||||
|
|
@ -0,0 +1,64 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<androidx.constraintlayout.widget.ConstraintLayout
|
||||||
|
xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||||
|
android:id="@+id/group"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:paddingBottom="16dp">
|
||||||
|
|
||||||
|
<androidx.appcompat.widget.AppCompatImageView
|
||||||
|
android:id="@+id/backgroundIcon"
|
||||||
|
android:layout_width="0dp"
|
||||||
|
android:layout_height="0dp"
|
||||||
|
app:layout_constraintBottom_toBottomOf="@+id/selectBg"
|
||||||
|
app:layout_constraintEnd_toEndOf="@+id/selectBg"
|
||||||
|
app:layout_constraintStart_toStartOf="@+id/selectBg"
|
||||||
|
app:layout_constraintTop_toTopOf="@+id/selectBg" />
|
||||||
|
|
||||||
|
<com.remax.visualnovel.widget.uitoken.view.UITokenFrameLayout
|
||||||
|
android:id="@+id/selectBg"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="0dp"
|
||||||
|
app:backgroundColorToken="@string/color_surface_element_normal"
|
||||||
|
app:layout_constraintDimensionRatio="h,164:219"
|
||||||
|
app:layout_constraintTop_toTopOf="parent"
|
||||||
|
app:radiusToken="@string/radius_l"
|
||||||
|
app:strokeColorToken="@string/color_primary_normal"
|
||||||
|
app:strokeWidthToken="@string/border_m"
|
||||||
|
/>
|
||||||
|
|
||||||
|
<com.remax.visualnovel.widget.ui.buttons.IconButtonView
|
||||||
|
android:id="@+id/fullImage"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_margin="12dp"
|
||||||
|
android:text="@string/icon_full_image"
|
||||||
|
app:iconButtonName="ContrastButton_Tertiary_Dark"
|
||||||
|
app:iconButtonRadius="round"
|
||||||
|
app:iconButtonSizeType="small"
|
||||||
|
app:layout_constraintBottom_toBottomOf="parent"
|
||||||
|
app:layout_constraintEnd_toEndOf="parent" />
|
||||||
|
|
||||||
|
<com.remax.visualnovel.widget.ui.RadioCheckButton
|
||||||
|
android:id="@+id/singleCheckBox"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_marginTop="8dp"
|
||||||
|
android:layout_marginEnd="8dp"
|
||||||
|
app:layout_constraintEnd_toEndOf="parent"
|
||||||
|
app:layout_constraintTop_toTopOf="parent"
|
||||||
|
app:radioCheck="true" />
|
||||||
|
|
||||||
|
<!--<com.remax.visualnovel.widget.TagIconView
|
||||||
|
android:id="@+id/backgroundTag"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
app:tagIconSize="SIZE_S"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_margin="8dp"
|
||||||
|
app:layout_constraintStart_toStartOf="@+id/selectBg"
|
||||||
|
app:layout_constraintTop_toTopOf="@+id/selectBg"
|
||||||
|
app:tagIconContent="@string/default_txt"
|
||||||
|
app:tagIconType="ELEMENT_DARK" />-->
|
||||||
|
|
||||||
|
</androidx.constraintlayout.widget.ConstraintLayout>
|
||||||
|
|
@ -0,0 +1,92 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<androidx.constraintlayout.widget.ConstraintLayout
|
||||||
|
xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||||
|
android:id="@+id/group"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:paddingBottom="16dp">
|
||||||
|
|
||||||
|
<com.remax.visualnovel.widget.uitoken.view.UITokenFrameLayout
|
||||||
|
android:id="@+id/selectBg"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="0dp"
|
||||||
|
app:backgroundColorToken="@string/color_surface_element_normal"
|
||||||
|
app:layout_constraintDimensionRatio="h,164:120"
|
||||||
|
app:layout_constraintTop_toTopOf="parent"
|
||||||
|
app:radiusToken="@string/radius_l"
|
||||||
|
app:strokeColorToken="@string/color_primary_normal"
|
||||||
|
app:strokeWidthToken="@string/border_m"
|
||||||
|
/>
|
||||||
|
|
||||||
|
<com.remax.visualnovel.widget.uitoken.view.UITokenTextView
|
||||||
|
android:id="@+id/bubbleIcon"
|
||||||
|
android:layout_width="60dp"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:gravity="center"
|
||||||
|
app:layout_constraintBottom_toBottomOf="@+id/selectBg"
|
||||||
|
app:layout_constraintEnd_toEndOf="@+id/selectBg"
|
||||||
|
app:layout_constraintStart_toStartOf="@+id/selectBg"
|
||||||
|
app:layout_constraintTop_toTopOf="@+id/selectBg"
|
||||||
|
app:textColorToken="@string/color_txt_primary_normal"
|
||||||
|
android:text="@string/hi"
|
||||||
|
app:textToken="@string/txt_body_m" />
|
||||||
|
|
||||||
|
<com.remax.visualnovel.widget.ui.lock.LockTagView
|
||||||
|
android:id="@+id/lockView"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_margin="8dp"
|
||||||
|
app:layout_constraintEnd_toEndOf="@+id/selectBg"
|
||||||
|
app:layout_constraintTop_toTopOf="@+id/selectBg"
|
||||||
|
app:lockTagLabel="privateLabel" />
|
||||||
|
|
||||||
|
<androidx.appcompat.widget.AppCompatImageView
|
||||||
|
android:id="@+id/bubbleLikeIcon"
|
||||||
|
android:layout_width="12dp"
|
||||||
|
android:layout_height="12dp"
|
||||||
|
android:layout_marginEnd="2dp"
|
||||||
|
android:src="@mipmap/icon_checked"
|
||||||
|
app:layout_constraintBottom_toBottomOf="@+id/bubbleName"
|
||||||
|
app:layout_constraintEnd_toStartOf="@+id/bubbleName"
|
||||||
|
app:layout_constraintHorizontal_chainStyle="packed"
|
||||||
|
app:layout_constraintStart_toStartOf="parent"
|
||||||
|
app:layout_constraintTop_toTopOf="@+id/bubbleName" />
|
||||||
|
|
||||||
|
<com.remax.visualnovel.widget.uitoken.view.UITokenTextView
|
||||||
|
android:id="@+id/bubbleName"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_marginStart="2dp"
|
||||||
|
android:layout_marginTop="8dp"
|
||||||
|
android:gravity="top"
|
||||||
|
android:text="@string/default_txt"
|
||||||
|
app:layout_constraintEnd_toEndOf="parent"
|
||||||
|
app:layout_constraintStart_toEndOf="@+id/bubbleLikeIcon"
|
||||||
|
app:layout_constraintTop_toBottomOf="@+id/selectBg"
|
||||||
|
app:textColorToken="@string/color_txt_primary_normal"
|
||||||
|
app:textToken="@string/txt_label_m" />
|
||||||
|
|
||||||
|
<com.remax.visualnovel.widget.ui.RadioCheckButton
|
||||||
|
android:id="@+id/bubbleCheckBox"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_marginTop="8dp"
|
||||||
|
android:layout_marginEnd="8dp"
|
||||||
|
app:layout_constraintEnd_toEndOf="parent"
|
||||||
|
app:layout_constraintTop_toTopOf="parent"
|
||||||
|
app:radioCheck="true" />
|
||||||
|
|
||||||
|
<!--<com.remax.visualnovel.widget.TagIconView
|
||||||
|
android:id="@+id/bubbleTag"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
app:tagIconSize="SIZE_S"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_margin="8dp"
|
||||||
|
app:layout_constraintStart_toStartOf="@+id/selectBg"
|
||||||
|
app:layout_constraintTop_toTopOf="@+id/selectBg"
|
||||||
|
app:tagIconContent="@string/default_txt"
|
||||||
|
app:tagIconType="ELEMENT_DARK" />-->
|
||||||
|
|
||||||
|
|
||||||
|
</androidx.constraintlayout.widget.ConstraintLayout>
|
||||||
|
|
@ -0,0 +1,88 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<com.remax.visualnovel.widget.uitoken.view.UITokenRelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:id="@+id/item_root"
|
||||||
|
app:backgroundColorToken="@string/color_glo_color_orange_10"
|
||||||
|
app:radiusToken="@string/radius_m"
|
||||||
|
android:padding="@dimen/dp_10"
|
||||||
|
>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<FrameLayout
|
||||||
|
android:id="@+id/left_container"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_centerVertical="true">
|
||||||
|
|
||||||
|
<com.remax.visualnovel.widget.uitoken.view.UITokenImageView
|
||||||
|
android:id="@+id/userAvatar"
|
||||||
|
android:layout_width="@dimen/dp_55"
|
||||||
|
android:layout_height="@dimen/dp_55"
|
||||||
|
app:backgroundColorToken="@string/color_primary_normal"
|
||||||
|
app:radiusToken="@string/radius_round" />
|
||||||
|
|
||||||
|
<com.remax.visualnovel.widget.uitoken.view.UITokenImageView
|
||||||
|
android:layout_width="@dimen/dp_20"
|
||||||
|
android:layout_height="@dimen/dp_20"
|
||||||
|
android:layout_gravity="end|top"
|
||||||
|
android:gravity="center"
|
||||||
|
android:text="@string/icon_camera_fill"
|
||||||
|
android:textSize="16sp"
|
||||||
|
android:src="@mipmap/setting_sound_play"
|
||||||
|
/>
|
||||||
|
</FrameLayout>
|
||||||
|
|
||||||
|
|
||||||
|
<com.remax.visualnovel.widget.uitoken.view.UITokenTextView
|
||||||
|
android:id="@+id/tv_select"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_alignParentEnd="true"
|
||||||
|
android:layout_centerVertical="true"
|
||||||
|
android:paddingVertical="@dimen/dp_8"
|
||||||
|
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"
|
||||||
|
/>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<com.remax.visualnovel.widget.uitoken.view.UITokenLinearLayout
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_toEndOf="@+id/left_container"
|
||||||
|
android:layout_toStartOf="@+id/tv_select"
|
||||||
|
android:layout_marginHorizontal="@dimen/dp_9"
|
||||||
|
android:layout_centerVertical="true"
|
||||||
|
android:orientation="vertical"
|
||||||
|
>
|
||||||
|
|
||||||
|
<com.remax.visualnovel.widget.uitoken.view.UITokenTextView
|
||||||
|
android:id="@+id/tv_sound_name"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:textSize="@dimen/sp_15"
|
||||||
|
android:textColor="@color/gray3"
|
||||||
|
android:textStyle="bold"
|
||||||
|
/>
|
||||||
|
|
||||||
|
<com.remax.visualnovel.widget.uitoken.view.UITokenTextView
|
||||||
|
android:id="@+id/tv_sound_describle"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:textSize="@dimen/sp_13"
|
||||||
|
android:textColor="@color/female_text_color"
|
||||||
|
android:textStyle="italic"
|
||||||
|
android:layout_marginTop="@dimen/dp_10"
|
||||||
|
/>
|
||||||
|
</com.remax.visualnovel.widget.uitoken.view.UITokenLinearLayout>
|
||||||
|
|
||||||
|
|
||||||
|
</com.remax.visualnovel.widget.uitoken.view.UITokenRelativeLayout>
|
||||||
|
|
@ -0,0 +1,17 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:maxHeight="250dp"
|
||||||
|
android:orientation="vertical">
|
||||||
|
|
||||||
|
<androidx.recyclerview.widget.RecyclerView
|
||||||
|
android:id="@+id/itemsRv"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:orientation="vertical"
|
||||||
|
android:layout_marginTop="@dimen/dp_2"
|
||||||
|
android:visibility="visible"/>
|
||||||
|
|
||||||
|
</LinearLayout>
|
||||||
|
|
@ -0,0 +1,16 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:maxHeight="250dp"
|
||||||
|
android:orientation="vertical">
|
||||||
|
<androidx.recyclerview.widget.RecyclerView
|
||||||
|
android:id="@+id/itemsRv"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:orientation="vertical"
|
||||||
|
android:layout_marginTop="@dimen/dp_2"
|
||||||
|
android:visibility="visible"/>
|
||||||
|
|
||||||
|
</LinearLayout>
|
||||||
|
|
@ -0,0 +1,50 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:maxHeight="250dp"
|
||||||
|
android:orientation="vertical">
|
||||||
|
|
||||||
|
<com.remax.visualnovel.widget.uitoken.view.UITokenLinearLayout
|
||||||
|
android:id="@+id/radio_group"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:gravity="center_vertical"
|
||||||
|
android:orientation="horizontal"
|
||||||
|
app:backgroundColorToken="@string/color_chat_setting_item_bg"
|
||||||
|
app:radiusToken="@string/radius_m"
|
||||||
|
android:padding="@dimen/dp_12"
|
||||||
|
>
|
||||||
|
|
||||||
|
<com.remax.visualnovel.widget.ui.RadioCheckButton
|
||||||
|
android:id="@+id/radio_all"
|
||||||
|
android:layout_width="16dp"
|
||||||
|
android:layout_height="16dp"
|
||||||
|
app:radioCheck="true" />
|
||||||
|
|
||||||
|
<com.remax.visualnovel.widget.ui.RadioCheckButton
|
||||||
|
android:id="@+id/radio_male"
|
||||||
|
android:layout_width="16dp"
|
||||||
|
android:layout_height="16dp"
|
||||||
|
android:layout_marginLeft="@dimen/dp_20"
|
||||||
|
app:radioCheck="true" />
|
||||||
|
|
||||||
|
<com.remax.visualnovel.widget.ui.RadioCheckButton
|
||||||
|
android:id="@+id/radio_female"
|
||||||
|
android:layout_width="16dp"
|
||||||
|
android:layout_height="16dp"
|
||||||
|
android:layout_marginLeft="@dimen/dp_20"
|
||||||
|
app:radioCheck="true" />
|
||||||
|
|
||||||
|
</com.remax.visualnovel.widget.uitoken.view.UITokenLinearLayout>
|
||||||
|
|
||||||
|
<androidx.recyclerview.widget.RecyclerView
|
||||||
|
android:id="@+id/itemsRv"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:orientation="vertical"
|
||||||
|
android:layout_marginTop="@dimen/dp_2"
|
||||||
|
android:visibility="visible"/>
|
||||||
|
|
||||||
|
</LinearLayout>
|
||||||
Binary file not shown.
|
After Width: | Height: | Size: 1.4 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 20 KiB |
|
|
@ -203,6 +203,12 @@
|
||||||
|
|
||||||
<color name="chat_setting_divider_color">#ffececf9</color>
|
<color name="chat_setting_divider_color">#ffececf9</color>
|
||||||
|
|
||||||
|
<color name="female_text_color">#ff7326ae</color>
|
||||||
|
<color name="male_text_color">#ff4876c9</color>
|
||||||
|
<color name="female_bg">#ffe5c4ff</color>
|
||||||
|
<color name="male_bg">#ffc7dbff</color>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -211,4 +211,9 @@
|
||||||
<string name="switch_view_stroke" translatable="false">color.switch.view.stroke</string>
|
<string name="switch_view_stroke" translatable="false">color.switch.view.stroke</string>
|
||||||
|
|
||||||
|
|
||||||
|
<string name="female_text_color" translatable="false">female.text.color</string>
|
||||||
|
<string name="male_text_color" translatable="false">male.text.color</string>
|
||||||
|
<string name="female_bg" translatable="false">female.bg</string>
|
||||||
|
<string name="male_bg" translatable="false">male.bg</string>
|
||||||
|
|
||||||
</resources>
|
</resources>
|
||||||
Loading…
Reference in New Issue