酒吧房 交友小屋 UI

This commit is contained in:
2026-01-06 14:43:12 +08:00
parent 5cc393fe06
commit d48f13f266
47 changed files with 743 additions and 32 deletions

View File

@@ -77,6 +77,7 @@ import com.xscm.moduleutil.dialog.NewPeopleDialog;
import com.xscm.moduleutil.dialog.RechargeDialogFragment;
import com.xscm.moduleutil.event.RoomOutEvent;
import com.xscm.moduleutil.event.UnreadCountEvent;
import com.xscm.moduleutil.http.RetrofitClient;
import com.xscm.moduleutil.listener.MessageListenerSingleton;
import com.xscm.moduleutil.utils.ARouteConstants;
import com.xscm.moduleutil.utils.BackgroundManager;
@@ -517,7 +518,9 @@ public class MainActivity extends BaseMvpActivity<HomePresenter, ActivityMainBin
//// RoomManager.instance( CommonAppContext.getInstance()).joinRoomWithRoomId(CommonAppContext.getInstance().playId, true);
// return;
// }
RetrofitClient.getInstance().setJoinRoomLoadListener(result -> {
isShowLoading(false);
});
MvpPre.loginIm();
Logger.i("MainActivity", "onResume");
// Beta.checkAppUpgrade(false, false);

View File

