From 442124baa483f8d1c4aaca7ff81e15dd3f122363 Mon Sep 17 00:00:00 2001
From: 罗明文 <125975490@qq.com>
Date: 星期四, 22 五月 2025 13:14:36 +0800
Subject: [PATCH] save

---
 app/src/main/java/com/dollearn/student/ui/home/IncludeFragment.kt |  207 ++++++++++++++++++++++++++++++++++++++++++++++-----
 1 files changed, 186 insertions(+), 21 deletions(-)

diff --git a/app/src/main/java/com/dollearn/student/ui/home/IncludeFragment.kt b/app/src/main/java/com/dollearn/student/ui/home/IncludeFragment.kt
index 8d5fb25..744ab92 100644
--- a/app/src/main/java/com/dollearn/student/ui/home/IncludeFragment.kt
+++ b/app/src/main/java/com/dollearn/student/ui/home/IncludeFragment.kt
@@ -4,16 +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.activity.ImagePagerActivity
 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_include.*
+import org.greenrobot.eventbus.EventBus
+import org.greenrobot.eventbus.Subscribe
+import org.jetbrains.anko.support.v4.dip
+import org.jetbrains.anko.support.v4.startActivity
 
 class IncludeFragment : BaseFragment(), AudioUtils.OnAudioStatusUpdateListener {
     override fun contentViewId() = R.layout.fragment_include
@@ -24,6 +33,15 @@
     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 }
     private val data by lazy {
@@ -33,20 +51,28 @@
     private val act by lazy { requireActivity() as IncludeActivity }
 
     private var voiceIndex = -1 //点击播放的声音序号 0-5取值
-    private val voiceViews by lazy { arrayListOf(cl_voice1,cl_voice2,cl_voice3,cl_voice4,cl_voice5,cl_voice6) }
+    private val voiceViews by lazy { arrayListOf(cl_voice1_real,cl_voice2_real,cl_voice3_real,cl_voice4_real,cl_voice5_real,cl_voice6_real) }
     private var playing = false
 
     private val answerImg = arrayListOf<String>() //随机答案图片
     private var currentImage = 0 //当前作答的题号:2,4,5
 
+    private var nowVoiceView: View? = null
+
+    private var isAutoPlaying = false //true自动播放流程
+
+    var right = true //true进入下一题为全对,false 一旦答错过就置为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)
                 when(msg.what){
                     PLAY_VOICE->{
+                        playing = true
                         player.startPlayMusic(requireContext(),data!!.subjectList[group][voiceIndex].correct)
                     }
                     TO_NEXT->{
@@ -54,18 +80,38 @@
                             (requireActivity() as IncludeActivity).next()
                         }
                     }
+                    PLAY_RIGHT->{
+                        playing = true
+                        rightPlaying = true
+                        player.startPlayMusic(requireContext(),rightVoice)
+                    }
+                    PLAY_ERROR->{
+                        playing = true
+                        errorPlaying = true
+                        player.startPlayMusic(requireContext(),errorVoice)
+                    }
                 }
             }
         }
         data?.apply {
             val originList = subjectList[group]
-            iv_1.setImageURI(originList[0].img)
-            iv_2.setImageURI(originList[1].img)
-            iv_4.setImageURI(originList[3].img)
             answerImg.clear()
             answerImg.add(originList[2].img)
             answerImg.add(originList[4].img)
             answerImg.add(originList[5].img)
+            cl_voice1_real.postDelayed({
+                iv_1.setImageURI(originList[0].img)
+                iv_2.setImageURI(originList[1].img)
+                iv_4.setImageURI(originList[3].img)
+//                if (cl_1.width > dip(203)){
+//                    voiceViews.forEach {
+//                        it.layoutParams.width = dip(159)
+//                        it.layoutParams.height = dip(52)
+//                        it.requestLayout()
+//                    }
+//                }
+                voiceViews.forEach { it.visible() }
+            },500)
         }
         voiceViews.forEachIndexed { index, constraintLayout ->
             if (index == 0)
@@ -77,17 +123,17 @@
                     constraintLayout.isEnabled = data!!.subjectList[group][index].listend
             }
         }
-        showVoiceEnable()
         initClick()
