feat:完善红包入口逻辑

feat:初步可以领取红包
This commit is contained in:
Max
2023-10-27 02:10:55 +08:00
parent 5ef9be75d2
commit b9a2f03184
21 changed files with 1178 additions and 134 deletions

View File

@@ -77,18 +77,17 @@ class RedPackageOpenDialog : BaseDialog<DialogRedPackageOpenBinding>() {
@SuppressLint("CheckResult")
private fun startRedPacketAnim(v: View) {
RedPackageModel.openRedPackage(redPackageNotifyInfo.redEnvelopeId)
RedPackageModel.openRedPackage(redPackageNotifyInfo.redEnvelopeId.toLong())
.subscribe({
redPackageInfo = it
if (mObjectAnimator?.isRunning == false) {
openRedPackage()
}
}
, {
binding?.ivOpen?.isEnabled = true
mObjectAnimator?.cancel()
SingleToastUtil.showToast(it.message)
})
}, {
binding?.ivOpen?.isEnabled = true
mObjectAnimator?.cancel()
SingleToastUtil.showToast(it.message)
})
mObjectAnimator = ObjectAnimator.ofFloat(v, "rotationY", 0f, 360f)
mObjectAnimator?.let {
@@ -120,31 +119,45 @@ class RedPackageOpenDialog : BaseDialog<DialogRedPackageOpenBinding>() {
binding?.clOpened?.visibility = View.VISIBLE
binding?.clRed?.visibility = View.GONE
binding?.tvNicknameOpened?.text = redPackageNotifyInfo.sendUserNick
ImageLoadUtils.loadAvatar(context, redPackageNotifyInfo.sendUserAvatar, binding?.ivAvatarOpened)
ImageLoadUtils.loadAvatar(
context,
redPackageNotifyInfo.sendUserAvatar,
binding?.ivAvatarOpened
)
packageInfo.redEnvelopeVO?.apply {
binding?.tvContentOpened?.text = message
when (packageInfo.redEnvelopeState) {
SUCCESS -> {
packageInfo.redEnvelopeItemVOs?.firstOrNull { item -> item.userVO.uid == UserUtils.getUserUid() }?.let {
it.redEnvelopeGiftItemVOs?.apply {
if (!isEmpty()) {
val adapter = RedPackageGiftAdapter(R.layout.item_red_package_gift_top)
binding?.rvGift?.visibility = View.VISIBLE
binding?.tvDiamondNum?.visibility = View.GONE
binding?.rvGift?.layoutManager = LinearLayoutManager(context, RecyclerView.HORIZONTAL, false)
binding?.rvGift?.adapter = adapter
adapter.setNewData(this)
binding?.tvTips?.setTextColor(Color.WHITE)
binding?.tvTips?.text = MessageView.SpannableBuilder(binding?.tvTips)
.append(ResUtil.getString(R.string.avroom_redpackage_redpackageopendialog_03))
.append(it.amount, ForegroundColorSpan(Color.parseColor("#FDCD00")))
.append(ResUtil.getString(R.string.avroom_redpackage_redpackageopendialog_04))
.build()
packageInfo.redEnvelopeItemVOs?.firstOrNull { item -> item.userVO.uid == UserUtils.getUserUid() }
?.let {
it.redEnvelopeGiftItemVOs?.apply {
if (!isEmpty()) {
val adapter =
RedPackageGiftAdapter(R.layout.item_red_package_gift_top)
binding?.rvGift?.visibility = View.VISIBLE
binding?.tvDiamondNum?.visibility = View.GONE
binding?.rvGift?.layoutManager = LinearLayoutManager(
context,
RecyclerView.HORIZONTAL,
false
)
binding?.rvGift?.adapter = adapter
adapter.setNewData(this)
binding?.tvTips?.setTextColor(Color.WHITE)
binding?.tvTips?.text =
MessageView.SpannableBuilder(binding?.tvTips)
.append(ResUtil.getString(R.string.avroom_redpackage_redpackageopendialog_03))
.append(
it.amount,
ForegroundColorSpan(Color.parseColor("#FDCD00"))
)
.append(ResUtil.getString(R.string.avroom_redpackage_redpackageopendialog_04))
.build()
}
}
binding?.tvDiamondNum?.text = it.amount.substringBefore(".")
}
binding?.tvDiamondNum?.text = it.amount.substringBefore(".")
}
if (!AvRoomDataManager.get().isRoomFans){
if (!AvRoomDataManager.get().isRoomFans) {
AvRoomDataManager.get().roomUid.let {
CollectionRoomModel.get().followRoom("1", it)
.subscribe { _: String? ->
@@ -154,6 +167,7 @@ class RedPackageOpenDialog : BaseDialog<DialogRedPackageOpenBinding>() {
}
}
}
TIME_OUT, REMAIN_ZERO, TIME_OUT_BACK -> {
binding?.clOpened?.setBackgroundResource(R.drawable.room_red_package_get_bg)
binding?.tvDiamondNum?.visibility = View.GONE

View File

@@ -9,15 +9,19 @@ import androidx.constraintlayout.widget.ConstraintLayout
import androidx.core.view.isVisible
import androidx.lifecycle.Observer
import com.chuhai.utils.ServiceTime
import com.chuhai.utils.ktx.singleClick
import com.yizhuan.erban.R
import com.yizhuan.erban.avroom.redpackage.open.RedPackageOpenDialog2
import com.yizhuan.xchat_android_core.redpackage.RedPackageModel
import com.yizhuan.xchat_android_core.redpackage.RedPackageNotifyInfo
import com.yizhuan.xchat_android_core.support.room.RoomContext
import com.yizhuan.xchat_android_core.support.room.RoomView
import com.yizhuan.xchat_android_core.support.room.RoomWidget
import io.reactivex.Observable
import io.reactivex.android.schedulers.AndroidSchedulers
import io.reactivex.disposables.CompositeDisposable
import io.reactivex.disposables.Disposable
import java.lang.RuntimeException
import okhttp3.internal.toLongOrDefault
import java.text.SimpleDateFormat
import java.util.TimeZone
import java.util.concurrent.TimeUnit
@@ -29,7 +33,9 @@ import java.util.concurrent.TimeUnit
class RedPackageWidget : ConstraintLayout, RoomWidget {
private var roomView: RoomView? = null
private var textView: TextView? = null
private var numView: TextView? = null
private var countDownDisposable: Disposable? = null
private var data: RedPackageNotifyInfo? = null
// 倒计时格式(分:秒)
private val mmssFormat by lazy(LazyThreadSafetyMode.NONE) {
@@ -51,6 +57,8 @@ class RedPackageWidget : ConstraintLayout, RoomWidget {
}
}
private val compositeDisposable = CompositeDisposable()
constructor(context: Context) : super(context)
constructor(context: Context, attrs: AttributeSet?) : super(context, attrs)
constructor(context: Context, attrs: AttributeSet?, defStyleAttr: Int) : super(
@@ -72,7 +80,13 @@ class RedPackageWidget : ConstraintLayout, RoomWidget {
LayoutInflater.from(context)
.inflate(R.layout.red_package_widget, this, true)
textView = findViewById(R.id.tv_text)
numView = findViewById(R.id.tv_num)
this.setBackgroundResource(R.drawable.red_package_widget_bg)
singleClick {
data?.let {
tryShowRedPackage(it)
}
}
}
/**
@@ -85,23 +99,19 @@ class RedPackageWidget : ConstraintLayout, RoomWidget {
switchUI(false)
return
}
logD("startCountDown() count:$count")
countDownDisposable = Observable.intervalRange(0, count, 0, 500L, TimeUnit.MILLISECONDS)
.observeOn(AndroidSchedulers.mainThread())
.doOnNext {
val gap = time - ServiceTime.time
if (gap >= 0) {
textView?.text = mmssFormat.format(gap)
} else {
switchUI(false)
throw RuntimeException("状态已更新")
countDownDisposable =
Observable.intervalRange(0, count / 1000, 0, 1000L, TimeUnit.MILLISECONDS)
.observeOn(AndroidSchedulers.mainThread())
.doOnNext {
val gap = time - ServiceTime.time
if (gap >= 0) {
textView?.text = mmssFormat.format(gap)
}
}
}
.doOnComplete {
logD("doOnComplete()")
switchUI(false)
}
.subscribe()
.doOnComplete {
switchUI(false)
}
.subscribe()
}
/**
@@ -144,8 +154,21 @@ class RedPackageWidget : ConstraintLayout, RoomWidget {
* 更新数据
*/
private fun loadData(data: RedPackageNotifyInfo?) {
logD("loadData() data:$data")
this.data = data
stopCountDown()
if (data != null) {
val num = data.redEnvelopeNum
if (num > 0) {
if (num > 99) {
numView?.text = "99+"
} else {
numView?.text = num.toString()
}
numView?.isVisible = true
} else {
numView?.isVisible = false
}
if (data.validityType == 1) {
// 限时生效
switchUI(true)
@@ -160,7 +183,23 @@ class RedPackageWidget : ConstraintLayout, RoomWidget {
}
}
/**
* 尝试展示红包
*/
private fun tryShowRedPackage(data: RedPackageNotifyInfo) {
val disposable = RedPackageModel.getRedPackage(data.redEnvelopeId.toLongOrDefault(0))
.subscribe({ data ->
roomView?.getActivity().let {
RedPackageOpenDialog2.newInstance(data).show(it)
}
}, {
// TODO 待实现
})
compositeDisposable.add(disposable)
}
override fun onStop() {
compositeDisposable.dispose()
RoomContext.contextLiveData.removeObserver(contextObserver)
stopCountDown()
this.roomView = null

View File

@@ -6,17 +6,39 @@ import android.animation.AnimatorListenerAdapter
import android.animation.ObjectAnimator
import android.animation.ValueAnimator
import android.annotation.SuppressLint
import android.os.Bundle
import android.view.View
import android.view.WindowManager
import android.view.animation.AccelerateDecelerateInterpolator
import androidx.core.view.isVisible
import com.chuhai.utils.ServiceTime
import com.chuhai.utils.ktx.getColorById
import com.chuhai.utils.ktx.singleClick
import com.chuhai.utils.ktx.toStringRes
import com.chuhai.utils.spannable.spannableBuilder
import com.trello.rxlifecycle3.android.FragmentEvent
import com.yizhuan.erban.R
import com.yizhuan.erban.avroom.redpackage.RedPackageOpenDialog
import com.yizhuan.erban.base.BaseDialog
import com.yizhuan.erban.databinding.RedPackageOpenDialogBinding
import com.yizhuan.erban.ui.utils.loadAvatar
import com.yizhuan.erban.utils.UserUtils
import com.yizhuan.xchat_android_core.auth.AuthModel
import com.yizhuan.xchat_android_core.home.event.FollowRoomEvent
import com.yizhuan.xchat_android_core.home.model.CollectionRoomModel
import com.yizhuan.xchat_android_core.manager.AvRoomDataManager
import com.yizhuan.xchat_android_core.pay.PayModel
import com.yizhuan.xchat_android_core.redpackage.*
import com.yizhuan.xchat_android_core.support.config.Constants
import com.yizhuan.xchat_android_library.annatation.ActLayoutRes
import com.yizhuan.xchat_android_library.utils.SingleToastUtil
import io.reactivex.Observable
import io.reactivex.android.schedulers.AndroidSchedulers
import io.reactivex.disposables.Disposable
import org.greenrobot.eventbus.EventBus
import java.text.SimpleDateFormat
import java.util.TimeZone
import java.util.concurrent.TimeUnit
/**
* Created by Max on 2023/10/24 10:14
@@ -25,7 +47,36 @@ import com.yizhuan.xchat_android_library.utils.SingleToastUtil
@ActLayoutRes(R.layout.red_package_open_dialog)
class RedPackageOpenDialog2 : BaseDialog<RedPackageOpenDialogBinding>() {
private var mObjectAnimator: ObjectAnimator? = null
private var btnAnimator: ObjectAnimator? = null
private var countDownDisposable: Disposable? = null
// 倒计时格式(分:秒)
private val mmssFormat by lazy(LazyThreadSafetyMode.NONE) {
SimpleDateFormat("mm:ss").apply {
timeZone = TimeZone.getTimeZone("GMT+00:00")
}
}
private val data by lazy(LazyThreadSafetyMode.NONE) {
arguments?.getSerializable(Constants.KEY_INTENT) as? RedPackageData
}
// 打开红包的结果
private var openResultRunnable: (() -> Unit)? = null
// 按钮动画是否有效(至少转过了一周期)
private var isValidOfBtnAnimator: Boolean = false
companion object {
fun newInstance(data: RedPackageData): RedPackageOpenDialog2 {
return RedPackageOpenDialog2().apply {
arguments = Bundle().apply {
putSerializable(Constants.KEY_INTENT, data)
}
}
}
}
override fun onStart() {
width = WindowManager.LayoutParams.MATCH_PARENT
@@ -34,36 +85,275 @@ class RedPackageOpenDialog2 : BaseDialog<RedPackageOpenDialogBinding>() {
}
override fun init() {
val data = this.data
if (data == null) {
dismissAllowingStateLoss()
return
}
dialog?.setCanceledOnTouchOutside(false)
binding.ivClose.setOnClickListener {
binding.ivClose.singleClick {
dismissAllowingStateLoss()
}
binding.layoutBtn.setOnClickListener {
startRedPacketAnim(it)
binding.layoutBtn.singleClick {
openRedPackage(data)
}
loadData(data)
}
/**
* 加载红包数据
*/
private fun loadData(data: RedPackageData) {
// 默认不可见先
binding.groupOpen.isVisible = true
binding.groupResult.isVisible = false
binding.ivSendAvatar.loadAvatar(data.avatar)
binding.tvSendName.text = data.nick
loadTips(data)
loadBtnState(data)
}
/**
* 加载红包提示
*/
private fun loadTips(data: RedPackageData) {
binding.tvOpenTips.isVisible = false
when (data.kind) {
2 -> {
binding.tvOpenTips.setText(R.string.red_package_open_tips_follow)
binding.tvOpenTips.isVisible = true
}
3 -> {
binding.tvOpenTips.setText(R.string.red_package_open_tips_share)
binding.tvOpenTips.isVisible = true
}
4 -> {
binding.tvOpenTips.spannableBuilder()
.appendText(text = R.string.red_package_open_tips_msg1.toStringRes())
.appendText(
text = data.message ?: "",
textColor = getColorById(R.color.color_FFF87A)
)
.appendText(text = R.string.red_package_open_tips_msg2.toStringRes()).apply()
binding.tvOpenTips.isVisible = true
}
else -> {
loadTips(data.message)
}
}
}
/**
* 加载按钮状态
*/
private fun loadBtnState(data: RedPackageData) {
binding.groupBtnTime.isVisible = false
binding.ivBtnGet.isVisible = false
binding.tvBtnMsg.isVisible = false
binding.layoutBtn.isEnabled = false
val gap = (data.beginTime ?: 0) - ServiceTime.time
// 开始了?
val started = gap < 0
if (data.kind == 0) {
// 旧厅内红包or全服红包
switchToOpenState()
return
}
if (data.kind == 1 || data.finish == true) {
if (started) {
switchToOpenState()
} else {
startCountDown(data.beginTime ?: 0)
}
} else {
binding.tvBtnMsg.isVisible = true
if (started) {
binding.tvBtnMsg.setText(R.string.red_package_open_btn_no)
} else {
when (data.kind) {
2 -> {
binding.tvBtnMsg.setText(R.string.red_package_open_btn_follow)
}
3 -> {
binding.tvBtnMsg.setText(R.string.red_package_open_btn_share)
}
4 -> {
binding.tvBtnMsg.setText(R.string.red_package_open_btn_msg)
}
else -> {
binding.tvBtnMsg.text = ""
}
}
}
}
}
/**
* 开始倒计时
* @param time 开抢时间
*/
private fun startCountDown(time: Long) {
stopCountDown()
val count = time - ServiceTime.time
if (count <= 0) {
switchToOpenState()
return
}
binding.groupBtnTime.isVisible = true
countDownDisposable =
Observable.intervalRange(0, count / 1000, 0, 1000L, TimeUnit.MILLISECONDS)
.observeOn(AndroidSchedulers.mainThread())
.doOnNext {
val gap = time - ServiceTime.time
if (gap >= 0) {
binding.tvBtnTime.text = mmssFormat.format(gap)
}
}
.doOnComplete {
switchToOpenState()
}
.subscribe()
}
private fun stopCountDown() {
if (countDownDisposable?.isDisposed == false) {
countDownDisposable?.dispose()
}
}
/**
* 切换为可抢状态
*/
private fun switchToOpenState() {
binding.tvBtnMsg.isVisible = false
binding.groupBtnTime.isVisible = false
binding.ivBtnGet.isVisible = true
binding.layoutBtn.isEnabled = true
}
private fun loadTips(msg: String?) {
if (msg.isNullOrEmpty()) {
binding.tvOpenTips.isVisible = false
} else {
binding.tvOpenTips.text = msg
binding.tvOpenTips.isVisible = true
}
}
/**
* 打开红包
*/
private fun openRedPackage(data: RedPackageData) {
binding.layoutBtn.isEnabled = false
openResultRunnable = null
startRedPacketAnim(binding.layoutBtn)
RedPackageModel.openRedPackage(data.id ?: 0)
.compose(bindUntilEvent(FragmentEvent.DESTROY_VIEW)).subscribe({
if (isValidOfBtnAnimator) {
btnAnimator?.cancel()
openSuccess(it)
} else {
openResultRunnable = {
openSuccess(it)
}
}
}, {
if (isValidOfBtnAnimator) {
btnAnimator?.cancel()
openFail(it)
} else {
openResultRunnable = {
openFail(it)
}
}
})
}
/**
* 打开红包响应成功
* @param data 结果
*/
private fun openSuccess(data: RedPackageInfo) {
binding.layoutContent.setBackgroundResource(R.drawable.red_package_result_bg)
binding.groupOpen.isVisible = false
binding.groupResult.isVisible = true
binding.tvResultEmptyTips.isVisible = false
binding.ivResultSendAvatar.loadAvatar(data.redEnvelopeVO?.userVO?.avatar)
binding.tvResultSendName.text = data.redEnvelopeVO?.userVO?.nick ?: ""
binding.tvMessage.text = data.redEnvelopeVO?.message
binding.tvCount.text = R.string.red_package_result_count_format.toStringRes()
.format(data.redEnvelopeVO?.pickNum ?: 0, data.redEnvelopeVO?.totalNum ?: 0)
val adapter = RedPackageResultAdapter()
binding.recyclerView.adapter = adapter
adapter.setNewData(data.redEnvelopeItemVOs)
PayModel.get().getWalletInfo(AuthModel.get().currentUid).subscribe()
when (data.redEnvelopeState) {
RedEnvelopeState.SUCCESS -> {
val item = data.redEnvelopeItemVOs?.firstOrNull {
it.userVO.uid == UserUtils.getUserUid()
}
binding.tvMoney.text = item?.amount?.substringBefore(".")
// 下面是延续老代码保留的
if (!AvRoomDataManager.get().isRoomFans) {
AvRoomDataManager.get().roomUid.let {
CollectionRoomModel.get().followRoom("1", it)
.subscribe { _: String? ->
AvRoomDataManager.get().isRoomFans = true
EventBus.getDefault().post(FollowRoomEvent())
}
}
}
}
RedEnvelopeState.TIME_OUT, RedEnvelopeState.REMAIN_ZERO, RedEnvelopeState.TIME_OUT_BACK -> {
binding.groupResultMoney.isVisible = false
binding.tvResultEmptyTips.isVisible = true
}
}
}
/**
* 打开红包响应失败
*/
private fun openFail(throwable: Throwable) {
switchToOpenState()
btnAnimator?.cancel()
SingleToastUtil.showToast(throwable.message)
}
@SuppressLint("CheckResult")
private fun startRedPacketAnim(v: View) {
mObjectAnimator = ObjectAnimator.ofFloat(v, "rotationY", 0f, 360f)
mObjectAnimator?.let {
if (btnAnimator?.isRunning == true) {
btnAnimator?.cancel()
}
isValidOfBtnAnimator = false
btnAnimator = ObjectAnimator.ofFloat(v, "rotationY", 0f, 360f)
btnAnimator?.let {
it.duration = 1500
it.repeatCount = ValueAnimator.INFINITE
it.repeatMode = ValueAnimator.RESTART
it.interpolator = AccelerateDecelerateInterpolator()
it.addListener(object : AnimatorListenerAdapter() {
var isCanceled = false
override fun onAnimationCancel(animation: Animator) {
isCanceled = true
}
override fun onAnimationEnd(animation: Animator) {
if (!isCanceled) {
SingleToastUtil.showToast("End")
override fun onAnimationRepeat(animation: Animator) {
super.onAnimationRepeat(animation)
isValidOfBtnAnimator = true
if (openResultRunnable != null) {
animation.cancel()
openResultRunnable?.invoke()
}
}
})
@@ -73,37 +363,13 @@ class RedPackageOpenDialog2 : BaseDialog<RedPackageOpenDialogBinding>() {
override fun onDestroyView() {
super.onDestroyView()
mObjectAnimator?.cancel()
mObjectAnimator = null
btnAnimator?.cancel()
btnAnimator = null
stopCountDown()
}
override fun onPause() {
super.onPause()
dismissAllowingStateLoss()
}
/**
* 待领取状态
*/
private fun switchToPending(data: RedPackageNotifyInfo) {
binding.layoutContent.setBackgroundResource(R.drawable.red_package_open_bg)
binding.groupOpened.isVisible = false
binding.groupOpen.isVisible = true
binding.ivSendAvatar.loadAvatar(data.sendUserAvatar)
binding.tvSendName.text = data.sendUserNick
}
/**
* 打开状态
*/
private fun switchToOpened(data: RedPackageInfo) {
binding.layoutContent.setBackgroundResource(R.drawable.red_package_opened_bg)
binding.groupOpen.isVisible = false
binding.groupOpened.isVisible = true
binding.ivOpenedSendAvatar.loadAvatar(data.redEnvelopeVO?.userVO?.avatar)
binding.tvOpenedSendName.text = data.redEnvelopeVO?.userVO?.nick ?: ""
binding.tvMoney.text = ""
}
}

View File

@@ -0,0 +1,43 @@
package com.yizhuan.erban.avroom.redpackage.open
import android.graphics.Color
import android.widget.ImageView
import com.chad.library.adapter.base.BaseQuickAdapter
import com.chad.library.adapter.base.BaseViewHolder
import com.yizhuan.erban.R
import com.yizhuan.erban.ui.utils.loadAvatar
import com.yizhuan.erban.utils.UserUtils
import com.yizhuan.xchat_android_core.redpackage.RedEnvelopeItemVO
import com.yizhuan.xchat_android_core.utils.subAndReplaceDot
import com.yizhuan.xchat_android_library.utils.ResUtil
import java.text.SimpleDateFormat
import java.util.Locale
/**
* Created by Max on 2023/10/27 20:24
* Desc:红包领取结果
**/
class RedPackageResultAdapter :
BaseQuickAdapter<RedEnvelopeItemVO, BaseViewHolder>(R.layout.red_package_open_item_result) {
private val dateFormat = SimpleDateFormat(
ResUtil.getString(R.string.avroom_redpackage_redpackageopenadapter_01),
Locale.CHINA
)
override fun convert(helper: BaseViewHolder, item: RedEnvelopeItemVO) {
helper.getView<ImageView>(R.id.iv_avatar).loadAvatar(item.userVO.avatar)
val isSelf = item.userVO.uid == UserUtils.getUserUid()
helper.setText(
R.id.tv_name,
if (isSelf) ResUtil.getString(R.string.avroom_redpackage_redpackageopenadapter_02) else item.userVO.nick.subAndReplaceDot(
6
)
)
helper.setText(R.id.tv_money, item.amount.substringBefore("."))
try {
helper.setText(R.id.tv_time, dateFormat.format(item.createTime))
} catch (e: Exception) {
helper.setText(R.id.tv_time, "")
}
}
}

View File

@@ -36,7 +36,7 @@ class PublicRedPackageEditorFragment : BaseBindingFragment<RedPackagePublicFragm
mBinding.etText.addDisableFilter("\n")
mBinding.etText.setOnInputChangedListener {
mBinding.tvTextLength.text =
R.string.red_package_opened_count_format.toStringRes().format(this, 20)
R.string.red_package_result_count_format.toStringRes().format(this, 20)
true
}

View File

Before

Width:  |  Height:  |  Size: 115 KiB

After

Width:  |  Height:  |  Size: 115 KiB

View File

@@ -0,0 +1,9 @@
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle"
android:useLevel="false">
<corners android:radius="6dp" />
<solid android:color="#FFF44646" />
</shape>

View File

@@ -2,6 +2,6 @@
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<corners android:radius="28dp"/>
<corners android:radius="8dp"/>
<solid android:color="#FFE03654"/>
</shape>

View File

@@ -170,7 +170,8 @@
android:id="@+id/group_open"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:constraint_referenced_ids="layout_btn,iv_send_avatar,tv_send_name,tv_open_tips" />
app:constraint_referenced_ids="layout_btn,iv_send_avatar,tv_send_name,tv_open_tips"
tools:visibility="visible" />
<androidx.constraintlayout.widget.Guideline
android:id="@+id/line_money_top"
@@ -180,7 +181,14 @@
app:layout_constraintGuide_percent="0.1909" />
<androidx.constraintlayout.widget.Guideline
android:id="@+id/line_opened_send_avatar_top"
android:id="@+id/line_empty_tips_top"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal"
app:layout_constraintGuide_percent="0.236" />
<androidx.constraintlayout.widget.Guideline
android:id="@+id/line_result_send_avatar_top"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal"
@@ -222,37 +230,50 @@
android:id="@+id/tv_money_tips"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/red_package_opened_money_tips"
android:text="@string/red_package_result_money_tips"
android:textColor="@color/color_767585"
android:textSize="12sp"
android:textSize="12dp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/tv_money" />
<TextView
android:id="@+id/tv_result_empty_tips"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/red_package_result_empty_tips"
android:textColor="@color/color_767585"
android:textSize="12dp"
android:visibility="gone"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="@id/line_empty_tips_top"
tools:visibility="visible" />
<com.yizhuan.erban.common.widget.CircleImageView
android:id="@+id/iv_opened_send_avatar"
android:id="@+id/iv_result_send_avatar"
android:layout_width="26dp"
android:layout_height="26dp"
app:cborder_color="@color/white"
app:cborder_width="1dp"
app:layout_constraintEnd_toStartOf="@id/tv_opened_send_name"
app:layout_constraintEnd_toStartOf="@id/tv_result_send_name"
app:layout_constraintHorizontal_chainStyle="packed"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="@id/line_opened_send_avatar_top"
app:layout_constraintTop_toTopOf="@id/line_result_send_avatar_top"
tools:src="@drawable/default_avatar" />
<TextView
android:id="@+id/tv_opened_send_name"
android:id="@+id/tv_result_send_name"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="3dp"
android:maxLines="1"
android:textColor="@color/white"
android:textSize="14sp"
app:layout_constraintBottom_toBottomOf="@id/iv_opened_send_avatar"
android:textSize="14dp"
app:layout_constraintBottom_toBottomOf="@id/iv_result_send_avatar"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toEndOf="@id/iv_opened_send_avatar"
app:layout_constraintTop_toTopOf="@id/iv_opened_send_avatar"
app:layout_constraintStart_toEndOf="@id/iv_result_send_avatar"
app:layout_constraintTop_toTopOf="@id/iv_result_send_avatar"
tools:text="Name" />
<TextView
@@ -266,10 +287,10 @@
android:maxLines="1"
android:text="@string/red_package_msg_def"
android:textColor="@color/white"
android:textSize="14sp"
android:textSize="14dp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/iv_opened_send_avatar" />
app:layout_constraintTop_toBottomOf="@id/iv_result_send_avatar" />
<TextView
android:id="@+id/tv_count"
@@ -277,9 +298,9 @@
android:layout_height="wrap_content"
android:layout_marginEnd="8dp"
android:alpha="0.8"
android:text="@string/red_package_opened_count_format"
android:text="@string/red_package_result_count_format"
android:textColor="@color/white"
android:textSize="10sp"
android:textSize="10dp"
app:layout_constraintEnd_toEndOf="@id/recyclerView"
app:layout_constraintTop_toBottomOf="@id/line_count_top" />
@@ -289,7 +310,7 @@
android:layout_height="0dp"
android:layout_marginTop="8dp"
android:layout_marginBottom="5dp"
android:background="@drawable/shape_e03654_28"
android:background="@drawable/shape_e03654_8"
android:orientation="vertical"
app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager"
app:layout_constraintBottom_toTopOf="@id/tv_count"
@@ -297,14 +318,23 @@
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/tv_message"
app:layout_constraintWidth_percent="0.6819"
tools:listitem="@layout/red_package_open_item_record" />
tools:listitem="@layout/red_package_open_item_result" />
<androidx.constraintlayout.widget.Group
android:id="@+id/group_opened"
android:id="@+id/group_result_money"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:visibility="gone"
app:constraint_referenced_ids="recyclerView,tv_count,tv_message,tv_opened_send_name,iv_opened_send_avatar,tv_money,tv_money_tips,iv_money" />
app:constraint_referenced_ids="tv_money,tv_money_tips,iv_money"
tools:visibility="visible" />
<androidx.constraintlayout.widget.Group
android:id="@+id/group_result"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:visibility="gone"
app:constraint_referenced_ids="recyclerView,tv_count,tv_message,tv_result_send_name,iv_result_send_avatar,tv_money,tv_money_tips,iv_money,tv_result_empty_tips"
tools:visibility="gone" />
</androidx.constraintlayout.widget.ConstraintLayout>
</androidx.constraintlayout.widget.ConstraintLayout>

View File

@@ -4,9 +4,9 @@
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:layout_width="58dp"
tools:layout_height="58dp"
android:background="@drawable/red_package_widget_bg"
tools:layout_height="58dp"
tools:layout_width="58dp"
tools:parentTag="androidx.constraintlayout.widget.ConstraintLayout">
<TextView
@@ -16,6 +16,7 @@
android:layout_marginBottom="10dp"
android:background="@drawable/red_package_widget_bg_text"
android:gravity="center"
android:includeFontPadding="false"
android:text="@string/red_package_widget_get"
android:textColor="@color/white"
android:textSize="9dp"
@@ -23,4 +24,20 @@
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent" />
<TextView
android:id="@+id/tv_num"
android:layout_width="wrap_content"
android:layout_height="12dp"
android:layout_marginTop="4dp"
android:layout_marginEnd="4dp"
android:background="@drawable/red_package_bg_num"
android:gravity="center"
android:includeFontPadding="false"
android:minWidth="12dp"
android:paddingHorizontal="3dp"
android:text="1"
android:textColor="@color/white"
android:textSize="9dp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</merge>

View File

@@ -708,4 +708,5 @@
<color name="color_EBEEF5">#EBEEF5</color>
<color name="color_94959C">#94959C</color>
<color name="color_BF461F">#FFBF461F</color>
<color name="color_FFF87A">#FFFFF87A</color>
</resources>

View File

@@ -5167,8 +5167,18 @@
<string name="red_package_msg_def">恭喜發財,大吉大利!</string>
<string name="red_package_open_btn_await">後開搶</string>
<string name="red_package_open_btn_msg">發彈幕\n搶紅包</string>
<string name="red_package_opened_money_tips">已存入錢包,請到我的收益確認</string>
<string name="red_package_opened_count_format">已領取%s/%s個</string>
<string name="red_package_widget_get">抢红包</string>
<string name="red_package_msg_empty_tips">请输入弹幕内容</string>
<string name="red_package_open_btn_share">分享房間\n搶紅包</string>
<string name="red_package_open_btn_follow">關注主播\n搶紅包</string>
<string name="red_package_open_btn_no">未參與活動</string>
<string name="red_package_result_money_tips">已存入錢包,請到我的收益確認</string>
<string name="red_package_result_count_format">已領取%s/%s個</string>
<string name="red_package_widget_get">搶紅包</string>
<string name="red_package_msg_empty_tips">請輸入彈幕內容</string>
<string name="red_package_open_tips_follow">關注主播可搶紅包</string>
<string name="red_package_open_tips_share">分享房間可搶紅包</string>
<string name="red_package_open_tips_msg1">發送彈幕</string>
<string name="red_package_open_tips_msg2">可搶紅包</string>
<string name="red_package_result_empty_tips">搶完了,下次早點來哦~</string>
</resources>