@@ -3728,6 +3728,11 @@ class RoomActivity : BaseMvpActivity<RoomPresenter?, ActivityRoomBinding?>(),
setvisibTop(true)
QXRoomSeatViewType.PUB
}
RoomType.PRIVATE_ROOM -> {
changeBackgroundColor(mRoomInfoResp?.room_info?.room_background)
setvisibTop(true)
QXRoomSeatViewType.PRIVATE
}
null -> {
LogUtils.e("@@@", "RoomType is null")
QXRoomSeatViewType.NONE

View File

@@ -0,0 +1,26 @@
package com.xscm.modulemain.activity.room.contacts
import android.app.Activity
import com.xscm.moduleutil.activity.IPresenter
import com.xscm.moduleutil.activity.IView
import com.xscm.moduleutil.bean.GiftBean
import com.xscm.moduleutil.bean.RoonGiftModel
import com.xscm.moduleutil.bean.WalletBean
class PrivateContacts {
interface View : IView<Activity>{
fun wallet(list:List<String>,walletBean: WalletBean?)
fun getGiftList(list: List<RoonGiftModel>)
}
interface Ipre : IPresenter{
fun applyPit(roomId:String,pitNumber:String)
fun getGiftList(roomId: String)
fun wallet(list:List<String>)
}
}

View File

@@ -103,6 +103,7 @@ public class RoomFragment extends BaseMvpFragment<RoomPresenter, FragmentRoomBin
private RoomMentorShipFragment mentorShipFragment;//签约
private RoomPubFragment roomPubFragment;//酒吧
private RoomPrivateFragment roomPrivateFragment;//酒吧交友小屋
public QXRoomSeatViewType qxRoomSeatViewType;
private void setRoomSeatViewType() {
if (mRoomInfoResp == null || mRoomInfoResp.getRoom_info() == null) {
@@ -132,6 +133,8 @@ public class RoomFragment extends BaseMvpFragment<RoomPresenter, FragmentRoomBin
qxRoomSeatViewType = QXRoomSeatViewType.SIGNCONTRACT;
} else if (roomType == RoomType.PUB_ROOM) {
qxRoomSeatViewType = QXRoomSeatViewType.PUB;
}else if (roomType == RoomType.PRIVATE_ROOM) {
qxRoomSeatViewType = QXRoomSeatViewType.PRIVATE;
}
}
@@ -305,6 +308,10 @@ public class RoomFragment extends BaseMvpFragment<RoomPresenter, FragmentRoomBin
if (roomPubFragment == currentFragment && roomPubFragment.isAdded()) {
roomPubFragment.roomInfoUpdate(mRoomInfoResp);
}
}else if (roomType == RoomType.PRIVATE_ROOM) {
if (roomPrivateFragment == currentFragment && roomPrivateFragment.isAdded()) {
roomPrivateFragment.roomInfoUpdate(mRoomInfoResp);
}
}
}
}
@@ -433,6 +440,11 @@ public class RoomFragment extends BaseMvpFragment<RoomPresenter, FragmentRoomBin
roomPubFragment = RoomPubFragment.Companion.newInstance(mRoomInfoResp);
} else roomPubFragment.roomTypeSwitch(mRoomInfoResp);
newFragment = roomPubFragment;
} else if (roomType == RoomType.PRIVATE_ROOM) {
if (roomPrivateFragment == null) {
roomPrivateFragment = RoomPrivateFragment.Companion.newInstance(mRoomInfoResp);
} else roomPrivateFragment.roomTypeSwitch(mRoomInfoResp);
newFragment = roomPrivateFragment;
}
if (newFragment != null) {

View File

@@ -0,0 +1,205 @@
package com.xscm.modulemain.activity.room.fragment
import android.animation.ObjectAnimator
import android.content.res.Resources
import android.os.Bundle
import androidx.fragment.app.Fragment
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.view.ViewGroup.LayoutParams
import android.view.animation.LinearInterpolator
import android.widget.ImageView
import androidx.constraintlayout.widget.ConstraintLayout
import com.blankj.utilcode.util.ActivityUtils
import com.bumptech.glide.Glide
import com.xscm.modulemain.R
import com.xscm.modulemain.activity.room.contacts.PrivateContacts
import com.xscm.modulemain.activity.room.presenter.PrivatePresenter
import com.xscm.modulemain.databinding.FragmentRoomPrivateBinding
import com.xscm.moduleutil.base.BaseMvpFragment
import com.xscm.moduleutil.bean.RoonGiftModel
import com.xscm.moduleutil.bean.WalletBean
import com.xscm.moduleutil.bean.room.RoomInfoResp
import com.xscm.moduleutil.bean.room.RoomUserBean
import com.xscm.moduleutil.utils.ImageUtils
import io.reactivex.Observable
import io.reactivex.android.schedulers.AndroidSchedulers
import java.util.concurrent.TimeUnit
class RoomPrivateFragment(var mRoomInfoResp: RoomInfoResp?) :
BaseMvpFragment<PrivatePresenter, FragmentRoomPrivateBinding>(), PrivateContacts.View {
override fun getLayoutId(): Int {
return R.layout.fragment_room_private
}
override fun bindPresenter(): PrivatePresenter {
return PrivatePresenter(ActivityUtils.getTopActivity(), this)
}
// 无参构造函数
constructor() : this(null)
companion object {
fun newInstance(roomInfoResp: RoomInfoResp): RoomPrivateFragment {
return RoomPrivateFragment(roomInfoResp)
}
}
private var mUserInfo: RoomUserBean? = mRoomInfoResp?.user_info
private var mRoomId: String = mRoomInfoResp?.room_info?.room_id!!
private var giftList: MutableList<RoonGiftModel> = arrayListOf()
private var giftViewList:MutableList<ImageView> = arrayListOf()
override fun initData() {
MvpPre?.getGiftList(mRoomId)
}
override fun initView() {
giftViewList.clear()
giftViewList.add(mBinding?.ivGift1!!)
giftViewList.add(mBinding?.ivGift2!!)
giftViewList.add(mBinding?.ivGift3!!)
giftViewList.add(mBinding?.ivGift4!!)
giftViewList.add(mBinding?.ivGift5!!)
giftViewList.add(mBinding?.ivGift6!!)
giftViewList.forEach { it ->
it.setOnClickListener {
val showList = giftList.shuffled().take(1)
for (i in 0 until showList.size) {
val itemImage = it
val price = showList[i].gift_price.toInt()
// 根据价格设置不同的宽高
val (width, height) = when {
price > 500 -> Pair(64, 64)
price > 100 -> Pair(52, 52)
else -> Pair(40, 40)
}
// 设置布局参数假设itemImage是ImageView
val layoutParams = itemImage.layoutParams
layoutParams.width = width.dpToPx() // 需要实现dp转px的扩展函数
layoutParams.height = height.dpToPx()
itemImage.layoutParams = layoutParams
// 假设 padding 值单位dp
val paddingDp = 8
val paddingPx = paddingDp.dpToPx() // 转换为 px
// 设置 padding左、上、右、下
itemImage.setPadding(paddingPx, paddingPx, paddingPx, paddingPx)
Glide.with(it)
.load(showList[i].base_image)
.into(it as ImageView)
}
}
}
mBinding?.tvBack?.setOnClickListener {
//返回到上一个房间
}
}
fun roomInfoUpdate(roomInfoResp: RoomInfoResp) {
this.mRoomInfoResp = roomInfoResp
mUserInfo = this.mRoomInfoResp?.user_info
mRoomId = this.mRoomInfoResp?.room_info?.room_id!!
}
fun roomTypeSwitch(mRoomInfoResp: RoomInfoResp) {
this.mRoomInfoResp = mRoomInfoResp
mUserInfo = this.mRoomInfoResp?.user_info
mRoomId = this.mRoomInfoResp?.room_info?.room_id!!
initView()
}
override fun wallet(list: List<String>, walletBean: WalletBean?) {
}
override fun getGiftList(list: List<RoonGiftModel>) {
if (giftList.isEmpty()) {
giftList = list.toMutableList()
val showList = list.shuffled().take(6)
for (i in 0 until showList.size) {
val itemImage = giftViewList[i]
val price = showList[i].gift_price.toInt()
// 根据价格设置不同的宽高
val (width, height) = when {
price > 500 -> Pair(64, 64)
price > 100 -> Pair(52, 52)
else -> Pair(40, 40)
}
// 设置布局参数假设itemImage是ImageView
val layoutParams = itemImage.layoutParams
layoutParams.width = width.dpToPx() // 需要实现dp转px的扩展函数
layoutParams.height = height.dpToPx()
itemImage.layoutParams = layoutParams
// 假设 padding 值单位dp
val paddingDp = 8
val paddingPx = paddingDp.dpToPx() // 转换为 px
// 设置 padding左、上、右、下
itemImage.setPadding(paddingPx, paddingPx, paddingPx, paddingPx)
val delay = 200L * i
Glide.with(giftViewList[i])
.load(showList[i].base_image)
.into(giftViewList[i])
Observable.timer(delay,TimeUnit.MILLISECONDS).observeOn(AndroidSchedulers.mainThread()).subscribe {
startSmallFloatingAnimation(giftViewList[i]) // 延迟后执行动画
}
}
}else{
giftList.clear()
giftList = list.toMutableList()
}
}
fun startSmallFloatingAnimation(view: View, floatRangeDp: Float = 10f) {
// 1. 计算飘动范围(默认 ±10dp可调整
val floatDistance = floatRangeDp.dpToPx() // 转换为像素
// 2. 创建 ObjectAnimatorY 轴从 0 → -floatDistance → 0 → floatDistance → 0
val animator = ObjectAnimator.ofFloat(
view,
"translationY",
0f,
floatDistance,
0f,
-floatDistance,
0f
)
// 3. 设置动画参数
animator.duration = 2000 // 2秒完成一个周期
animator.repeatCount = ObjectAnimator.INFINITE // 无限循环
animator.interpolator = LinearInterpolator() // 匀速运动(可改用 AccelerateDecelerateInterpolator
// 4. 开始动画
animator.start()
}
// 在项目的任意工具类文件中(如 Extensions.kt
fun Int.dpToPx(): Int {
return (this * Resources.getSystem().displayMetrics.density).toInt()
}
fun Float.dpToPx(): Float {
return (this * Resources.getSystem().displayMetrics.density).toFloat()
}
}

View File

@@ -77,17 +77,14 @@ class RoomPubFragment(var mRoomInfoResp: RoomInfoResp?) :
view.setData(bean)
view.iv_custom_gift?.setOnClickListener {
ToastUtils.showShort("礼物")
GiftGivingDialog(ActivityUtils.getTopActivity(), mRoomId,view.pitBean.user_id,view.pitBean.nickname,view.pitBean.avatar).show()
}
view.ivYueT?.setOnClickListener {
ToastUtils.showShort("约她")
RoomAboutDialog(ActivityUtils.getTopActivity(),mRoomId,view.pitBean.user_id,view.pitBean.nickname,view.pitBean.avatar).show()
}
view.ivLiaoT?.setOnClickListener {
ToastUtils.showShort("撩她")
if (!SpUtil.getBooleanValue("pub", false)) {
FlirtatiousDialog(ActivityUtils.getTopActivity()).show()
}else{

View File

@@ -0,0 +1,63 @@
package com.xscm.modulemain.activity.room.presenter
import android.content.Context
import com.xscm.modulemain.activity.room.contacts.MentorShipContacts
import com.xscm.modulemain.activity.room.contacts.PrivateContacts
import com.xscm.modulemain.activity.room.contacts.PubContacts
import com.xscm.moduleutil.bean.RoonGiftModel
import com.xscm.moduleutil.bean.WalletBean
import com.xscm.moduleutil.http.BaseObserver
import com.xscm.moduleutil.http.RetrofitClient
import com.xscm.moduleutil.presenter.BasePresenter
import com.xscm.moduleutil.presenter.RewardGiftContacts
import io.reactivex.disposables.Disposable
import java.lang.ref.WeakReference
class PrivatePresenter(context: Context, val view: PrivateContacts.View?) :
BasePresenter<PrivateContacts.View>(view, context), PrivateContacts.Ipre {
override fun applyPit(roomId: String, pitNumber: String) {
RetrofitClient.getInstance().applyPit(roomId, pitNumber, object : BaseObserver<String?>() {
override fun onSubscribe(d: Disposable) {
addDisposable(d)
}
override fun onNext(s: String) {
}
})
}
override fun getGiftList(roomId: String) {
RetrofitClient.getInstance().getGiftList(5,roomId, object : BaseObserver<List<RoonGiftModel>>() {
override fun onSubscribe(d: Disposable) {
}
override fun onNext(t: List<RoonGiftModel>) {
if (MvpRef == null) {
MvpRef = WeakReference(view)
}
MvpRef.get()?.getGiftList(t)
}
})
}
override fun wallet(list:List<String>) {
RetrofitClient.getInstance().wallet(object : BaseObserver<WalletBean?>() {
override fun onSubscribe(d: Disposable) {
addDisposable(d)
}
override fun onNext(walletBean: WalletBean) {
if (MvpRef == null) {
MvpRef = WeakReference(view)
}
MvpRef.get()?.wallet(list,walletBean)
}
})
}
}

View File

@@ -4,6 +4,7 @@ package com.xscm.modulemain.activity.user.activity;
import android.annotation.SuppressLint;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.text.TextUtils;
import android.view.LayoutInflater;
import android.view.View;
@@ -12,6 +13,7 @@ import android.widget.ImageView;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.recyclerview.widget.GridLayoutManager;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
@@ -25,6 +27,7 @@ import com.google.android.material.tabs.TabLayout;
import com.google.android.material.tabs.TabLayoutMediator;
import com.xscm.modulemain.Application;
import com.xscm.modulemain.R;
import com.xscm.modulemain.activity.main.activity.MainActivity;
import com.xscm.modulemain.activity.room.activity.RoomActivity;
import com.xscm.modulemain.adapter.TaskBoxAdapter;
import com.xscm.modulemain.adapter.TaskDataAdapter;
@@ -39,6 +42,7 @@ import com.xscm.modulemain.dialog.SignInDialog;
import com.xscm.modulemain.manager.RoomManager;
import com.xscm.moduleutil.base.CommonAppContext;
import com.xscm.moduleutil.bean.RoomMessageEvent;
import com.xscm.moduleutil.http.RetrofitClient;
import com.xscm.moduleutil.utils.CustomMsgCode;
import com.xscm.moduleutil.base.WebUrlConstants;
import com.xscm.moduleutil.bean.GiftBoxBean;
@@ -89,6 +93,15 @@ public class DailyTasksActivity extends BaseMvpActivity<DailyTasksPresenter, Act
}
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
RetrofitClient.getInstance().setJoinRoomLoadListener(result -> {
isShowLoading(false);
});
}
@Override
protected void onResume() {
super.onResume();

View File

@@ -38,6 +38,7 @@ import com.xscm.moduleutil.bean.MyCpRoom;
import com.xscm.moduleutil.bean.MyFootResp;
import com.xscm.moduleutil.bean.MyRoomBean;
import com.xscm.moduleutil.event.RoomOutEvent;
import com.xscm.moduleutil.http.RetrofitClient;
import com.xscm.moduleutil.utils.ARouteConstants;
import com.xscm.moduleutil.utils.ImageLoader;
import com.xscm.moduleutil.utils.SpUtil;
@@ -108,6 +109,9 @@ public class MyRoomActivity extends BaseMvpActivity<MyRoomPresenter, RoomActivit
initViewStyles();
updateSelectedState(0);
RetrofitClient.getInstance().setJoinRoomLoadListener(result -> {
isShowLoading(false);
});
}
@Override