Jelajahi Sumber

进场特效哦

honghengqiang 2 tahun lalu
induk
melakukan
5961dafc8f

+ 2 - 0
baseswago/build.gradle

@@ -131,4 +131,6 @@ dependencies {
     api 'org.jsoup:jsoup:1.12.1'
     //适配阿拉伯语
     api 'com.duolingo.open:rtl-viewpager:2.0.0'
+    //lottie
+    api 'com.airbnb.android:lottie:4.0.0'
 }

+ 4 - 0
baseswago/src/main/java/com/swago/baseswago/util/SwagoInfo.kt

@@ -56,6 +56,10 @@ object SwagoInfo {
     }
 
 
+    fun isMirror():Boolean{
+        return getLanguageCode()  == "ar"
+    }
+
     fun getDeviceInfo():String{
         return Build.BRAND + "--" + Build.MODEL
     }

+ 1 - 1
home/src/main/java/com/swago/home/innerhome/HomeGridItemDecoration.kt

@@ -26,7 +26,7 @@ class HomeGridItemDecoration : RecyclerView.ItemDecoration() {
             return
         }
 
-        if (SwagoInfo.getLanguageCode()=="ar"){
+        if (SwagoInfo.isMirror()){
             when(column){
                 0 -> {
                     outRect.set(margin, margin, middle, 0)

+ 2 - 0
room/src/main/java/com/swago/room/base/BaseComFragment.kt

@@ -144,6 +144,8 @@ abstract class BaseComFragment<T : FragmentBaseComBinding> : BaseXFragment<T>(),
         danDaoManager.giftDanDaoViewList.add(binding.danDaoView)
         danDaoManager.giftDanDaoViewList.add(binding.danDaoView2)
         danDaoManager.giftDanDaoViewList.add(binding.danDaoView3)
+        //进场特效
+        msgVm.joinRoomManager.initViewStub(binding.joinRoomViewStub,activity)
 
         val layoutManager = LinearLayoutManager(context)
         layoutManager.stackFromEnd = true

+ 225 - 0
room/src/main/java/com/swago/room/manager/JoinRoomManager.kt

@@ -0,0 +1,225 @@
+package com.swago.room.manager
+
+import android.animation.Animator
+import android.view.ViewStub
+import android.animation.AnimatorSet
+import android.animation.ObjectAnimator
+import android.util.Log
+import android.view.View
+import android.view.animation.AccelerateInterpolator
+import android.view.animation.DecelerateInterpolator
+import android.widget.TextView
+import androidx.constraintlayout.widget.ConstraintLayout
+import androidx.fragment.app.FragmentActivity
+import com.airbnb.lottie.LottieAnimationView
+import com.airbnb.lottie.LottieComposition
+import com.airbnb.lottie.LottieCompositionFactory
+import com.swago.baseswago.baseroom.IRoomActiveListener
+import com.swago.baseswago.baseroom.IRoomInfo
+import com.swago.baseswago.baseroom.SwagoRoomManager
+import com.swago.baseswago.model.im.UserJoinRoomBean
+import com.swago.baseswago.util.DpPxUtil
+import com.swago.baseswago.util.SwagoInfo
+import com.swago.loadUrl
+import com.swago.room.R
+import de.hdodenhof.circleimageview.CircleImageView
+import java.io.FileInputStream
+import java.util.LinkedList
+import java.util.zip.ZipInputStream
+
+class JoinRoomManager : IRoomActiveListener {
+
+    private var mActivity:FragmentActivity? = null
+    private var isRunning = false
+    private var lottieView:LottieAnimationView? = null
+    private var tvName: TextView? = null
+    private var ivAvatar: CircleImageView? = null
+    private var joinRoomRootView:ConstraintLayout? = null
+    private var clBg:ConstraintLayout? = null
+    private var animationSet: AnimatorSet? = null
+    private var lottieMoto:LottieComposition? = null
+    private var lottieCar:LottieComposition? = null
+    private var lottieBoat:LottieComposition? = null
+    private var lottieRider:LottieComposition? = null
+    private val waitingTime = 1000L
+
+    private var joinRoomList = LinkedList<UserJoinRoomBean>()
+    private var canAddData = true
+
+    fun initViewStub(viewStub: ViewStub?,activity:FragmentActivity?){
+        mActivity = activity
+        viewStub?.apply {
+            val view = this.inflate()
+            lottieView = view.findViewById(R.id.lottieView)
+            clBg = view.findViewById(R.id.clBg)
+            tvName = view.findViewById(R.id.tvName)
+            ivAvatar = view.findViewById(R.id.ivAvatar)
+            joinRoomRootView = view.findViewById(R.id.rootView)
+            initLottieComposition()
+            initViewAnimation()
+            loopStart()
+            SwagoRoomManager.addListener(this@JoinRoomManager)
+        }
+
+    }
+
+    private fun loopStart() {
+            Thread{
+                while (true){
+                    if (!canAddData)break
+                    if (joinRoomList.isEmpty() || isRunning){
+                        Thread.sleep(waitingTime)
+                        continue
+                    }
+                    joinRoomList.peek()?:continue
+                    val userJoinRoomBean = joinRoomList.poll()?:continue
+                    mActivity?.let {
+                        it.runOnUiThread {
+                            playJoinRoomAnimation(userJoinRoomBean)
+                        }
+                    }
+                }
+            }.start()
+    }
+
+    private fun playJoinRoomAnimation(userJoinRoomBean: UserJoinRoomBean) {
+        isRunning = true
+        joinRoomRootView?.visibility = View.VISIBLE
+        mActivity?.let {  ivAvatar?.loadUrl(it,userJoinRoomBean.userAvatar) }
+        tvName?.text = userJoinRoomBean.senderName
+        if (userJoinRoomBean.isBenefit==1){
+            if (lottieRider == null){
+                isRunning = false
+            }else{
+                lottieRider?.let {
+                    clBg?.setBackgroundResource(R.drawable.shape_e87230_ddb558_all_20)
+                    lottieView?.setComposition(it)
+                    lottieView?.playAnimation()
+                    animationSet?.start()
+                }
+            }
+        }else{
+            if (userJoinRoomBean.senderLevel in 20..39){
+                if (lottieMoto == null){
+                    isRunning = false
+                }else{
+                    lottieMoto?.let {
+                        clBg?.setBackgroundResource(R.drawable.shape_6720d1_180c72_20)
+                        lottieView?.setComposition(it)
+                        lottieView?.playAnimation()
+                        animationSet?.start()
+                    }
+                }
+            }
+            if (userJoinRoomBean.senderLevel in 40..59){
+                if (lottieCar == null){
+                    isRunning = false
+                }else{
+                    lottieCar?.let {
+                        clBg?.setBackgroundResource(R.drawable.shape_f8614b_8c2922_20)
+                        lottieView?.setComposition(it)
+                        lottieView?.playAnimation()
+                        animationSet?.start()
+                    }
+                }
+            }
+
+            if (userJoinRoomBean.senderLevel>=60){
+                if (lottieBoat == null){
+                    isRunning = false
+                }else{
+                    lottieBoat?.let {
+                        clBg?.setBackgroundResource(R.drawable.shape_434343_000000_20)
+                        lottieView?.setComposition(it)
+                        lottieView?.playAnimation()
+                        animationSet?.start()
+                    }
+                }
+            }
+        }
+    }
+
+    private fun initViewAnimation() {
+        joinRoomRootView?.let {
+            animationSet = AnimatorSet()
+            val screenWidth = DpPxUtil.getScreenWidth().toFloat()
+            val joinRoomObjectAnimator = ObjectAnimator.ofFloat(it,"translationX",if (SwagoInfo.isMirror()) -screenWidth else screenWidth,0f)
+            joinRoomObjectAnimator.interpolator = AccelerateInterpolator()
+            joinRoomObjectAnimator.duration = 100
+
+            val exitRoomObjectAnimator = ObjectAnimator.ofFloat(it,"translationX",0f,if (SwagoInfo.isMirror()) screenWidth else -screenWidth)
+            joinRoomObjectAnimator.interpolator = DecelerateInterpolator()
+            joinRoomObjectAnimator.duration = 100
+
+            animationSet?.let { animationSet ->
+                animationSet.play(exitRoomObjectAnimator)
+                    .after(joinRoomObjectAnimator)
+                    .after(4000)
+                animationSet.addListener(object: Animator.AnimatorListener{
+                    override fun onAnimationStart(p0: Animator?) {
+                        joinRoomRootView?.visibility = View.VISIBLE
+                    }
+
+                    override fun onAnimationEnd(p0: Animator?) {
+                        joinRoomRootView?.visibility = View.INVISIBLE
+                        isRunning = false
+                    }
+
+                    override fun onAnimationCancel(p0: Animator?) {
+                    }
+
+                    override fun onAnimationRepeat(p0: Animator?) {
+                    }
+                })
+            }
+        }
+    }
+
+    private fun initLottieComposition() {
+        LottieCompositionFactory.fromRawRes(mActivity,R.raw.lottiemoto,"lottiemoto").addListener {
+                lottieMoto = it
+            }
+        LottieCompositionFactory.fromRawRes(mActivity,R.raw.lottiecar,"lottiecar").addListener {
+                lottieCar = it
+            }
+        LottieCompositionFactory.fromRawRes(mActivity,R.raw.lottieboat,"lottieboat").addListener {
+                lottieBoat = it
+            }
+        LottieCompositionFactory.fromRawRes(mActivity,R.raw.lottierider,"lottierider").addListener {
+                lottieRider = it
+            }
+    }
+
+
+    fun addJoinRoomData(joinRoomBean: UserJoinRoomBean){
+        joinRoomList.add(joinRoomBean)
+    }
+
+
+    override fun changeRoom(iRoomInfo: IRoomInfo) {
+        isRunning = false
+        clearJoinRoomAnimation()
+    }
+
+    private fun clearJoinRoomAnimation() {
+        animationSet?.cancel()
+        joinRoomList.clear()
+        joinRoomRootView?.visibility = View.INVISIBLE
+    }
+
+    override fun leaveRoom(iRoomInfo: IRoomInfo) {
+    }
+
+    override fun joinedRoom(iRoomInfo: IRoomInfo) {
+    }
+
+    override fun endRoom(iRoomInfo: IRoomInfo?) {
+        clearJoinRoomAnimation()
+    }
+
+    override fun closeRoomed() {
+        canAddData = false
+        clearJoinRoomAnimation()
+        SwagoRoomManager.removeListener(this)
+    }
+}

+ 18 - 11
room/src/main/java/com/swago/room/user/UserRoomFragment.kt

@@ -9,6 +9,7 @@ import com.swago.baseswago.baseroom.IRoomInfo
 import com.swago.baseswago.baseroom.SwagoRoomManager
 import com.swago.baseswago.dialog.BenefitBagDialog
 import com.swago.baseswago.dialog.ReportDialog
+import com.swago.baseswago.model.im.UserJoinRoomBean
 import com.swago.baseswago.model.live.pk.ProcessPKModel
 import com.swago.baseswago.model.live.pk.PunishPKModel
 import com.swago.baseswago.model.live.pk.StartPKModel
@@ -105,17 +106,23 @@ class UserRoomFragment : BaseComFragment<FragmentBaseComBinding>() {
         }
 
         footerView.openGameFun = {
-            if (gameList.size == 1){
-                //直接弹出游戏弹窗
-                setGameDefaultData(0)
-            }else{
-                //弹出游戏选择弹窗
-                GameListDialog.newInstance(gameList).apply {
-                    this.openDialogFun = {
-                        openGameDialog()
-                    }
-                }.show(childFragmentManager,"GameListDialog")
-            }
+//            if (gameList.size == 1){
+//                //直接弹出游戏弹窗
+//                setGameDefaultData(0)
+//            }else{
+//                //弹出游戏选择弹窗
+//                GameListDialog.newInstance(gameList).apply {
+//                    this.openDialogFun = {
+//                        openGameDialog()
+//                    }
+//                }.show(childFragmentManager,"GameListDialog")
+//            }
+            val data = UserJoinRoomBean()
+            data.senderLevel = 80
+            data.senderName = "Sw1234dfdsfsfssdfsfd"
+            data.isBenefit = 0
+            data.userAvatar = "https://developer.android.google.cn/static/images/home/android-logo-13-twotone-1_1440.png"
+            msgVm.joinRoomManager.addJoinRoomData(data)
         }
 
         footerView.openShareFun = {

+ 6 - 0
room/src/main/java/com/swago/room/vm/MsgVm.kt

@@ -31,6 +31,7 @@ import com.swago.baseswago.model.live.RoomUserChangeModel
 import com.swago.baseswago.model.live.RoomUserModel
 import com.swago.baseswago.model.live.gift.IMGiftModel
 import com.swago.baseswago.util.UserInfo
+import com.swago.room.manager.JoinRoomManager
 
 /**
  *@date 2021/10/10 10:00
@@ -77,6 +78,10 @@ class MsgVm(application: Application) : AbsMsgVm(application) {
      */
     var showGiftDanDao: ((data: IMGiftModel) -> Unit)? = null
 
+    val joinRoomManager by lazy {
+        JoinRoomManager()
+    }
+
     override fun receiveMsg() {
         imGroupNewMsgListener.handleMsgType<CusNewMsgBean<RoomChatMsgBean>>(room_chat_text) {
             if (it.getGroupId() == (SwagoRoomManager.iRoomInfo?.getRoomGroupId() ?: "")) {
@@ -94,6 +99,7 @@ class MsgVm(application: Application) : AbsMsgVm(application) {
                     it.data?.let {
                         newChatMsgFun?.invoke(it)
                         updateHotValue?.invoke(it.hotValue)
+                        joinRoomManager.addJoinRoomData(it)
                     }
                 }
             }

+ 8 - 0
room/src/main/res/layout/fragment_base_com.xml

@@ -125,6 +125,14 @@
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"/>
 
+    <ViewStub
+        android:id="@+id/joinRoomViewStub"
+        android:layout="@layout/view_user_join_room"
+        app:layout_constraintBottom_toBottomOf="parent"
+        app:layout_constraintTop_toTopOf="parent"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"/>
+
 
     <com.swago.room.gift.control.XSvgPlayer
         android:id="@+id/xSvgaPlayer"

+ 71 - 0
room/src/main/res/layout/view_user_join_room.xml

@@ -0,0 +1,71 @@
+<?xml version="1.0" encoding="utf-8"?>
+<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:tools="http://schemas.android.com/tools"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
+    android:id="@+id/rootView"
+    android:visibility="gone"
+    tools:visibility="visible"
+    android:layout_width="wrap_content"
+    android:layout_height="wrap_content">
+
+
+    <com.airbnb.lottie.LottieAnimationView
+        android:id="@+id/lottieView"
+        app:lottie_autoPlay="false"
+        app:lottie_loop="false"
+        app:layout_constraintStart_toStartOf="parent"
+        app:layout_constraintTop_toTopOf="parent"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"/>
+
+    <androidx.constraintlayout.widget.ConstraintLayout
+        android:id="@+id/clBg"
+        android:layoutDirection="ltr"
+        android:background="@drawable/shape_6c55ff_20"
+        android:layout_marginStart="20dp"
+        android:layout_marginBottom="250dp"
+        app:layout_constraintStart_toStartOf="@+id/lottieView"
+        app:layout_constraintBottom_toBottomOf="@+id/lottieView"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content">
+
+        <de.hdodenhof.circleimageview.CircleImageView
+            android:id="@+id/ivAvatar"
+            app:layout_constraintStart_toStartOf="parent"
+            app:layout_constraintTop_toTopOf="parent"
+             app:layout_constraintBottom_toBottomOf="parent"
+            android:layout_margin="5dp"
+            android:layout_width="30dp"
+            android:layout_height="30dp"/>
+
+        <TextView
+            android:id="@+id/tvName"
+            app:layout_constraintStart_toEndOf="@+id/ivAvatar"
+            app:layout_constraintEnd_toEndOf="parent"
+            app:layout_constraintTop_toTopOf="@+id/ivAvatar"
+            android:layout_marginStart="5dp"
+            android:layout_marginEnd="20dp"
+            android:textSize="12dp"
+            android:textStyle="bold"
+            tools:text="swago"
+            android:textColor="@color/white"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"/>
+
+        <TextView
+            android:id="@+id/tvJoin"
+            app:layout_constraintEnd_toEndOf="parent"
+            app:layout_constraintStart_toEndOf="@+id/ivAvatar"
+            app:layout_constraintBottom_toBottomOf="@+id/ivAvatar"
+            android:layout_marginEnd="20dp"
+            android:layout_marginStart="5dp"
+            android:textSize="10dp"
+            android:textStyle="bold"
+            android:text="@string/join_room"
+            android:textColor="@color/white"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"/>
+
+    </androidx.constraintlayout.widget.ConstraintLayout>
+
+</androidx.constraintlayout.widget.ConstraintLayout>

TEMPAT SAMPAH
room/src/main/res/raw/lottieCar.zip


TEMPAT SAMPAH
room/src/main/res/raw/lottieMoto.zip


TEMPAT SAMPAH
room/src/main/res/raw/lottieRider.zip


TEMPAT SAMPAH
room/src/main/res/raw/lottieboat.zip