背景选择器
This commit is contained in:
		
							parent
							
								
									667161f05f
								
							
						
					
					
						commit
						ad06ee3411
					
				|  | @ -6,11 +6,13 @@ import com.remax.visualnovel.entity.model.base.BasePhoto | ||||||
|  * Created by HJW on 2025/8/18 |  * Created by HJW on 2025/8/18 | ||||||
|  */ |  */ | ||||||
| data class ChatBackground( | data class ChatBackground( | ||||||
|     val backgroundId: Int?, |     var backgroundId: Int? = 0, | ||||||
|     val imgUrl: String, |     var imgUrl: String? = "", | ||||||
|     var isDefault: Boolean, |     var isDefault: Boolean = false, | ||||||
|     var select: Boolean = false, |     var select: Boolean = false, | ||||||
|     var isSelected: Boolean? = null, |     var isSelected: Boolean? = null, | ||||||
|  |     var deletable: Boolean = false, | ||||||
|  |     var isUploadLocalItem: Boolean = false | ||||||
| ) : BasePhoto() { | ) : BasePhoto() { | ||||||
|     override fun paramId(): Long { |     override fun paramId(): Long { | ||||||
|         return imgUrl.hashCode().toLong() |         return imgUrl.hashCode().toLong() | ||||||
|  |  | ||||||
|  | @ -0,0 +1,13 @@ | ||||||
|  | package com.remax.visualnovel.entity.response | ||||||
|  | 
 | ||||||
|  | import android.os.Parcelable | ||||||
|  | import kotlinx.parcelize.Parcelize | ||||||
|  | 
 | ||||||
|  | @Parcelize | ||||||
|  | data class ChatHistory( | ||||||
|  |     var id: Int? = 0, | ||||||
|  |     var time: Long, | ||||||
|  |     var describle: String | ||||||
|  | ) : Parcelable { | ||||||
|  | 
 | ||||||
|  | } | ||||||
|  | @ -9,6 +9,7 @@ import android.widget.LinearLayout | ||||||
| import androidx.core.graphics.toColorInt | import androidx.core.graphics.toColorInt | ||||||
| import com.remax.visualnovel.R | import com.remax.visualnovel.R | ||||||
| import com.remax.visualnovel.databinding.LayoutChatMenuViewBinding | import com.remax.visualnovel.databinding.LayoutChatMenuViewBinding | ||||||
|  | import com.remax.visualnovel.entity.response.ChatBackground | ||||||
| import com.remax.visualnovel.entity.response.ChatBubble | import com.remax.visualnovel.entity.response.ChatBubble | ||||||
| import com.remax.visualnovel.entity.response.ChatMode | import com.remax.visualnovel.entity.response.ChatMode | ||||||
| import com.remax.visualnovel.entity.response.ChatSound | import com.remax.visualnovel.entity.response.ChatSound | ||||||
|  | @ -32,6 +33,7 @@ class ChatSettingView @JvmOverloads constructor( | ||||||
|         initChatModeSelectorView() |         initChatModeSelectorView() | ||||||
|         initSoundSelectorView() |         initSoundSelectorView() | ||||||
|         initBubbleSelectView() |         initBubbleSelectView() | ||||||
|  |         initBackgroundSelectView() | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
|  | @ -179,5 +181,44 @@ class ChatSettingView @JvmOverloads constructor( | ||||||
|         mBinding.bubbleSelectView.setItems(items) |         mBinding.bubbleSelectView.setItems(items) | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|  |     fun initBackgroundSelectView() { | ||||||
|  |         val items = listOf( | ||||||
|  |             ChatBackground( | ||||||
|  |                 backgroundId = 1, | ||||||
|  |                 imgUrl = "https://cdhrss.chengdu.gov.cn/cdrsj/xhtml/images/2022_logo.png", | ||||||
|  |             ), | ||||||
|  |             ChatBackground( | ||||||
|  |                 backgroundId = 1, | ||||||
|  |                 imgUrl = "https://cdhrss.chengdu.gov.cn/cdrsj/xhtml/images/2022_logo.png", | ||||||
|  |             ), | ||||||
|  |             ChatBackground( | ||||||
|  |                 backgroundId = 1, | ||||||
|  |                 imgUrl = "https://cdhrss.chengdu.gov.cn/cdrsj/xhtml/images/2022_logo.png", | ||||||
|  |             ), | ||||||
|  |             ChatBackground( | ||||||
|  |                 backgroundId = 1, | ||||||
|  |                 imgUrl = "https://cdhrss.chengdu.gov.cn/cdrsj/xhtml/images/2022_logo.png", | ||||||
|  |             ), | ||||||
|  |             ChatBackground( | ||||||
|  |                 backgroundId = 1, | ||||||
|  |                 imgUrl = "https://cdhrss.chengdu.gov.cn/cdrsj/xhtml/images/2022_logo.png", | ||||||
|  |             ), | ||||||
|  |             ChatBackground( | ||||||
|  |                 backgroundId = 1, | ||||||
|  |                 imgUrl = "https://cdhrss.chengdu.gov.cn/cdrsj/xhtml/images/2022_logo.png", | ||||||
|  |             ), | ||||||
|  |             ChatBackground( | ||||||
|  |                 backgroundId = 1, | ||||||
|  |                 imgUrl = "https://cdhrss.chengdu.gov.cn/cdrsj/xhtml/images/2022_logo.png", | ||||||
|  |                 deletable = true | ||||||
|  |             ), | ||||||
|  |             ChatBackground( | ||||||
|  |                 isUploadLocalItem = true | ||||||
|  |             ) | ||||||
|  |         ) | ||||||
|  | 
 | ||||||
|  |         mBinding.backgroundSelectorView.setItems(items) | ||||||
|  |     } | ||||||
|  | 
 | ||||||
| 
 | 
 | ||||||
| } | } | ||||||
|  |  | ||||||
|  | @ -0,0 +1,72 @@ | ||||||
|  | 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.models | ||||||
|  | import com.drake.brv.utils.setup | ||||||
|  | import com.remax.visualnovel.R | ||||||
|  | import com.remax.visualnovel.databinding.LayoutItemSettingBackgroundBinding | ||||||
|  | import com.remax.visualnovel.databinding.LayoutSettingBgSubViewBinding | ||||||
|  | import com.remax.visualnovel.entity.response.ChatBackground | ||||||
|  | import com.remax.visualnovel.extension.glide.load | ||||||
|  | 
 | ||||||
|  | class ExpandBackgroundSubView @JvmOverloads constructor( | ||||||
|  |     context: Context, | ||||||
|  |     attrs: AttributeSet? = null, | ||||||
|  |     defStyleAttr: Int = 0 | ||||||
|  | ) : LinearLayout(context, attrs, defStyleAttr) { | ||||||
|  |     private lateinit var items: List<ChatBackground> | ||||||
|  |     private var mBinding: LayoutSettingBgSubViewBinding | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  |     init { | ||||||
|  |         mBinding = LayoutSettingBgSubViewBinding.inflate(LayoutInflater.from(context), this, true) | ||||||
|  |         with(mBinding) { | ||||||
|  |             initRv(itemsRv) | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     private fun initRv(itemsRv: RecyclerView) { | ||||||
|  |         itemsRv.grid(3) | ||||||
|  |             .divider { | ||||||
|  |                 setDivider(10, true) | ||||||
|  |                 orientation = DividerOrientation.VERTICAL | ||||||
|  |             }.setup { | ||||||
|  |                 addType<ChatBackground>(R.layout.layout_item_setting_background) | ||||||
|  | 
 | ||||||
|  |                 onClick(R.id.root) { | ||||||
|  |                     val chatBackground = getModel<ChatBackground>() | ||||||
|  |                     if (!chatBackground.select) { | ||||||
|  |                         itemsRv.bindingAdapter.models?.filterIsInstance<ChatBackground>()?.forEach { item -> | ||||||
|  |                             item.select = item == chatBackground | ||||||
|  |                         } | ||||||
|  |                         itemsRv.bindingAdapter.notifyDataSetChanged() | ||||||
|  |                     } | ||||||
|  |                 } | ||||||
|  | 
 | ||||||
|  |                 onBind { | ||||||
|  |                     val item = getModel<ChatBackground>() | ||||||
|  |                     with(getBinding<LayoutItemSettingBackgroundBinding>()) { | ||||||
|  |                         if (!item.imgUrl.isNullOrEmpty()) { | ||||||
|  |                             ivBackgroundSrc.load(item.imgUrl) | ||||||
|  |                         } | ||||||
|  |                         ivDel.visibility = if (item.deletable) VISIBLE else GONE | ||||||
|  |                     } | ||||||
|  |                 } | ||||||
|  |             } | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     fun setItems(newItems: List<ChatBackground>) { | ||||||
|  |         items = newItems | ||||||
|  |         mBinding.itemsRv.models = items | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | } | ||||||
|  | @ -1,42 +0,0 @@ | ||||||
| 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 { |  | ||||||
| 
 |  | ||||||
|             } |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| } |  | ||||||
|  | @ -253,6 +253,12 @@ | ||||||
|             android:orientation="vertical" |             android:orientation="vertical" | ||||||
|             android:layout_marginTop="10dp" > |             android:layout_marginTop="10dp" > | ||||||
| 
 | 
 | ||||||
|  |             <com.remax.visualnovel.ui.chat.ui.expandableSelector.ExpandBackgroundSubView | ||||||
|  |                 android:id="@+id/background_selector_view" | ||||||
|  |                 android:layout_width="match_parent" | ||||||
|  |                 android:layout_height="wrap_content" | ||||||
|  |                 /> | ||||||
|  | 
 | ||||||
|         </com.remax.visualnovel.widget.uitoken.view.UITokenLinearLayout> |         </com.remax.visualnovel.widget.uitoken.view.UITokenLinearLayout> | ||||||
| 
 | 
 | ||||||
|         <!--  history related  --> |         <!--  history related  --> | ||||||
|  |  | ||||||
|  | @ -0,0 +1,45 @@ | ||||||
|  | <?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/root" | ||||||
|  |     android:layout_width="match_parent" | ||||||
|  |     android:layout_height="wrap_content" > | ||||||
|  | 
 | ||||||
|  |     <androidx.appcompat.widget.AppCompatImageView | ||||||
|  |         android:id="@+id/iv_background_src" | ||||||
|  |         android:layout_width="0dp" | ||||||
|  |         android:layout_height="0dp" | ||||||
|  |         android:src="@mipmap/img_1" | ||||||
|  |         android:scaleType="centerCrop" | ||||||
|  |         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,87:116" | ||||||
|  |         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.UITokenImageView | ||||||
|  |         android:id="@+id/iv_del" | ||||||
|  |         android:layout_width="@dimen/dp_15" | ||||||
|  |         android:layout_height="@dimen/dp_15" | ||||||
|  |         android:src="@mipmap/setting_delete" | ||||||
|  |         app:radiusToken="@string/radius_l" | ||||||
|  |         android:tint="@color/white" | ||||||
|  |         android:layout_marginBottom="@dimen/dp_9" | ||||||
|  |         app:layout_constraintEnd_toEndOf="parent" | ||||||
|  |         app:layout_constraintStart_toStartOf="parent" | ||||||
|  |         app:layout_constraintBottom_toBottomOf="parent" | ||||||
|  |         /> | ||||||
|  | 
 | ||||||
|  | </androidx.constraintlayout.widget.ConstraintLayout> | ||||||
|  | @ -4,13 +4,14 @@ | ||||||
|     xmlns:app="http://schemas.android.com/apk/res-auto" |     xmlns:app="http://schemas.android.com/apk/res-auto" | ||||||
|     android:id="@+id/group" |     android:id="@+id/group" | ||||||
|     android:layout_width="match_parent" |     android:layout_width="match_parent" | ||||||
|     android:layout_height="wrap_content" |     android:layout_height="wrap_content" > | ||||||
|     android:paddingBottom="16dp"> |  | ||||||
| 
 | 
 | ||||||
|     <androidx.appcompat.widget.AppCompatImageView |     <androidx.appcompat.widget.AppCompatImageView | ||||||
|         android:id="@+id/backgroundIcon" |         android:id="@+id/backgroundIcon" | ||||||
|         android:layout_width="0dp" |         android:layout_width="0dp" | ||||||
|         android:layout_height="0dp" |         android:layout_height="0dp" | ||||||
|  |         android:src="@mipmap/img_1" | ||||||
|  |         android:scaleType="centerCrop" | ||||||
|         app:layout_constraintBottom_toBottomOf="@+id/selectBg" |         app:layout_constraintBottom_toBottomOf="@+id/selectBg" | ||||||
|         app:layout_constraintEnd_toEndOf="@+id/selectBg" |         app:layout_constraintEnd_toEndOf="@+id/selectBg" | ||||||
|         app:layout_constraintStart_toStartOf="@+id/selectBg" |         app:layout_constraintStart_toStartOf="@+id/selectBg" | ||||||
|  | @ -21,44 +22,11 @@ | ||||||
|         android:layout_width="match_parent" |         android:layout_width="match_parent" | ||||||
|         android:layout_height="0dp" |         android:layout_height="0dp" | ||||||
|         app:backgroundColorToken="@string/color_surface_element_normal" |         app:backgroundColorToken="@string/color_surface_element_normal" | ||||||
|         app:layout_constraintDimensionRatio="h,164:219" |         app:layout_constraintDimensionRatio="h,87:116" | ||||||
|         app:layout_constraintTop_toTopOf="parent" |         app:layout_constraintTop_toTopOf="parent" | ||||||
|         app:radiusToken="@string/radius_l" |         app:radiusToken="@string/radius_l" | ||||||
|         app:strokeColorToken="@string/color_primary_normal" |         app:strokeColorToken="@string/color_primary_normal" | ||||||
|         app:strokeWidthToken="@string/border_m" |         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> | </androidx.constraintlayout.widget.ConstraintLayout> | ||||||
|  | @ -4,8 +4,7 @@ | ||||||
|     xmlns:app="http://schemas.android.com/apk/res-auto" |     xmlns:app="http://schemas.android.com/apk/res-auto" | ||||||
|     android:id="@+id/group" |     android:id="@+id/group" | ||||||
|     android:layout_width="match_parent" |     android:layout_width="match_parent" | ||||||
|     android:layout_height="wrap_content" |     android:layout_height="wrap_content" > | ||||||
|     android:paddingBottom="16dp"> |  | ||||||
| 
 | 
 | ||||||
|     <com.remax.visualnovel.widget.uitoken.view.UITokenFrameLayout |     <com.remax.visualnovel.widget.uitoken.view.UITokenFrameLayout | ||||||
|         android:id="@+id/selectBg" |         android:id="@+id/selectBg" | ||||||
|  |  | ||||||
|  | @ -1,6 +1,5 @@ | ||||||
| <?xml version="1.0" encoding="utf-8"?> | <?xml version="1.0" encoding="utf-8"?> | ||||||
| <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" | <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_width="match_parent" | ||||||
|     android:layout_height="wrap_content" |     android:layout_height="wrap_content" | ||||||
|     android:maxHeight="250dp" |     android:maxHeight="250dp" | ||||||
|  | @ -13,5 +12,4 @@ | ||||||
|         android:orientation="vertical" |         android:orientation="vertical" | ||||||
|         android:layout_marginTop="@dimen/dp_2" |         android:layout_marginTop="@dimen/dp_2" | ||||||
|         android:visibility="visible"/> |         android:visibility="visible"/> | ||||||
| 
 |  | ||||||
| </LinearLayout> | </LinearLayout> | ||||||
										
											Binary file not shown.
										
									
								
							| After Width: | Height: | Size: 114 KiB | 
										
											Binary file not shown.
										
									
								
							| After Width: | Height: | Size: 114 KiB | 
		Loading…
	
		Reference in New Issue