honghengqiang 3 лет назад
Родитель
Сommit
d407fcdfb4

+ 5 - 0
.idea/jarRepositories.xml

@@ -41,5 +41,10 @@
       <option name="name" value="maven2" />
       <option name="url" value="https://mirrors.tencent.com/nexus/repository/maven-public/" />
     </remote-repository>
+    <remote-repository>
+      <option name="id" value="maven3" />
+      <option name="name" value="maven3" />
+      <option name="url" value="http://lib.gcssloop.com/repository/gcssloop-central/" />
+    </remote-repository>
   </component>
 </project>

+ 8 - 0
.idea/misc.xml

@@ -16,13 +16,17 @@
         <entry key="app/src/main/res/drawable/splash.xml" value="0.3932291666666667" />
         <entry key="app/src/main/res/layout/activity_splash.xml" value="0.3259668508287293" />
         <entry key="baseswago/src/main/res/drawable/shape_80000000_20.xml" value="0.13229166666666667" />
+        <entry key="baseswago/src/main/res/drawable/shape_9ffd88_5_stroke.xml" value="0.3145833333333333" />
         <entry key="baseswago/src/main/res/drawable/shape_9ffd88_63f2df.xml" value="0.39375" />
         <entry key="baseswago/src/main/res/drawable/shape_9ffd88_6ef2df.xml" value="0.3611111111111111" />
         <entry key="baseswago/src/main/res/drawable/shape_9ffd88_6ef2df_5.xml" value="0.3723076923076923" />
+        <entry key="baseswago/src/main/res/drawable/shape_9ffd88_6ef2df_5_stroke.xml" value="0.37333333333333335" />
         <entry key="baseswago/src/main/res/drawable/shape_9ffd88_6ef2df_top_20.xml" value="0.35794871794871796" />
+        <entry key="baseswago/src/main/res/drawable/shape_black_15.xml" value="0.3177083333333333" />
         <entry key="baseswago/src/main/res/drawable/shape_black_5.xml" value="0.35794871794871796" />
         <entry key="baseswago/src/main/res/drawable/shape_dadada_5.xml" value="0.35794871794871796" />
         <entry key="baseswago/src/main/res/drawable/shape_ff9300_20.xml" value="0.21927083333333333" />
+        <entry key="baseswago/src/main/res/drawable/shape_touming.xml" value="0.37333333333333335" />
         <entry key="baseswago/src/main/res/drawable/shape_white_20.xml" value="0.35794871794871796" />
         <entry key="baseswago/src/main/res/drawable/shape_white_5.xml" value="0.39375" />
         <entry key="baseswago/src/main/res/drawable/shape_white_top_20.xml" value="0.39375" />
@@ -69,9 +73,13 @@
         <entry key="room/src/main/res/layout/dialog_send_msg.xml" value="0.338768115942029" />
         <entry key="room/src/main/res/layout/dialog_user_for_anchor_close.xml" value="0.39166666666666666" />
         <entry key="room/src/main/res/layout/fragment_base_com.xml" value="0.29781021897810217" />
+        <entry key="room/src/main/res/layout/fragment_gift.xml" value="0.3640625" />
+        <entry key="room/src/main/res/layout/fragment_gift_detail.xml" value="0.3770833333333333" />
         <entry key="room/src/main/res/layout/fragment_no_content.xml" value="0.35688405797101447" />
         <entry key="room/src/main/res/layout/fragment_rank_list.xml" value="0.39166666666666666" />
         <entry key="room/src/main/res/layout/item_chat.xml" value="0.3776041666666667" />
+        <entry key="room/src/main/res/layout/item_gift.xml" value="0.75" />
+        <entry key="room/src/main/res/layout/item_page_gift.xml" value="0.36302083333333335" />
         <entry key="room/src/main/res/layout/item_rank_list.xml" value="0.3770833333333333" />
         <entry key="room/src/main/res/layout/item_room_user.xml" value="0.3446557971014493" />
         <entry key="room/src/main/res/layout/layout_anchor_footer_view.xml" value="0.35688405797101447" />

+ 11 - 0
baseswago/src/main/java/com/swago/baseswago/model/live/gift/GiftModel.java

