From b6d14ec6c19cddb1c8caf1d024e77d250a203929 Mon Sep 17 00:00:00 2001
From: lmw <125975490@qq.com>
Date: 星期四, 22 五月 2025 12:48:11 +0800
Subject: [PATCH] save

---
 app/src/main/java/com/dollearn/student/ui/home/MatchFragment.kt |  163 ++++++++++++++++++++++++++++++++++++++++++++++++------
 1 files changed, 145 insertions(+), 18 deletions(-)

diff --git a/app/src/main/java/com/dollearn/student/ui/home/MatchFragment.kt b/app/src/main/java/com/dollearn/student/ui/home/MatchFragment.kt
index d33c5e6..c5dbd5e 100644
--- a/app/src/main/java/com/dollearn/student/ui/home/MatchFragment.kt
+++ b/app/src/main/java/com/dollearn/student/ui/home/MatchFragment.kt
@@ -4,19 +4,25 @@
 import android.os.Looper
 import android.os.Message
 import android.util.Log
+import android.view.View
 import androidx.constraintlayout.motion.widget.MotionLayout
 import androidx.core.os.bundleOf
 import cn.sinata.xldutils.fragment.BaseFragment
 import cn.sinata.xldutils.gone
+import cn.sinata.xldutils.utils.SPUtils
+import cn.sinata.xldutils.utils.myToast
 import cn.sinata.xldutils.visible
 import com.dollearn.student.R
 import com.dollearn.student.utils.AudioUtils
+import com.dollearn.student.utils.Const
+import com.dollearn.student.utils.event.EmptyEvent
 import com.dollearn.student.utils.extention.clickDelay
 import kotlinx.android.synthetic.main.fragment_match.*
+import org.greenrobot.eventbus.EventBus
+import org.greenrobot.eventbus.Subscribe
 import org.jetbrains.anko.imageResource
 
 
-//todo 2.选择正确后不能再选择 3.选择正确后处理语音条位置
 class MatchFragment : BaseFragment(), AudioUtils.OnAudioStatusUpdateListener {
     override fun contentViewId() = R.layout.fragment_match
 
@@ -25,6 +31,15 @@
     private var handler:Handler? = null
     private val PLAY_VOICE = 1
     private val TO_NEXT = 2
+
+    private val PLAY_ERROR = 3
+    private val PLAY_RIGHT = 4
+
+    private val errorVoice by lazy { SPUtils.instance().getString(Const.EV) }
+    private val rightVoice by lazy { SPUtils.instance().getString(Const.RV) }
+
+    private var rightPlaying = false
+    private var errorPlaying = false
 
     private val player by lazy { AudioUtils() }
     private val group by lazy { arguments?.getInt("group")?:0 }
@@ -39,9 +54,21 @@
     private val voiceList = arrayListOf<String>() //语音列表,随机排序
     private var voiceIndex = -1 //点击播放的声音序号 0-3取值
 
+    private var nowVoiceView: View? = null
+    private var imgPosition = -1
+
+    private val completedVoice = arrayListOf<String>() //已经选了的音频 飞到图片上了
+
+    var right = true //true进入下一题为全对,false 一旦答错过就置为false,此时进入下一题,本题算做错误
+    var isAutoPlaying = false
+
+
+
     override fun onFirstVisibleToUser() {
         player.setOnAudioStatusUpdateListener(this)
         player.stopPlayMusic()
+        EventBus.getDefault().register(this)
+
         handler = object : Handler(Looper.getMainLooper()){
             override fun handleMessage(msg: Message) {
                 super.handleMessage(msg)
@@ -53,6 +80,15 @@
                         if (isAdded&&!playing){
                             (requireActivity() as MatchActivity).next()
                         }
+                    }
+                    PLAY_RIGHT->{
+                        rightPlaying = true
+                        player.startPlayMusic(requireContext(),rightVoice)
+                    }
+                    PLAY_ERROR->{
+                        voiceIndex = -1
+                        errorPlaying = true
+                        player.startPlayMusic(requireContext(),errorVoice)
                     }
                 }
             }
@@ -79,21 +115,23 @@
                 if (!playing){
                     voiceIndex = index
                     handler?.sendEmptyMessage(PLAY_VOICE)
-                    motion.transitionToEnd()
                 }
             }
         }
 
         cl_1.clickDelay {
             val voiceIndex = voiceIndex
-            if (playing||voiceIndex == -1) //未播放或者正在播放,不可点击
+            if (playing) //未播放或者正在播放,不可点击
                 return@clickDelay
-            if (data!!.subjectList[group][0].completed) //已作答不可点击
+            if (voiceIndex == -1){//未播放不可点击
+                myToast("请先听题")
                 return@clickDelay
+            }
+//            if (data!!.subjectList[group][0].completed) //已作答不可点击
+//                return@clickDelay
             act.totalCount ++
             if (data!!.subjectList[group][0].correct == voiceList[voiceIndex]){
                 result_1.imageResource = R.mipmap.successs
-                data!!.subjectList[group][0].completed = true
                 act.rightCount ++
                 //执行飞行动画
                 var start = 0
@@ -116,7 +154,8 @@
                         end = R.id.end_4_1
                     }
                 }
