룰렛 프리셋 적용
This commit is contained in:
parent
e3349e41a1
commit
4e56eb9bde
|
@ -0,0 +1,10 @@
|
|||
package kr.co.vividnext.sodalive.live.roulette
|
||||
|
||||
import com.google.gson.annotations.SerializedName
|
||||
|
||||
data class GetNewRouletteResponse(
|
||||
@SerializedName("id") val id: Long,
|
||||
@SerializedName("can") val can: Int,
|
||||
@SerializedName("isActive") val isActive: Boolean,
|
||||
@SerializedName("items") val items: List<RouletteItem>
|
||||
)
|
|
@ -2,18 +2,32 @@ package kr.co.vividnext.sodalive.live.roulette
|
|||
|
||||
import io.reactivex.rxjava3.core.Single
|
||||
import kr.co.vividnext.sodalive.common.ApiResponse
|
||||
import kr.co.vividnext.sodalive.live.roulette.config.CreateOrUpdateRouletteRequest
|
||||
import kr.co.vividnext.sodalive.live.roulette.config.CreateRouletteRequest
|
||||
import kr.co.vividnext.sodalive.live.roulette.config.RouletteApi
|
||||
import kr.co.vividnext.sodalive.live.roulette.config.UpdateRouletteRequest
|
||||
|
||||
class RouletteRepository(private val api: RouletteApi) {
|
||||
fun createOrUpdateRoulette(
|
||||
request: CreateOrUpdateRouletteRequest,
|
||||
fun createRoulette(
|
||||
request: CreateRouletteRequest,
|
||||
token: String
|
||||
) = api.createOrUpdateRoulette(
|
||||
) = api.createRoulette(
|
||||
request = request,
|
||||
authHeader = token
|
||||
)
|
||||
|
||||
fun updateRoulette(
|
||||
request: UpdateRouletteRequest,
|
||||
token: String
|
||||
) = api.updateRoulette(
|
||||
request = request,
|
||||
authHeader = token
|
||||
)
|
||||
|
||||
fun getAllRoulette(creatorId: Long, token: String) = api.getAllRoulette(
|
||||
creatorId = creatorId,
|
||||
authHeader = token
|
||||
)
|
||||
|
||||
fun getRoulette(creatorId: Long, token: String) = api.getRoulette(
|
||||
creatorId = creatorId,
|
||||
authHeader = token
|
||||
|
|
|
@ -3,7 +3,7 @@ package kr.co.vividnext.sodalive.live.roulette.config
|
|||
import com.google.gson.annotations.SerializedName
|
||||
import kr.co.vividnext.sodalive.live.roulette.RouletteItem
|
||||
|
||||
data class CreateOrUpdateRouletteRequest(
|
||||
data class CreateRouletteRequest(
|
||||
@SerializedName("can") val can: Int,
|
||||
@SerializedName("isActive") val isActive: Boolean,
|
||||
@SerializedName("items") val items: List<RouletteItem>
|
|
@ -2,35 +2,49 @@ package kr.co.vividnext.sodalive.live.roulette.config
|
|||
|
||||
import io.reactivex.rxjava3.core.Single
|
||||
import kr.co.vividnext.sodalive.common.ApiResponse
|
||||
import kr.co.vividnext.sodalive.live.roulette.GetNewRouletteResponse
|
||||
import kr.co.vividnext.sodalive.live.roulette.GetRouletteResponse
|
||||
import kr.co.vividnext.sodalive.live.roulette.SpinRouletteRequest
|
||||
import retrofit2.http.Body
|
||||
import retrofit2.http.GET
|
||||
import retrofit2.http.Header
|
||||
import retrofit2.http.POST
|
||||
import retrofit2.http.PUT
|
||||
import retrofit2.http.Path
|
||||
import retrofit2.http.Query
|
||||
|
||||
interface RouletteApi {
|
||||
@POST("/roulette")
|
||||
fun createOrUpdateRoulette(
|
||||
@Body request: CreateOrUpdateRouletteRequest,
|
||||
@POST("/new-roulette")
|
||||
fun createRoulette(
|
||||
@Body request: CreateRouletteRequest,
|
||||
@Header("Authorization") authHeader: String
|
||||
): Single<ApiResponse<Any>>
|
||||
|
||||
@GET("/roulette")
|
||||
@PUT("/new-roulette")
|
||||
fun updateRoulette(
|
||||
@Body request: UpdateRouletteRequest,
|
||||
@Header("Authorization") authHeader: String
|
||||
): Single<ApiResponse<Any>>
|
||||
|
||||
@GET("/new-roulette/creator")
|
||||
fun getAllRoulette(
|
||||
@Query("creatorId") creatorId: Long,
|
||||
@Header("Authorization") authHeader: String
|
||||
): Single<ApiResponse<List<GetNewRouletteResponse>>>
|
||||
|
||||
@GET("/new-roulette")
|
||||
fun getRoulette(
|
||||
@Query("creatorId") creatorId: Long,
|
||||
@Header("Authorization") authHeader: String
|
||||
): Single<ApiResponse<GetRouletteResponse>>
|
||||
|
||||
@POST("/roulette/spin")
|
||||
@POST("/new-roulette/spin")
|
||||
fun spinRoulette(
|
||||
@Body request: SpinRouletteRequest,
|
||||
@Header("Authorization") authHeader: String
|
||||
): Single<ApiResponse<GetRouletteResponse>>
|
||||
|
||||
@POST("/roulette/refund/{id}")
|
||||
@POST("/new-roulette/refund/{id}")
|
||||
fun refundRouletteDonation(
|
||||
@Path("id") id: Long,
|
||||
@Header("Authorization") authHeader: String
|
||||
|
|
|
@ -13,7 +13,9 @@ import android.view.View
|
|||
import android.view.inputmethod.InputMethodManager
|
||||
import android.widget.EditText
|
||||
import android.widget.ImageView
|
||||
import android.widget.LinearLayout
|
||||
import android.widget.TextView
|
||||
import androidx.core.content.ContextCompat
|
||||
import com.jakewharton.rxbinding4.widget.textChanges
|
||||
import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers
|
||||
import io.reactivex.rxjava3.schedulers.Schedulers
|
||||
|
@ -41,7 +43,7 @@ class RouletteSettingsFragment : BaseFragment<FragmentRouletteSettingsBinding>(
|
|||
|
||||
setupView()
|
||||
bindData()
|
||||
viewModel.getRoulette()
|
||||
viewModel.getAllRoulette()
|
||||
}
|
||||
|
||||
private fun setupView() {
|
||||
|
@ -74,15 +76,57 @@ class RouletteSettingsFragment : BaseFragment<FragmentRouletteSettingsBinding>(
|
|||
handler.postDelayed({
|
||||
imm.hideSoftInputFromWindow(view?.windowToken, 0)
|
||||
}, 100)
|
||||
|
||||
viewModel.createOrUpdateRoulette {
|
||||
val resultIntent = Intent().apply { putExtra(Constants.EXTRA_RESULT_ROULETTE, it) }
|
||||
requireActivity().setResult(Activity.RESULT_OK, resultIntent)
|
||||
requireActivity().finish()
|
||||
}
|
||||
}
|
||||
|
||||
binding.llSelectRoulette1.setOnClickListener {
|
||||
viewModel.selectRoulette(
|
||||
RouletteSettingsViewModel.SelectedRoulette.ROULETTE_1
|
||||
)
|
||||
}
|
||||
|
||||
binding.llSelectRoulette2.setOnClickListener {
|
||||
viewModel.selectRoulette(
|
||||
RouletteSettingsViewModel.SelectedRoulette.ROULETTE_2
|
||||
)
|
||||
}
|
||||
|
||||
binding.llSelectRoulette3.setOnClickListener {
|
||||
viewModel.selectRoulette(
|
||||
RouletteSettingsViewModel.SelectedRoulette.ROULETTE_3
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
private fun bindData() {
|
||||
viewModel.selectedRouletteLiveData.observe(viewLifecycleOwner) {
|
||||
deselectAllRoulette()
|
||||
when (it) {
|
||||
RouletteSettingsViewModel.SelectedRoulette.ROULETTE_2 -> selectRouletteButton(
|
||||
binding.ivSelectRoulette2,
|
||||
binding.llSelectRoulette2,
|
||||
binding.tvSelectRoulette2
|
||||
)
|
||||
|
||||
RouletteSettingsViewModel.SelectedRoulette.ROULETTE_3 -> selectRouletteButton(
|
||||
binding.ivSelectRoulette3,
|
||||
binding.llSelectRoulette3,
|
||||
binding.tvSelectRoulette3
|
||||
)
|
||||
|
||||
else -> selectRouletteButton(
|
||||
binding.ivSelectRoulette1,
|
||||
binding.llSelectRoulette1,
|
||||
binding.tvSelectRoulette1
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
viewModel.isActiveLiveData.observe(viewLifecycleOwner) {
|
||||
binding.ivRouletteIsActive.setImageResource(
|
||||
if (it) R.drawable.btn_toggle_on_big else R.drawable.btn_toggle_off_big
|
||||
|
@ -185,4 +229,50 @@ class RouletteSettingsFragment : BaseFragment<FragmentRouletteSettingsBinding>(
|
|||
|
||||
return optionView
|
||||
}
|
||||
|
||||
private fun deselectAllRoulette() {
|
||||
binding.ivSelectRoulette1.visibility = View.GONE
|
||||
binding.ivSelectRoulette2.visibility = View.GONE
|
||||
binding.ivSelectRoulette3.visibility = View.GONE
|
||||
|
||||
binding.llSelectRoulette1.setBackgroundResource(R.drawable.bg_round_corner_6_7_13181b)
|
||||
binding.llSelectRoulette2.setBackgroundResource(R.drawable.bg_round_corner_6_7_13181b)
|
||||
binding.llSelectRoulette3.setBackgroundResource(R.drawable.bg_round_corner_6_7_13181b)
|
||||
|
||||
binding.tvSelectRoulette1.setTextColor(
|
||||
ContextCompat.getColor(
|
||||
requireContext(),
|
||||
R.color.color_3bb9f1
|
||||
)
|
||||
)
|
||||
|
||||
binding.tvSelectRoulette2.setTextColor(
|
||||
ContextCompat.getColor(
|
||||
requireContext(),
|
||||
R.color.color_3bb9f1
|
||||
)
|
||||
)
|
||||
|
||||
binding.tvSelectRoulette3.setTextColor(
|
||||
ContextCompat.getColor(
|
||||
requireContext(),
|
||||
R.color.color_3bb9f1
|
||||
)
|
||||
)
|
||||
}
|
||||
|
||||
private fun selectRouletteButton(
|
||||
ivSelectRoulette: ImageView,
|
||||
llSelectRoulette: LinearLayout,
|
||||
tvSelectRoulette: TextView
|
||||
) {
|
||||
ivSelectRoulette.visibility = View.VISIBLE
|
||||
llSelectRoulette.setBackgroundResource(R.drawable.bg_round_corner_6_7_3bb9f1)
|
||||
tvSelectRoulette.setTextColor(
|
||||
ContextCompat.getColor(
|
||||
requireContext(),
|
||||
R.color.color_eeeeee
|
||||
)
|
||||
)
|
||||
}
|
||||
}
|
||||
|
|
|
@ -7,6 +7,7 @@ import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers
|
|||
import io.reactivex.rxjava3.schedulers.Schedulers
|
||||
import kr.co.vividnext.sodalive.base.BaseViewModel
|
||||
import kr.co.vividnext.sodalive.common.SharedPreferenceManager
|
||||
import kr.co.vividnext.sodalive.live.roulette.GetNewRouletteResponse
|
||||
import kr.co.vividnext.sodalive.live.roulette.RouletteItem
|
||||
import kr.co.vividnext.sodalive.live.roulette.RoulettePreview
|
||||
import kr.co.vividnext.sodalive.live.roulette.RoulettePreviewItem
|
||||
|
@ -15,6 +16,10 @@ import kotlin.math.floor
|
|||
|
||||
class RouletteSettingsViewModel(private val repository: RouletteRepository) : BaseViewModel() {
|
||||
|
||||
enum class SelectedRoulette {
|
||||
ROULETTE_1, ROULETTE_2, ROULETTE_3
|
||||
}
|
||||
|
||||
private var _isLoading = MutableLiveData(false)
|
||||
val isLoading: LiveData<Boolean>
|
||||
get() = _isLoading
|
||||
|
@ -39,9 +44,16 @@ class RouletteSettingsViewModel(private val repository: RouletteRepository) : Ba
|
|||
val roulettePreviewLiveData: LiveData<RoulettePreview>
|
||||
get() = _roulettePreviewLiveData
|
||||
|
||||
private val options = mutableListOf<RouletteOption>()
|
||||
private val _selectedRouletteLiveData = MutableLiveData<SelectedRoulette>()
|
||||
val selectedRouletteLiveData: LiveData<SelectedRoulette>
|
||||
get() = _selectedRouletteLiveData
|
||||
|
||||
var can = 0
|
||||
var isActive = false
|
||||
private var rouletteId = 0L
|
||||
private val options = mutableListOf<RouletteOption>()
|
||||
|
||||
private val rouletteList = mutableListOf<GetNewRouletteResponse>()
|
||||
|
||||
fun plusWeight(optionIndex: Int) {
|
||||
val currentOption = options[optionIndex]
|
||||
|
@ -113,6 +125,15 @@ class RouletteSettingsViewModel(private val repository: RouletteRepository) : Ba
|
|||
if (!_isLoading.value!!) {
|
||||
_isLoading.value = true
|
||||
|
||||
if (rouletteId > 0) {
|
||||
updateRoulette(onSuccess)
|
||||
} else {
|
||||
createRoulette(onSuccess)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private fun updateRoulette(onSuccess: (Boolean) -> Unit) {
|
||||
val items = mutableListOf<RouletteItem>()
|
||||
for (option in options) {
|
||||
if (option.title.trim().isEmpty()) {
|
||||
|
@ -124,14 +145,15 @@ class RouletteSettingsViewModel(private val repository: RouletteRepository) : Ba
|
|||
items.add(RouletteItem(title = option.title, weight = option.weight))
|
||||
}
|
||||
|
||||
val request = CreateOrUpdateRouletteRequest(
|
||||
val request = UpdateRouletteRequest(
|
||||
id = rouletteId,
|
||||
can = can,
|
||||
isActive = isActive,
|
||||
items = items
|
||||
)
|
||||
|
||||
compositeDisposable.add(
|
||||
repository.createOrUpdateRoulette(
|
||||
repository.updateRoulette(
|
||||
request = request,
|
||||
token = "Bearer ${SharedPreferenceManager.token}"
|
||||
)
|
||||
|
@ -166,13 +188,67 @@ class RouletteSettingsViewModel(private val repository: RouletteRepository) : Ba
|
|||
)
|
||||
)
|
||||
}
|
||||
|
||||
private fun createRoulette(onSuccess: (Boolean) -> Unit) {
|
||||
val items = mutableListOf<RouletteItem>()
|
||||
for (option in options) {
|
||||
if (option.title.trim().isEmpty()) {
|
||||
_toastLiveData.value = "옵션은 빈칸을 할 수 없습니다."
|
||||
_isLoading.value = false
|
||||
return
|
||||
}
|
||||
|
||||
fun getRoulette() {
|
||||
items.add(RouletteItem(title = option.title, weight = option.weight))
|
||||
}
|
||||
|
||||
val request = CreateRouletteRequest(
|
||||
can = can,
|
||||
isActive = isActive,
|
||||
items = items
|
||||
)
|
||||
|
||||
compositeDisposable.add(
|
||||
repository.createRoulette(
|
||||
request = request,
|
||||
token = "Bearer ${SharedPreferenceManager.token}"
|
||||
)
|
||||
.subscribeOn(Schedulers.io())
|
||||
.observeOn(AndroidSchedulers.mainThread())
|
||||
.subscribe(
|
||||
{
|
||||
_isLoading.value = false
|
||||
if (it.success && it.data != null && it.data is Boolean) {
|
||||
val message = if (it.data) {
|
||||
"룰렛을 활성화 했습니다."
|
||||
} else {
|
||||
"룰렛을 비활성화 했습니다."
|
||||
}
|
||||
_toastLiveData.postValue(message)
|
||||
onSuccess(it.data)
|
||||
} else {
|
||||
if (it.message != null) {
|
||||
_toastLiveData.postValue(it.message)
|
||||
} else {
|
||||
_toastLiveData.postValue(
|
||||
"알 수 없는 오류가 발생했습니다. 다시 시도해 주세요."
|
||||
)
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
_isLoading.value = false
|
||||
it.message?.let { message -> Logger.e(message) }
|
||||
_toastLiveData.postValue("알 수 없는 오류가 발생했습니다. 다시 시도해 주세요.")
|
||||
}
|
||||
)
|
||||
)
|
||||
}
|
||||
|
||||
fun getAllRoulette() {
|
||||
if (!_isLoading.value!!) {
|
||||
_isLoading.value = true
|
||||
compositeDisposable.add(
|
||||
repository.getRoulette(
|
||||
repository.getAllRoulette(
|
||||
creatorId = SharedPreferenceManager.userId,
|
||||
token = "Bearer ${SharedPreferenceManager.token}"
|
||||
)
|
||||
|
@ -182,30 +258,9 @@ class RouletteSettingsViewModel(private val repository: RouletteRepository) : Ba
|
|||
{
|
||||
if (it.success) {
|
||||
val data = it.data
|
||||
|
||||
if (data != null && data.items.isNotEmpty()) {
|
||||
_isActiveLiveData.value = data.isActive
|
||||
_canLiveData.value = data.can
|
||||
|
||||
isActive = data.isActive
|
||||
can = data.can
|
||||
|
||||
val options = data.items.asSequence().map { item ->
|
||||
RouletteOption(title = item.title, weight = item.weight)
|
||||
}.toList()
|
||||
removeAllAndAddOptions(options = options)
|
||||
recalculatePercentages(options)
|
||||
} else {
|
||||
_isActiveLiveData.value = false
|
||||
_canLiveData.value = 0
|
||||
|
||||
isActive = false
|
||||
can = 0
|
||||
|
||||
options.add(RouletteOption(title = "", weight = 1))
|
||||
options.add(RouletteOption(title = "", weight = 1))
|
||||
recalculatePercentages(options)
|
||||
}
|
||||
rouletteList.clear()
|
||||
rouletteList.addAll(data ?: listOf())
|
||||
selectRoulette(SelectedRoulette.ROULETTE_1)
|
||||
} else {
|
||||
if (it.message != null) {
|
||||
_toastLiveData.postValue(it.message)
|
||||
|
@ -227,6 +282,56 @@ class RouletteSettingsViewModel(private val repository: RouletteRepository) : Ba
|
|||
}
|
||||
}
|
||||
|
||||
fun selectRoulette(selectedRoulette: SelectedRoulette) {
|
||||
if (
|
||||
rouletteList.isEmpty() &&
|
||||
(
|
||||
selectedRoulette == SelectedRoulette.ROULETTE_2 ||
|
||||
selectedRoulette == SelectedRoulette.ROULETTE_3
|
||||
)
|
||||
) {
|
||||
_toastLiveData.value = "룰렛 1만 선택 가능"
|
||||
return
|
||||
}
|
||||
|
||||
if (rouletteList.size == 1 && selectedRoulette == SelectedRoulette.ROULETTE_3) {
|
||||
_toastLiveData.value = "룰렛 1, 룰렛 2만 선택 가능"
|
||||
return
|
||||
}
|
||||
|
||||
if (_selectedRouletteLiveData.value != selectedRoulette) {
|
||||
_selectedRouletteLiveData.value = selectedRoulette
|
||||
|
||||
if (rouletteList.size > selectedRoulette.ordinal) {
|
||||
val roulette = rouletteList[selectedRoulette.ordinal]
|
||||
_canLiveData.value = roulette.can
|
||||
_isActiveLiveData.value = roulette.isActive
|
||||
|
||||
can = roulette.can
|
||||
rouletteId = roulette.id
|
||||
isActive = roulette.isActive
|
||||
|
||||
val options = roulette.items.asSequence().map { item ->
|
||||
RouletteOption(title = item.title, weight = item.weight)
|
||||
}.toList()
|
||||
removeAllAndAddOptions(options = options)
|
||||
recalculatePercentages(options)
|
||||
} else {
|
||||
_canLiveData.value = 0
|
||||
_isActiveLiveData.value = false
|
||||
|
||||
can = 0
|
||||
rouletteId = 0
|
||||
isActive = false
|
||||
|
||||
options.clear()
|
||||
options.add(RouletteOption(title = "", weight = 1))
|
||||
options.add(RouletteOption(title = "", weight = 1))
|
||||
recalculatePercentages(options)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private fun removeAllAndAddOptions(options: List<RouletteOption>) {
|
||||
this.options.clear()
|
||||
this.options.addAll(options)
|
||||
|
|
|
@ -0,0 +1,11 @@
|
|||
package kr.co.vividnext.sodalive.live.roulette.config
|
||||
|
||||
import com.google.gson.annotations.SerializedName
|
||||
import kr.co.vividnext.sodalive.live.roulette.RouletteItem
|
||||
|
||||
data class UpdateRouletteRequest(
|
||||
@SerializedName("id") val id: Long,
|
||||
@SerializedName("can") val can: Int,
|
||||
@SerializedName("isActive") val isActive: Boolean,
|
||||
@SerializedName("items") val items: List<RouletteItem>
|
||||
)
|
|
@ -20,6 +20,99 @@
|
|||
android:orientation="vertical"
|
||||
android:paddingHorizontal="13.3dp">
|
||||
|
||||
<LinearLayout
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginTop="26.7dp"
|
||||
android:orientation="horizontal">
|
||||
|
||||
<LinearLayout
|
||||
android:id="@+id/ll_select_roulette_1"
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_weight="1"
|
||||
android:background="@drawable/bg_round_corner_6_7_13181b"
|
||||
android:gravity="center"
|
||||
android:paddingVertical="14.3dp">
|
||||
|
||||
<ImageView
|
||||
android:id="@+id/iv_select_roulette_1"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginEnd="6.7dp"
|
||||
android:contentDescription="@null"
|
||||
android:src="@drawable/ic_select_check"
|
||||
android:visibility="gone" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/tv_select_roulette_1"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:fontFamily="@font/gmarket_sans_bold"
|
||||
android:text="룰렛 1"
|
||||
android:textColor="@color/color_3bb9f1"
|
||||
android:textSize="14.7sp" />
|
||||
</LinearLayout>
|
||||
|
||||
<LinearLayout
|
||||
android:id="@+id/ll_select_roulette_2"
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginStart="13.3dp"
|
||||
android:layout_weight="1"
|
||||
android:background="@drawable/bg_round_corner_6_7_13181b"
|
||||
android:gravity="center"
|
||||
android:paddingVertical="14.3dp">
|
||||
|
||||
<ImageView
|
||||
android:id="@+id/iv_select_roulette_2"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginEnd="6.7dp"
|
||||
android:contentDescription="@null"
|
||||
android:src="@drawable/ic_select_check"
|
||||
android:visibility="gone" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/tv_select_roulette_2"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:fontFamily="@font/gmarket_sans_bold"
|
||||
android:text="룰렛 2"
|
||||
android:textColor="@color/color_3bb9f1"
|
||||
android:textSize="14.7sp" />
|
||||
</LinearLayout>
|
||||
|
||||
<LinearLayout
|
||||
android:id="@+id/ll_select_roulette_3"
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginStart="13.3dp"
|
||||
android:layout_weight="1"
|
||||
android:background="@drawable/bg_round_corner_6_7_13181b"
|
||||
android:gravity="center"
|
||||
android:paddingVertical="14.3dp">
|
||||
|
||||
<ImageView
|
||||
android:id="@+id/iv_select_roulette_3"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginEnd="6.7dp"
|
||||
android:contentDescription="@null"
|
||||
android:src="@drawable/ic_select_check"
|
||||
android:visibility="gone" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/tv_select_roulette_3"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:fontFamily="@font/gmarket_sans_bold"
|
||||
android:text="룰렛 3"
|
||||
android:textColor="@color/color_3bb9f1"
|
||||
android:textSize="14.7sp" />
|
||||
</LinearLayout>
|
||||
</LinearLayout>
|
||||
|
||||
<RelativeLayout
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
|
|
Loading…
Reference in New Issue