@@ -22,6 +22,7 @@ public class GiftModel implements Parcelable {
     private String gift_coins;
     private String gift_icon_url;
     private String gift_svg_url;
+    private boolean isSelected = false;
 
     protected GiftModel(Parcel in) {
         id = in.readString();
@@ -29,6 +30,7 @@ public class GiftModel implements Parcelable {
         gift_coins = in.readString();
         gift_icon_url = in.readString();
         gift_svg_url = in.readString();
+        isSelected = in.readBoolean();
     }
 
     public static final Creator<GiftModel> CREATOR = new Creator<GiftModel>() {
@@ -83,6 +85,14 @@ public class GiftModel implements Parcelable {
         this.gift_svg_url = gift_svg_url;
     }
 
+    public boolean isSelected() {
+        return isSelected;
+    }
+
+    public void setSelected(boolean selected) {
+        isSelected = selected;
+    }
+
     @Override
     public int describeContents() {
         return 0;
@@ -95,5 +105,6 @@ public class GiftModel implements Parcelable {
         dest.writeString(gift_coins);
         dest.writeString(gift_icon_url);
         dest.writeString(gift_svg_url);
+        dest.writeBoolean(isSelected);
     }
 }

+ 10 - 0
baseswago/src/main/java/com/swago/baseswago/util/DpPxUtil.kt

@@ -24,4 +24,14 @@ object DpPxUtil {
             Resources.getSystem().displayMetrics.density
         return (pxValue / scale + 0.5f).toInt()
     }
+
+    fun getScreenWidth():Int{
+        val display = Resources.getSystem().displayMetrics
+        return display?.widthPixels ?: 0
+    }
+
+    fun getScreenHeight():Int{
+        val display = Resources.getSystem().displayMetrics
+        return display?.heightPixels ?: 0
+    }
 }

+ 5 - 0
baseswago/src/main/res/drawable/shape_9ffd88_5_stroke.xml

@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8"?>
+<shape xmlns:android="http://schemas.android.com/apk/res/android">
+    <stroke android:width="1dp" android:color="#9ffd88"/>
+    <corners android:radius="5dp"/>
+</shape>

+ 5 - 0
baseswago/src/main/res/drawable/shape_black_15.xml

@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8"?>
+<shape xmlns:android="http://schemas.android.com/apk/res/android">
+    <solid android:color="#000000"/>
+    <corners android:radius="15dp"/>
+</shape>

+ 5 - 0
baseswago/src/main/res/drawable/shape_touming.xml

@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8"?>
+<shape xmlns:android="http://schemas.android.com/apk/res/android">
+    <stroke android:color="@android:color/transparent" android:width="1dp"/>
+    <corners android:radius="5dp"/>
+</shape>

+ 3 - 0
baseswago/src/main/res/values-zh/strings.xml

@@ -78,4 +78,7 @@
     <string name="tips">提示</string>
     <string name="consume_order">该笔订单\n%s\n未消费成功,请确认消费!</string>
     <string name="sure_consume">确认消费</string>
+    <string name="send">赠送</string>
+    <string name="hot">热门</string>
+    <string name="luxury">高级</string>
 </resources>

+ 3 - 0
baseswago/src/main/res/values/strings.xml

@@ -83,4 +83,7 @@
     <string name="tips">Tips</string>
     <string name="consume_order">This order\n %s \nhas not been consumed successfully, please confirm the consumption!</string>
     <string name="sure_consume">Sure consume</string>
+    <string name="send">Send</string>
+    <string name="hot">Hot</string>
+    <string name="luxury">Luxury</string>
 </resources>

+ 7 - 7
home/src/main/java/com/swago/home/HomeActivity.kt

@@ -158,13 +158,13 @@ class HomeActivity : BaseXActivity<ActivityHomeBinding>(), IPayCallback {
     }
 
     override fun onUnConsumeOrder(data: List<Purchase>) {
-//        data.forEach {
-//            val orderLostDialog = OrderLostDialog.newInstance(it.orderId)
-//            orderLostDialog.commitLostOrderFun = {
-//                payVm.payOrderToServer(it,4)
-//            }
-//            orderLostDialog.show(supportFragmentManager, "OrderLostDialog")
-//        }
+        data.forEach {
+            val orderLostDialog = OrderLostDialog.newInstance(it.orderId)
+            orderLostDialog.commitLostOrderFun = {
+                payVm.payOrderToServer(it,4)
+            }
+            orderLostDialog.show(supportFragmentManager, "OrderLostDialog")
+        }
     }
 
     override fun consumeOrderSuccess() {

+ 39 - 0
room/src/main/java/com/swago/room/gift/GiftAdapter.kt

@@ -0,0 +1,39 @@
+package com.swago.room.gift
+
+import android.widget.ImageView
+import com.bumptech.glide.Glide
+import com.chad.library.adapter.base.BaseQuickAdapter
+import com.chad.library.adapter.base.BaseViewHolder
+import com.swago.baseswago.model.live.gift.GiftModel
+import com.swago.room.R
+
+/**
+ *@date 2021/12/13 16:13
+ *description:
+ */
+class GiftAdapter(private val type: Int, layoutResId: Int, data: ArrayList<GiftModel>) :
+    BaseQuickAdapter<GiftModel, BaseViewHolder>(layoutResId, data) {
+
+    override fun convert(helper: BaseViewHolder, item: GiftModel) {
+        helper.apply {
+            setText(R.id.tvCoin, item.gift_coins)
+            setText(R.id.tvName, item.gift_name)
+            val ivGift = itemView.findViewById<ImageView>(R.id.ivGift)
+            Glide.with(itemView.context).load(item.gift_icon_url).into(ivGift)
+            if (item.isSelected) {
+                setBackgroundRes(R.id.rootView, R.drawable.shape_9ffd88_5_stroke)
+            } else {
+                setBackgroundRes(R.id.rootView, R.drawable.shape_touming)
+            }
+
+//            if (type == 3) {
+//                if (GiftConfig.clickCount >= 0) {
+//                    itemView.tvNum.text = "x" + item.stallList[GiftConfig.clickCount]
+//                }
+//            } else {
+//                itemView.tvNum.text = "x1"
+//            }
+
+        }
+    }
+}

+ 21 - 0
room/src/main/java/com/swago/room/gift/GiftConfig.kt

@@ -0,0 +1,21 @@
+package com.swago.room.gift
+
+/**
+ *@date 2021/12/13 20:33
+ *description:
+ */
+object GiftConfig {
+
+    //幸运礼物的点击
+    var clickCount = 0
+
+    //当前选中的是哪个礼物类型
+    var giftSelectedWhichType = 1
+
+    //选中的礼物类型的礼物当前是哪一页
+    var giftSelectedPageIndex = 0
+
+    //选中那一页的第几个
+    var giftSelectedPageSelectedPosition = 0
+
+}

+ 172 - 1
room/src/main/java/com/swago/room/gift/GiftDialog.kt

@@ -1,15 +1,186 @@
 package com.swago.room.gift
 
+import android.content.Context
+import android.graphics.Color
+import android.os.Bundle
+import android.util.Log
+import android.view.Gravity
+import androidx.viewpager.widget.ViewPager
+import com.swago.baseswago.GradientIndicator
+import com.swago.baseswago.SwagoAdapter
 import com.swago.baseswago.dialog.BaseXDFragment
+import com.swago.baseswago.model.live.gift.GiftModel
+import com.swago.baseswago.util.AppContext
+import com.swago.baseswago.util.DpPxUtil
+import com.swago.baseswago.util.LogUtil
+import com.swago.room.R
 import com.swago.room.databinding.DialogGiftBinding
+import net.lucode.hackware.magicindicator.ViewPagerHelper
+import net.lucode.hackware.magicindicator.buildins.commonnavigator.CommonNavigator
+import net.lucode.hackware.magicindicator.buildins.commonnavigator.abs.CommonNavigatorAdapter
+import net.lucode.hackware.magicindicator.buildins.commonnavigator.abs.IPagerIndicator
+import net.lucode.hackware.magicindicator.buildins.commonnavigator.abs.IPagerTitleView
+import net.lucode.hackware.magicindicator.buildins.commonnavigator.titles.SimplePagerTitleView
 
 /**
  *@date 2021/12/12 14:59
  *description:
  */
-class GiftDialog:BaseXDFragment<DialogGiftBinding>() {
+class GiftDialog : BaseXDFragment<DialogGiftBinding>() {
+
+    private val titleList = arrayListOf(
+        AppContext.getContext().resources.getString(R.string.hot),
+        AppContext.getContext().resources.getString(R.string.luxury)
+    )
+
+    //    private val titleList = arrayListOf(AppContext.getContext().resources.getString(R.string.hot),AppContext.getContext().resources.getString(R.string.luxury),AppContext.getContext().resources.getString(R.string.luxury))
+    private val giftFragmentList = ArrayList<GiftFragment>()
+
+    private var hotFragment: GiftFragment? = null
+    private var luxuryFragment: GiftFragment? = null
+    private var hotData: ArrayList<GiftModel>? = null
+    private var luxuryData: ArrayList<GiftModel>? = null
+
+    private var type = 1
+
+    init {
+        setGravity(Gravity.BOTTOM)
+        setDimAmount(0f)
+    }
+
+    companion object {
+        fun newInstance(
+            hotData: ArrayList<GiftModel>,
+            luxuryData: ArrayList<GiftModel>,
+            luckyData: ArrayList<GiftModel>
+        ): GiftDialog {
+            val giftDialog = GiftDialog()
+            val bundle = Bundle()
+            bundle.putParcelableArrayList("hot", hotData)
+            bundle.putParcelableArrayList("luxury", luxuryData)
+            bundle.putParcelableArrayList("lucky", luckyData)
+            giftDialog.arguments = bundle
+            return giftDialog
+        }
+    }
 
     override fun initOther() {
+        arguments?.let {
+            hotData = it.getParcelableArrayList<GiftModel>("hot")
+            luxuryData = it.getParcelableArrayList<GiftModel>("luxury")
+            val luckyData = it.getParcelableArrayList<GiftModel>("lucky") as ArrayList<GiftModel>
+            hotFragment = GiftFragment.newInstance(1, hotData!!)
+            luxuryFragment = GiftFragment.newInstance(2, luxuryData!!)
+            giftFragmentList.add(hotFragment!!)
+            giftFragmentList.add(luxuryFragment!!)
+//            giftFragmentList.add(GiftFragment.newInstance(3,luckyData))
+
+            /**
+             * 重置选中的礼物
+             */
+            hotFragment?.listener = {
+                luxuryFragment?.reset()
+            }
+            luxuryFragment?.listener = {
+                hotFragment?.reset()
+            }
+
+            binding.viewPager.offscreenPageLimit = 3
+            val viewPagerAdapter = SwagoAdapter(giftFragmentList, childFragmentManager, titleList)
+            binding.viewPager.adapter = viewPagerAdapter
+
+            val commonNavigator = CommonNavigator(context)
+            commonNavigator.adapter = object : CommonNavigatorAdapter() {
+                override fun getCount(): Int {
+                    return titleList.size
+                }
+
+                override fun getTitleView(context: Context, index: Int): IPagerTitleView {
+                    val simplePagerTitleView = SimplePagerTitleView(context)
+                    simplePagerTitleView.text = titleList[index]
+                    val padding = DpPxUtil.dip2px(15f).toFloat()
+                    simplePagerTitleView.textSize = 16f
+                    simplePagerTitleView.setPadding(padding.toInt(), 0, padding.toInt(), 0)
+                    simplePagerTitleView.normalColor = Color.parseColor("#868686")
+                    simplePagerTitleView.selectedColor = Color.parseColor("#ffffff")
+                    simplePagerTitleView.setOnClickListener {
+                        binding.viewPager.currentItem = index
+                    }
+                    return simplePagerTitleView
+                }
+
+                override fun getIndicator(context: Context?): IPagerIndicator {
+                    val indicator = GradientIndicator(context)
+                    indicator.mode = GradientIndicator.MODE_WRAP_CONTENT
+                    indicator.lineWidth = DpPxUtil.dip2px(72f).toFloat()
+                    indicator.xOffset = DpPxUtil.dip2px(5f).toFloat()
+                    indicator.yOffset = DpPxUtil.dip2px(3f).toFloat()
+                    indicator.lineHeight = DpPxUtil.dip2px(4f).toFloat()
+                    indicator.roundRadius = DpPxUtil.dip2px(2f).toFloat()
+                    return indicator
+                }
+
+            }
+
+            binding.magicIndicator.navigator = commonNavigator
+            ViewPagerHelper.bind(binding.magicIndicator, binding.viewPager)
+
+
+            //打开礼物弹窗时默认显示到上次选中的礼物
+            binding.viewPager.addOnPageChangeListener(object : ViewPager.OnPageChangeListener {
+                override fun onPageScrollStateChanged(state: Int) {}
+
+                override fun onPageScrolled(
+                    position: Int,
+                    positionOffset: Float,
+                    positionOffsetPixels: Int
+                ) {
+                }
+
+                override fun onPageSelected(position: Int) {
+                    Log.d("hhq", "$position")
+                    type = position + 1
+                }
+            })
+
+            when(GiftConfig.giftSelectedWhichType){
+                1 -> {
+                    binding.viewPager.currentItem = 0
+                }
+                2 -> {
+                    binding.viewPager.currentItem = 1
+                }
+                3 -> {
+                    binding.viewPager.currentItem = 2
+                }
+            }
+
+            //点击送礼
+            binding.tvToSend.setOnClickListener {
+                when (type) {
+                    1 -> {
+                        //热门
+                        hotData?.let {
+                            val gifModel = it[GiftConfig.giftSelectedPageIndex*8+GiftConfig.giftSelectedPageSelectedPosition]
+                            LogUtil.d("礼物id","${gifModel.gift_name}")
+                        }
+                    }
+
+                    2 -> {
+                        //高级
+                        luxuryData?.let {
+                            val gifModel = it[GiftConfig.giftSelectedPageIndex*8+GiftConfig.giftSelectedPageSelectedPosition]
+                            LogUtil.d("礼物id","${gifModel.gift_name}")
+                        }
+                    }
+
+                    3 -> {
+
+                    }
+
+                }
+            }
+        }
     }
 
     override fun initLiveData() {

+ 116 - 0
room/src/main/java/com/swago/room/gift/GiftFragment.kt

@@ -0,0 +1,116 @@
+package com.swago.room.gift
+
+import android.os.Bundle
+import androidx.recyclerview.widget.LinearLayoutManager
+import androidx.recyclerview.widget.RecyclerView
+import com.swago.baseswago.fragment.BaseXFragment
+import com.swago.baseswago.model.live.gift.GiftModel
+import com.swago.room.R
+import com.swago.room.databinding.FragmentGiftBinding
+
+
+/**
+ *@date 2021/12/13 16:06
+ *description:
+ */
+class GiftFragment : BaseXFragment<FragmentGiftBinding>() {
+
+    private var type = -1
+    private var data: ArrayList<GiftModel>? = null
+
+    private val arrayList by lazy {
+        ArrayList<ArrayList<GiftModel>>()
+    }
+
+    private var adapter: GiftPagerAdapter? = null
+
+    companion object {
+        fun newInstance(type: Int, data: ArrayList<GiftModel>): GiftFragment {
+            val giftFragment = GiftFragment()
+            val bundle = Bundle()
+            bundle.putInt("type", type)
+            bundle.putParcelableArrayList("data", data)
+            giftFragment.arguments = bundle
+            return giftFragment
+        }
+    }
+
+    override fun loadData() {
+
+    }
+
+    override fun initOther() {
+        arguments?.let { bundle ->
+            type = bundle.getInt("type")
+            data = bundle.getParcelableArrayList("data")
+            adapter = GiftPagerAdapter(type, R.layout.fragment_gift, arrayList)
+            binding.recyclerView.layoutManager = LinearLayoutManager(
+                context,
+                RecyclerView.HORIZONTAL, false
+            )
+            val horizontalPagerSnapHelper = HorizontalPagerSnapHelper()
+            horizontalPagerSnapHelper.attachToRecyclerView(binding.recyclerView)
+            binding.recyclerView.adapter = adapter
+
+            data?.let {
+                if (it.isEmpty()) return@let
+                when (GiftConfig.giftSelectedWhichType) {
+                    1 -> {
+                        it[GiftConfig.giftSelectedPageIndex * 8 + GiftConfig.giftSelectedPageSelectedPosition].isSelected =
+                            true
+                        binding.recyclerView.scrollToPosition(GiftConfig.giftSelectedPageIndex)
+                    }
+                    2 -> {
+                        it[GiftConfig.giftSelectedPageIndex * 8 + GiftConfig.giftSelectedPageSelectedPosition].isSelected =
+                            true
+                        binding.recyclerView.scrollToPosition(GiftConfig.giftSelectedPageIndex)
+                    }
+                    3 -> {
+                        it[GiftConfig.giftSelectedPageIndex * 8 + GiftConfig.giftSelectedPageSelectedPosition].isSelected =
+                            true
+                        binding.recyclerView.scrollToPosition(GiftConfig.giftSelectedPageIndex)
+                    }
+                }
+
+                val isEight = it.size % 8 == 0
+                val sum = if (isEight) {
+                    it.size / 8
+                } else {
+                    it.size / 8 + 1
+                }
+                for (i in 0 until sum) {
+                    val list = ArrayList<GiftModel>()
+                    if ((i + 1) * 8 > it.size) {
+                        list.addAll(it.subList(i * 8, it.size))
+                    } else {
+                        list.addAll(it.subList(i * 8, (i + 1) * 8))
+                    }
+                    arrayList.addAll(listOf(list))
+                }
+                adapter?.notifyDataSetChanged()
+            }
+
+            adapter?.listener = {
+                listener?.invoke()
+            }
+        }
+    }
+
+
+    fun reset() {
+        adapter?.let {
+            it.data.forEach {
+                it.forEach {
+                    it.isSelected = false
+                }
+            }
+            it.notifyDataSetChanged()
+        }
+    }
+
+    var listener: (() -> Unit)? = null
+
+    override fun initLiveData() {
+
+    }
+}

+ 106 - 0
room/src/main/java/com/swago/room/gift/GiftPagerAdapter.kt

@@ -0,0 +1,106 @@
+package com.swago.room.gift
+
+import android.graphics.Rect
+import android.util.Log
+import android.view.View
+import androidx.appcompat.widget.ViewUtils
+import androidx.recyclerview.widget.GridLayoutManager
+import androidx.recyclerview.widget.RecyclerView
+import com.chad.library.adapter.base.BaseQuickAdapter
+import com.chad.library.adapter.base.BaseViewHolder
+import com.swago.baseswago.model.live.gift.GiftModel
+import com.swago.baseswago.util.DpPxUtil
+import com.swago.baseswago.util.LogUtil
+import com.swago.room.R
+import com.tencent.qcloud.tim.uikit.utils.ScreenUtil
+import java.util.ArrayList
+
+/**
+ *@date 2021/12/13 20:20
+ *description:
+ */
+class GiftPagerAdapter(private val type:Int,layoutResId: Int, data: List<ArrayList<GiftModel>>) :
+BaseQuickAdapter<ArrayList<GiftModel>, BaseViewHolder>(layoutResId, data) {
+
+    private var selected = -1
+
+
+    override fun convert(helper: BaseViewHolder, item: ArrayList<GiftModel>) {
+        val recyclerView: RecyclerView =
+            helper.itemView.findViewById(R.id.recyclerView)
+        val mAdapter = GiftAdapter(type, R.layout.item_gift, item)
+        if (recyclerView.itemDecorationCount == 0) {
+            recyclerView.addItemDecoration(GiftItemDecoration())
+        }
+        recyclerView.layoutManager = GridLayoutManager(
+            helper.itemView.context,
+            4,
+            RecyclerView.VERTICAL,
+            false
+        )
+        recyclerView.adapter = mAdapter
+        mAdapter.setNewData(item)
+
+        mAdapter.setOnItemClickListener { _, _, position ->
+            this@GiftPagerAdapter.data.forEach {
+                it.forEach {
+                    it.isSelected = false
+                }
+            }
+            item[position].isSelected = true
+
+//            if (selected == position&&type==3){
+//                //幸运礼物
+//                if (item[position].stallList.size>GiftConfig.clickCount){
+//                    GiftConfig.clickCount ++
+//                    if (GiftConfig.clickCount==item[position].stallList.size){
+//                        GiftConfig.clickCount = 0
+//                    }
+//                }
+//            }else{
+//                GiftConfig.clickCount = 0
+//            }
+            GiftConfig.clickCount = 0
+
+            listener?.invoke()
+
+            selected = position
+
+            GiftConfig.giftSelectedWhichType = type
+            GiftConfig.giftSelectedPageSelectedPosition = position
+            GiftConfig.giftSelectedPageIndex = helper.layoutPosition
+
+            this@GiftPagerAdapter.notifyDataSetChanged()
+        }
+    }
+
+    //连击时切换幸运礼物的时候combo按钮要消失
+    var listener: (() -> Unit)? = null
+
+
+    inner class GiftItemDecoration : RecyclerView.ItemDecoration() {
+        override fun getItemOffsets(
+            outRect: Rect,
+            view: View,
+            parent: RecyclerView,
+            state: RecyclerView.State
+        ) {
+            super.getItemOffsets(outRect, view, parent, state)
+            val itemPosition = (view.layoutParams as RecyclerView.LayoutParams).viewLayoutPosition
+            val totalMargin = DpPxUtil.getScreenWidth() - 4 * DpPxUtil.dip2px(80f)
+            val margin = totalMargin / 5
+            when {
+                itemPosition % 4 == 0 -> {
+                    outRect.set(margin, 0, margin / 2, 0)
+                }
+                itemPosition % 4 == 3 -> {
+                    outRect.set(margin / 2, 0, margin, 0)
+                }
+                else -> {
+                    outRect.set(margin / 2, 0, margin / 2, 0)
+                }
+            }
+
+        }
+    }
+}

+ 119 - 0
room/src/main/java/com/swago/room/gift/HorizontalPagerSnapHelper.java

@@ -0,0 +1,119 @@
+package com.swago.room.gift;
+
+import android.util.DisplayMetrics;
+import android.view.View;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+import androidx.recyclerview.widget.LinearSmoothScroller;
+import androidx.recyclerview.widget.OrientationHelper;
+import androidx.recyclerview.widget.PagerSnapHelper;
+import androidx.recyclerview.widget.RecyclerView;
+
+/**
+ * @date 2021/12/13 20:18
+ * description:
+ */
+public class HorizontalPagerSnapHelper extends PagerSnapHelper {
+    // Orientation helpers are lazily created per LayoutManager.
+    @Nullable
+    private OrientationHelper mVerticalHelper;
+    @Nullable
+    private OrientationHelper mHorizontalHelper;
+    private RecyclerView mRecyclerView;
+
+    @Override
+    public void attachToRecyclerView(@Nullable RecyclerView recyclerView) throws IllegalStateException {
+        mRecyclerView = recyclerView;
+        super.attachToRecyclerView(recyclerView);
+    }
+
+    @Nullable
+    @Override
+    public int[] calculateDistanceToFinalSnap(@NonNull RecyclerView.LayoutManager layoutManager,
+                                              @NonNull View targetView) {
+        int[] out = new int[2];
+        if (layoutManager.canScrollHorizontally()) {
+            out[0] = distanceToCenter(layoutManager, targetView,
+                    getHorizontalHelper(layoutManager));
+        } else {
+            out[0] = 0;
+        }
+
+        if (layoutManager.canScrollVertically()) {
+            out[1] = distanceToCenter(layoutManager, targetView,
+                    getVerticalHelper(layoutManager));
+        } else {
+            out[1] = 0;
+        }
+        return out;
+    }
+
+    private int distanceToCenter(@NonNull RecyclerView.LayoutManager layoutManager,
+                                 @NonNull View targetView, OrientationHelper helper) {
+        //如果已经滚动到尽头 并且判断是否是第一个item或者是最后一个,直接返回0,不用多余的滚动了
+        if ((helper.getDecoratedStart(targetView) == 0 && mRecyclerView.getChildAdapterPosition(targetView) == 0)
+                || (helper.getDecoratedEnd(targetView) == helper.getEndAfterPadding()
+                && mRecyclerView.getChildAdapterPosition(targetView) == mRecyclerView.getAdapter().getItemCount() - 1)) {
+            mRecyclerView.stopScroll();
+            return 0;
+        }
+        final int childCenter = helper.getDecoratedStart(targetView)
+                + (helper.getDecoratedMeasurement(targetView) / 2);
+        final int containerCenter;
+        if (layoutManager.getClipToPadding()) {
+            containerCenter = helper.getStartAfterPadding() + helper.getTotalSpace() / 2;
+        } else {
+            containerCenter = helper.getEnd() / 2;
+        }
+        return childCenter - containerCenter;
+    }
+
+
+    @Override
+    protected LinearSmoothScroller createSnapScroller(RecyclerView.LayoutManager layoutManager) {
+        if (!(layoutManager instanceof RecyclerView.SmoothScroller.ScrollVectorProvider)) {
+            return null;
+        }
+        return new LinearSmoothScroller(mRecyclerView.getContext()) {
+            @Override
+            protected void onTargetFound(View targetView, RecyclerView.State state, RecyclerView.SmoothScroller.Action action) {
+                if (mRecyclerView == null) {
+                    // The associated RecyclerView has been removed so there is no action to take.
+                    return;
+                }
+                int[] snapDistances = calculateDistanceToFinalSnap(mRecyclerView.getLayoutManager(),
+                        targetView);
+                final int dx = snapDistances[0];
+                final int dy = snapDistances[1];
+                final int time = calculateTimeForDeceleration(Math.max(Math.abs(dx), Math.abs(dy)));
+                if (time > 0) {
+                    action.update(dx, dy, time, mDecelerateInterpolator);
+                }
+            }
+
+            @Override
+            protected float calculateSpeedPerPixel(DisplayMetrics displayMetrics) {
+                return 100f / displayMetrics.densityDpi;
+            }
+        };
+    }
+
+
+    @NonNull
+    private OrientationHelper getVerticalHelper(@NonNull RecyclerView.LayoutManager layoutManager) {
+        if (mVerticalHelper == null) {
+            mVerticalHelper = OrientationHelper.createVerticalHelper(layoutManager);
+        }
+        return mVerticalHelper;
+    }
+
+    @NonNull
+    private OrientationHelper getHorizontalHelper(
+            @NonNull RecyclerView.LayoutManager layoutManager) {
+        if (mHorizontalHelper == null) {
+            mHorizontalHelper = OrientationHelper.createHorizontalHelper(layoutManager);
+        }
+        return mHorizontalHelper;
+    }
+}

+ 6 - 1
room/src/main/java/com/swago/room/user/UserRoomFragment.kt

@@ -10,6 +10,7 @@ import com.swago.baseswago.dialog.ReportDialog
 import com.swago.baseswago.model.live.gift.GiftModel
 import com.swago.room.base.BaseComFragment
 import com.swago.room.databinding.FragmentBaseComBinding
+import com.swago.room.gift.GiftDialog
 import com.swago.room.gift.GiftVm
 import com.swago.room.inter.IFooter
 import com.swago.room.inter.IHeader
@@ -29,9 +30,11 @@ class UserRoomFragment : BaseComFragment<FragmentBaseComBinding>() {
 
     //热门礼物列表
     private val hotList = ArrayList<GiftModel>()
-
     //奢华礼物列表
     private val luxuryList = ArrayList<GiftModel>()
+    //幸运礼物列表
+    private val luckyData = ArrayList<GiftModel>()
+
 
     override fun initOther() {
         super.initOther()
@@ -63,6 +66,7 @@ class UserRoomFragment : BaseComFragment<FragmentBaseComBinding>() {
         footerView.openGiftPanelFun = {
             if (hotList.isNotEmpty()||luxuryList.isNotEmpty()){
                 //打开礼物列表
+                GiftDialog.newInstance(hotList,luxuryList,luckyData).show(childFragmentManager,"GiftDialog")
             }
         }
 
@@ -101,6 +105,7 @@ class UserRoomFragment : BaseComFragment<FragmentBaseComBinding>() {
 
                     3 -> {
                         //幸运礼物
+                        luckyData.addAll(giftAllModel.data)
                     }
                 }
             }

+ 73 - 1
room/src/main/res/layout/dialog_gift.xml

@@ -1,6 +1,78 @@
 <?xml version="1.0" encoding="utf-8"?>
 <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
     android:layout_width="match_parent"
-    android:layout_height="match_parent">
+    android:layout_height="match_parent"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
+    xmlns:tools="http://schemas.android.com/tools">
+
+    <androidx.constraintlayout.widget.ConstraintLayout
+        android:background="#000000"
+        app:layout_constraintBottom_toBottomOf="parent"
+        android:layout_width="match_parent"
+        android:layout_height="268dp">
+
+        <net.lucode.hackware.magicindicator.MagicIndicator
+            android:id="@+id/magicIndicator"
+            android:layout_marginEnd="150dp"
+            app:layout_constraintTop_toTopOf="parent"
+            android:layout_width="match_parent"
+            android:layout_height="40dp"/>
+
+        <TextView
+            android:id="@+id/tvSender"
+            android:text="Send to %s"
+            android:textColor="#fff"
+            app:layout_constraintTop_toTopOf="@+id/magicIndicator"
+            app:layout_constraintBottom_toBottomOf="@+id/magicIndicator"
+            android:layout_marginTop="8dp"
+            android:layout_marginBottom="8dp"
+            android:layout_marginEnd="8dp"
+            android:paddingEnd="8dp"
+            android:paddingStart="8dp"
+            android:gravity="center"
+            app:layout_constraintEnd_toEndOf="parent"
+            android:background="@drawable/shape_black_15"
+            android:layout_width="wrap_content"
+            android:layout_height="0dp"/>
+
+        <androidx.viewpager.widget.ViewPager
+            android:id="@+id/viewPager"
+            app:layout_constraintTop_toBottomOf="@+id/magicIndicator"
+            android:layout_width="match_parent"
+            android:layout_height="168dp"/>
+
+        <TextView
+            android:id="@+id/tvCoins"
+            android:drawablePadding="5dp"
+            android:drawableStart="@mipmap/icon_room_coin"
+            android:drawableEnd="@mipmap/icon_topup"
+            android:textColor="#fff"
+            android:textSize="14dp"
+            android:layout_marginStart="10dp"
+            tools:text = "3000"
+            android:gravity="center"
+            app:layout_constraintTop_toBottomOf="@+id/viewPager"
+            app:layout_constraintBottom_toBottomOf="parent"
+            app:layout_constraintStart_toStartOf="parent"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"/>
+
+        <TextView
+            android:id="@+id/tvToSend"
+            android:textSize="14dp"
+            android:textColor="#fff"
+            android:text="@string/send"
+            android:gravity="center"
+            android:background="@drawable/shape_9ffd88_6ef2df_5"
+            app:layout_constraintEnd_toEndOf="parent"
+            app:layout_constraintTop_toBottomOf="@+id/viewPager"
+            app:layout_constraintBottom_toBottomOf="parent"
+            android:layout_marginEnd="10dp"
+            android:layout_width="72dp"
+            android:layout_height="30dp"/>
+
+
+    </androidx.constraintlayout.widget.ConstraintLayout>
+
 
 </androidx.constraintlayout.widget.ConstraintLayout>

+ 11 - 0
room/src/main/res/layout/fragment_gift.xml

@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="utf-8"?>
+<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent">
+
+    <androidx.recyclerview.widget.RecyclerView
+        android:id="@+id/recyclerView"
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"/>
+
+</androidx.constraintlayout.widget.ConstraintLayout>

+ 52 - 0
room/src/main/res/layout/item_gift.xml

@@ -0,0 +1,52 @@
+<?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"
+    xmlns:tools="http://schemas.android.com/tools"
+    android:id="@+id/rootView"
+    android:layout_width="76dp"
+    android:layout_height="wrap_content">
+
+    <ImageView
+        android:id="@+id/ivGift"
+        app:layout_constraintTop_toTopOf="parent"
+        app:layout_constraintStart_toStartOf="parent"
+        app:layout_constraintEnd_toEndOf="parent"
+        android:layout_width="48dp"
+        android:layout_height="48dp"/>
+
+    <TextView
+        android:id="@+id/tvName"
+        android:maxWidth="76dp"
+        app:layout_constraintStart_toStartOf="parent"
+        app:layout_constraintEnd_toEndOf="parent"
+        android:textSize="10dp"
+        android:textColor="#fff"
+        android:layout_marginTop="2dp"
+        app:layout_constraintTop_toBottomOf="@+id/ivGift"
+        android:ellipsize="marquee"
+        android:marqueeRepeatLimit="marquee_forever"
+        android:scrollHorizontally="true"
+        android:singleLine="true"
+        android:gravity="center"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"/>
+
+    <TextView
+        android:id="@+id/tvCoin"
+        android:drawableStart="@mipmap/icon_room_coin"
+        android:textSize="10dp"
+        android:textColor="#FFE398"
+        app:layout_constraintTop_toBottomOf="@+id/tvName"
+        app:layout_constraintStart_toStartOf="parent"
+        app:layout_constraintEnd_toEndOf="parent"
+        tools:text = "1000"
+        android:ellipsize="marquee"
+        android:marqueeRepeatLimit="marquee_forever"
+        android:scrollHorizontally="true"
+        android:singleLine="true"
+        android:gravity="center"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"/>
+
+
+</androidx.constraintlayout.widget.ConstraintLayout>

+ 11 - 0
room/src/main/res/layout/item_page_gift.xml

@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="utf-8"?>
+<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent">
+
+    <androidx.recyclerview.widget.RecyclerView
+        android:id="@+id/recyclerView"
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"/>
+
+</androidx.constraintlayout.widget.ConstraintLayout>

+ 0 - 1
room/src/main/res/layout/layout_user_footer_view.xml

@@ -32,7 +32,6 @@
         app:layout_constraintTop_toTopOf="parent"
         app:layout_constraintStart_toEndOf="@+id/ivMirror"
         android:src="@mipmap/live_gift"
-        android:visibility="gone"
         android:layout_width="40dp"
         android:layout_height="40dp"/>
 

BIN
room/src/main/res/mipmap-xxhdpi/icon_topup.png