-                voiceViews[voiceIndex].callOnClick()
+                nowVoiceView =  voiceViews[voiceIndex]
+                imgPosition = 0
                 motion.setTransitionListener(object :MotionLayout.TransitionListener{
                     override fun onTransitionStarted(p0: MotionLayout?, p1: Int, p2: Int) {
 
@@ -150,8 +189,11 @@
                 })
                 motion.setTransition(start,end)
                 motion.transitionToEnd()
+                handler?.sendEmptyMessage(PLAY_RIGHT)
             }else{
+                right = false
                 result_1.imageResource = R.mipmap.zhifushibai
+                handler?.sendEmptyMessage(PLAY_ERROR)
             }
             showResultAnim(cl_1)
         }
@@ -159,15 +201,19 @@
         cl_2.clickDelay {
             val voiceIndex = voiceIndex
 
-            if (playing||voiceIndex == -1) //未播放或者正在播放,不可点击
+            if (playing) //未播放或者正在播放,不可点击
                 return@clickDelay
-            if (data!!.subjectList[group][1].completed) //已作答不可点击
+            if (voiceIndex == -1){//未播放不可点击
+                myToast("请先听题")
                 return@clickDelay
+            }
+//            if (data!!.subjectList[group][1].completed) //已作答不可点击
+//                return@clickDelay
             act.totalCount ++
             if (data!!.subjectList[group][1].correct == voiceList[voiceIndex]){
                 result_2.imageResource = R.mipmap.successs
-                data!!.subjectList[group][1].completed = true
                 act.rightCount ++
+                imgPosition = 1
                 //执行飞行动画
                 var start = 0
                 var end = 0
@@ -189,7 +235,7 @@
                         end = R.id.end_4_2
                     }
                 }
-                voiceViews[voiceIndex].callOnClick()
+                nowVoiceView =  voiceViews[voiceIndex]
 
                 motion.setTransitionListener(object :MotionLayout.TransitionListener{
                     override fun onTransitionStarted(p0: MotionLayout?, p1: Int, p2: Int) {
@@ -224,8 +270,10 @@
                 })
                 motion.setTransition(start,end)
                 motion.transitionToEnd()
+                handler?.sendEmptyMessage(PLAY_RIGHT)
             }else{
                 result_2.imageResource = R.mipmap.zhifushibai
+                handler?.sendEmptyMessage(PLAY_ERROR)
             }
             showResultAnim(cl_2)
         }
@@ -233,14 +281,18 @@
         cl_3.clickDelay {
             val voiceIndex = voiceIndex
 
-            if (playing||voiceIndex == -1) //未播放或者正在播放,不可点击
+            if (playing) //未播放或者正在播放,不可点击
                 return@clickDelay
-            if (data!!.subjectList[group][2].completed) //已作答不可点击
+            if (voiceIndex == -1){//未播放不可点击
+                myToast("请先听题")
                 return@clickDelay
+            }
+//            if (data!!.subjectList[group][2].completed) //已作答不可点击
+//                return@clickDelay
             act.totalCount ++
             if (data!!.subjectList[group][2].correct == voiceList[voiceIndex]){
                 result_3.imageResource = R.mipmap.successs
-                data!!.subjectList[group][2].completed = true
+                imgPosition = 2
                 act.rightCount ++
                 //执行飞行动画
                 var start = 0
@@ -263,7 +315,7 @@
                         end = R.id.end_4_3
                     }
                 }
-                voiceViews[voiceIndex].callOnClick()
+                nowVoiceView =  voiceViews[voiceIndex]
 
                 motion.setTransitionListener(object :MotionLayout.TransitionListener{
                     override fun onTransitionStarted(p0: MotionLayout?, p1: Int, p2: Int) {
@@ -298,22 +350,28 @@
                 })
                 motion.setTransition(start,end)
                 motion.transitionToEnd()
+                handler?.sendEmptyMessage(PLAY_RIGHT)
             }else{
                 result_3.imageResource = R.mipmap.zhifushibai
+                handler?.sendEmptyMessage(PLAY_ERROR)
             }
             showResultAnim(cl_3)
         }
 
         cl_4.clickDelay {
             val voiceIndex = voiceIndex
-            if (playing||voiceIndex == -1) //未播放或者正在播放,不可点击
+            if (playing) //未播放或者正在播放,不可点击
                 return@clickDelay
-            if (data!!.subjectList[group][3].completed) //已作答不可点击
+            if (voiceIndex == -1){//未播放不可点击
+                myToast("请先听题")
                 return@clickDelay
+            }
+//            if (data!!.subjectList[group][3].completed) //已作答不可点击
+//                return@clickDelay
             act.totalCount ++
             if (data!!.subjectList[group][3].correct == voiceList[voiceIndex]){
                 result_4.imageResource = R.mipmap.successs
-                data!!.subjectList[group][3].completed = true
+                imgPosition = 3
                 act.rightCount ++
                 //执行飞行动画
                 var start = 0
@@ -336,7 +394,7 @@
                         end = R.id.end_4_4
                     }
                 }