+        showVoiceEnable()
     }
 
     private fun initClick() {
         voiceViews.forEachIndexed { index, constraintLayout ->
-            constraintLayout.clickDelay {
+            constraintLayout.setOnClickListener {
                 if (!playing){
                     if (index!=0&&!data!!.subjectList[group][index-1].listend){
                         myToast("请按顺序听语音")
-                        return@clickDelay
+                        return@setOnClickListener
                     }
                     voiceIndex = index
                     handler?.sendEmptyMessage(PLAY_VOICE)
@@ -96,19 +142,23 @@
         }
 
         cl_answer_1.clickDelay {
-            if (currentImage == 0)
+            if (currentImage == 0||!data!!.subjectList[group][currentImage].listend)
                 return@clickDelay
             val subject = data!!.subjectList[group][currentImage]
             if (!subject.listend||subject.completed){
                 return@clickDelay
             }
             act.totalCount++
+            data!!.subjectList[group][currentImage].listend = false
             if (answerImg[0] == subject.img){
+                nowVoiceView = voiceViews[currentImage]
                 act.rightCount++
-                data!!.subjectList[group][currentImage].completed = true
-                voiceViews[currentImage].callOnClick()
+                handler?.sendEmptyMessage(PLAY_RIGHT)
                 motion.transitionToEnd()
+                showResultAnim()
             }else{
+                right = false
+                handler?.sendEmptyMessage(PLAY_ERROR)
                 iv_error_1.visible()
                 iv_error_1.postDelayed({
                     clearAnswerImg()
@@ -117,17 +167,24 @@
         }
 
         cl_answer_2.clickDelay {
-            if (currentImage == 0)
+            if (currentImage == 0||!data!!.subjectList[group][currentImage].listend)
                 return@clickDelay
             val subject = data!!.subjectList[group][currentImage]
             if (!subject.listend||subject.completed){
                 return@clickDelay
             }
+            act.totalCount++
+
+            data!!.subjectList[group][currentImage].listend = false
             if (answerImg[1] == subject.img){
-                data!!.subjectList[group][currentImage].completed = true
-                voiceViews[currentImage].callOnClick()
+                nowVoiceView = voiceViews[currentImage]
+                act.rightCount++
+                handler?.sendEmptyMessage(PLAY_RIGHT)
                 motion.transitionToEnd()
+                showResultAnim()
             }else{
+                right = false
+                handler?.sendEmptyMessage(PLAY_ERROR)
                 iv_error_2.visible()
                 iv_error_2.postDelayed({
                     clearAnswerImg()
@@ -136,23 +193,48 @@
         }
 
         cl_answer_3.clickDelay {
-            if (currentImage == 0)
+            if (currentImage == 0||!data!!.subjectList[group][currentImage].listend)
                 return@clickDelay
             val subject = data!!.subjectList[group][currentImage]
             if (!subject.listend||subject.completed){
                 return@clickDelay
             }
+            act.totalCount++
+
+            data!!.subjectList[group][currentImage].listend = false
             if (answerImg[2] == subject.img){
-                data!!.subjectList[group][currentImage].completed = true
-                voiceViews[currentImage].callOnClick()
+                nowVoiceView = voiceViews[currentImage]
+                act.rightCount++
+                handler?.sendEmptyMessage(PLAY_RIGHT)
                 motion.transitionToEnd()
+                showResultAnim()
             }else{
+                right = false
+                handler?.sendEmptyMessage(PLAY_ERROR)
                 iv_error_3.visible()
                 iv_error_3.postDelayed({
                     clearAnswerImg()
                 },3000)
             }
         }
+
+        iv_full_1.clickDelay {
+            startActivity<ImagePagerActivity>("url" to arrayListOf(answerImg[0]))
+        }
+        iv_full_2.clickDelay {
+            startActivity<ImagePagerActivity>("url" to arrayListOf(answerImg[1]))
+
+        }
+        iv_full_3.clickDelay {
+            startActivity<ImagePagerActivity>("url" to arrayListOf(answerImg[2]))
+
+        }
+    }
+
+    private fun showResultAnim(){
+        val v = if (currentImage == 2) result_3 else if (currentImage == 4) result_5 else result_6
+        v.visible()
+        v.postDelayed({v.gone()},3000)
     }
 
     private fun showVoiceEnable(){
@@ -168,13 +250,19 @@
         }
     }
 
+    /**
+     * 答错后重置
+     */
     private fun clearAnswerImg(){
         iv_answer_1.setImageURI("")
         iv_answer_2.setImageURI("")
         iv_answer_3.setImageURI("")
-        iv_3.setImageURI("")
-        iv_5.setImageURI("")
-        iv_6.setImageURI("")
+        if (currentImage == 2)
+            iv_3.setImageURI("")
+        if (currentImage == 4)
+            iv_5.setImageURI("")
+        if (currentImage == 5)
+            iv_6.setImageURI("")
         iv_full_1.gone()
         iv_full_2.gone()
         iv_full_3.gone()
@@ -184,7 +272,24 @@
         data!!.subjectList[group][currentImage].listend = false
     }
 
+    /**
+     * 答对后的重置
+     */
+    private fun hideAnswerImg(){
+        iv_answer_1.setImageURI("")
+        iv_answer_2.setImageURI("")
+        iv_answer_3.setImageURI("")
+        iv_full_1.gone()
+        iv_full_2.gone()
+        iv_full_3.gone()
+        iv_error_1.gone()
+        iv_error_2.gone()
+        iv_error_3.gone()
+    }
+
     private fun showAnswerImg(){
+        if (errorPlaying||rightPlaying)
+            return
         answerImg.shuffle()
         iv_answer_1.setImageURI(answerImg[0])
         iv_answer_2.setImageURI(answerImg[1])
@@ -264,11 +369,23 @@
         })
     }
 
+    @Subscribe
+    fun onEvent(e: EmptyEvent){
+        if (e.code == Const.EventCode.RECOVERD){
+            if (act.fragments[act.vp.currentItem] == this){ //自动播放
+                isAutoPlaying = true
+                voiceViews[0].callOnClick()
+            }
+        }
+    }
+
     /**
      * 回到上一题,恢复状态
      */
     fun recover(){
         Log.e(TAG,"回到上一题,恢复答题前的状态")
+        right = true
+        isAutoPlaying = false
         motion.progress = 0f
         clearAnswerImg()
         currentImage = 0
@@ -277,6 +394,10 @@
             it.listend = false
         }
         showVoiceEnable()
+        if (act.fragments[act.vp.currentItem] == this&&act.recoverd) { //自动播放
+            isAutoPlaying = true
+            voiceViews[0].callOnClick()
+        }
     }
 
     companion object{
@@ -299,6 +420,8 @@
 
     override fun onStartPlay() {
         playing = true
+        if (errorPlaying||rightPlaying)
+            return
         when(voiceIndex){
             0->{
                 iv1_1.gone()
@@ -338,7 +461,6 @@
     override fun onFinishPlay() {
         playing = false
         val subject = data!!.subjectList[group][voiceIndex]
-        subject.listend = true
         when(voiceIndex){
             0->{
                 iv1_1.visible()
@@ -357,6 +479,8 @@
                 if (!subject.completed){
                     currentImage = 2
                     showAnswerImg()
+                }else{
+                    hideAnswerImg()
                 }
             }
             3->{
@@ -371,6 +495,8 @@
                 if (!subject.completed){
                     currentImage = 4
                     showAnswerImg()
+                }else{
+                    hideAnswerImg()
                 }
             }
             5->{
@@ -381,11 +507,50 @@
                     currentImage = 5
                     showAnswerImg()
                 }else{
+                    hideAnswerImg()
                     Log.e(TAG,"本题全部答对,3秒后进入下一图")
-                    handler?.sendEmptyMessageDelayed(TO_NEXT,3000)
+                    handler?.sendEmptyMessageDelayed(TO_NEXT,500) //万俊杰:缩短为0.5秒
+                }
+            }
+        }
+        if (errorPlaying)
+            errorPlaying = false
+        else if (rightPlaying) {
+            rightPlaying = false
+            data!!.subjectList[group][currentImage].completed = true
+            nowVoiceView?.callOnClick()
+        }else{
+            subject.listend = true
+            if (isAutoPlaying)
+                when(voiceIndex){
+                    0-> voiceViews[1].callOnClick()
+                    1-> voiceViews[2].callOnClick()
+                    3-> voiceViews[4].callOnClick()
+                    2,4,5-> isAutoPlaying = false
+                }
+            else if (subject.completed){
+                when(voiceIndex){
+                    2->{
+                        isAutoPlaying = true
+                        voiceViews[3].callOnClick()
+                    }
+                    4->{
+                        voiceViews[5].callOnClick()
+                    }
                 }
             }
         }
         showVoiceEnable()
     }
+
+    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