-                voiceViews[voiceIndex].callOnClick()
+                nowVoiceView =  voiceViews[voiceIndex]
 
                 motion.setTransitionListener(object :MotionLayout.TransitionListener{
                     override fun onTransitionStarted(p0: MotionLayout?, p1: Int, p2: Int) {
@@ -371,8 +429,10 @@
                 })
                 motion.setTransition(start,end)
                 motion.transitionToEnd()
+                handler?.sendEmptyMessage(PLAY_RIGHT)
             }else{
                 result_4.imageResource = R.mipmap.zhifushibai
+                handler?.sendEmptyMessage(PLAY_ERROR)
             }
             showResultAnim(cl_4)
         }
@@ -409,6 +469,7 @@
 
             override fun onTransitionCompleted(p0: MotionLayout?, p1: Int) {
                 m.progress = 0f
+                tv_name.text =""
             }
 
             override fun onTransitionTrigger(p0: MotionLayout?, p1: Int, p2: Boolean, p3: Float) {
@@ -416,11 +477,22 @@
         })
     }
 
+    @Subscribe
+    fun onEvent(e: EmptyEvent){
+        if (e.code == Const.EventCode.RECOVERD){
+            if (act.fragments[act.vp.currentItem] == this){ //自动播放
+                isAutoPlaying = true
+                cl_voice_1.callOnClick()
+            }
+        }
+    }
+
     /**
      * 回到上一题,恢复状态
      */
     fun recover(){
         Log.e(TAG,"回到上一题,恢复答题前的状态")
+        right = true
         motion.progress = 0f
         data!!.subjectList[group].forEach {
             it.completed = false
@@ -435,6 +507,10 @@
         cl_voice_end_2.gone()
         cl_voice_end_3.gone()
         cl_voice_end_4.gone()
+        if (act.fragments[act.vp.currentItem] == this&&act.recoverd) { //自动播放
+            isAutoPlaying = true
+            cl_voice_1.callOnClick()
+        }
     }
 
     companion object{
@@ -457,6 +533,8 @@
 
     override fun onStartPlay() {
         playing = true
+        if (errorPlaying||rightPlaying)
+            return
         val list = data!!.subjectList[group]
         if (voiceIndex in 0..3)
             tv_name.text = list[list.map { it.correct }.indexOf(voiceList[voiceIndex])].name
@@ -515,45 +593,94 @@
                 iv1_1.visible()
                 iv2_1.visible()
                 iv_playing_1.gone()
+                if (nowVoiceView!=null && data!!.subjectList[group][imgPosition].completed){
+                    voiceIndex = -1
+                    nowVoiceView = null
+                    isAutoPlaying = true
+                    cl_voice_2.callOnClick()
+                }
             }
             1->{
                 iv1_2.visible()
                 iv2_2.visible()
                 iv_playing_2.gone()
+                if (nowVoiceView!=null && data!!.subjectList[group][imgPosition].completed){
+                    voiceIndex = -1
+                    nowVoiceView = null
+                    isAutoPlaying = true
+                    cl_voice_3.callOnClick()
+                }
             }
             2->{
                 iv1_3.visible()
                 iv2_3.visible()
                 iv_playing_3.gone()
+                if (nowVoiceView!=null && data!!.subjectList[group][imgPosition].completed){
+                    voiceIndex = -1
+                    nowVoiceView = null
+
+                    isAutoPlaying = true
+                    cl_voice_4.callOnClick()
+                }
             }
             3->{
                 iv1_4.visible()
                 iv2_4.visible()
                 iv_playing_4.gone()
+                if (nowVoiceView!=null && data!!.subjectList[group][imgPosition].completed){
+                    voiceIndex = -1
+                    nowVoiceView = null
+                }
             }
+
             4->{
                 iv1_1_end.visible()
                 iv2_1_end.visible()
                 iv_playing_1_end.gone()
+                voiceIndex = -1
             }
             5->{
                 iv1_2_end.visible()
                 iv2_2_end.visible()
                 iv_playing_2_end.gone()
+                voiceIndex = -1
             }
             6->{
                 iv1_3_end.visible()
                 iv2_3_end.visible()
                 iv_playing_3_end.gone()
+                voiceIndex = -1
             }
             7->{
                 iv1_4_end.visible()
                 iv2_4_end.visible()
                 iv_playing_4_end.gone()
+                voiceIndex = -1
             }
         }
         if (data!!.subjectList[group].filter { it.completed }.size == 4){ //全部答对
             handler?.sendEmptyMessage(TO_NEXT)
         }
+
+        if (errorPlaying)
+            errorPlaying = false
+        if (rightPlaying){
+            rightPlaying = false
+            nowVoiceView?.callOnClick()
+            data!!.subjectList[group][imgPosition].completed = true
+        }
+    }
+
+
+    override fun onPause() {
+        super.onPause()
+        player.stopPlayMusic()
+    }
+
+    override fun onDestroy() {
+        super.onDestroy()
+        handler?.removeCallbacksAndMessages(null)
+        EventBus.getDefault().unregister(this)
+
     }
 }
\ No newline at end of file

--
Gitblit v1.7.1