From aa512ff5fc428fbee046d6bc0761c3675023769e Mon Sep 17 00:00:00 2001 From: 罗明文 <125975490@qq.com> Date: 星期三, 21 五月 2025 15:49:32 +0800 Subject: [PATCH] save --- app/src/main/java/com/dollearn/student/ui/home/MatchFragment.kt | 377 +++++++++++++++++++++++++++++++++++++++++++++++++++-- 1 files changed, 358 insertions(+), 19 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 7f3423a..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 1.首次播放播放中图标不显示 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) @@ -51,8 +78,17 @@ } TO_NEXT->{ if (isAdded&&!playing){ - (requireActivity() as IncludeActivity).next() + (requireActivity() as MatchActivity).next() } + } + PLAY_RIGHT->{ + rightPlaying = true + player.startPlayMusic(requireContext(),rightVoice) + } + PLAY_ERROR->{ + voiceIndex = -1 + errorPlaying = true + player.startPlayMusic(requireContext(),errorVoice) } } } @@ -70,25 +106,32 @@ } private fun initClick() { + cover_3.setOnClickListener { } + cover_2.setOnClickListener { } + cover_1.setOnClickListener { } + cover_4.setOnClickListener { } voiceViews.forEachIndexed { index, constraintLayout -> constraintLayout.clickDelay { if (!playing){ voiceIndex = index handler?.sendEmptyMessage(PLAY_VOICE) - motion.transitionToEnd() } } } cl_1.clickDelay { - if (playing||voiceIndex == -1) //未播放或者正在播放,不可点击 + val voiceIndex = voiceIndex + 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 @@ -111,24 +154,66 @@ end = R.id.end_4_1 } } + nowVoiceView = voiceViews[voiceIndex] + imgPosition = 0 + motion.setTransitionListener(object :MotionLayout.TransitionListener{ + override fun onTransitionStarted(p0: MotionLayout?, p1: Int, p2: Int) { + + } + + override fun onTransitionChange( + p0: MotionLayout?, + p1: Int, + p2: Int, + p3: Float + ) { + } + + override fun onTransitionCompleted(p0: MotionLayout?, p1: Int) { + cl_voice_end_1.visible() + when(voiceIndex){ + 0->cover_1.visible() + 1->cover_2.visible() + 2->cover_3.visible() + 3->cover_4.visible() + } + } + + override fun onTransitionTrigger( + p0: MotionLayout?, + p1: Int, + p2: Boolean, + p3: Float + ) { + } + }) 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) } cl_2.clickDelay { - if (playing||voiceIndex == -1) //未播放或者正在播放,不可点击 + val voiceIndex = voiceIndex + + 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 @@ -150,23 +235,64 @@ end = R.id.end_4_2 } } + nowVoiceView = voiceViews[voiceIndex] + + motion.setTransitionListener(object :MotionLayout.TransitionListener{ + override fun onTransitionStarted(p0: MotionLayout?, p1: Int, p2: Int) { + + } + + override fun onTransitionChange( + p0: MotionLayout?, + p1: Int, + p2: Int, + p3: Float + ) { + } + + override fun onTransitionCompleted(p0: MotionLayout?, p1: Int) { + cl_voice_end_2.visible() + when(voiceIndex){ + 0->cover_1.visible() + 1->cover_2.visible() + 2->cover_3.visible() + 3->cover_4.visible() + } + } + + override fun onTransitionTrigger( + p0: MotionLayout?, + p1: Int, + p2: Boolean, + p3: Float + ) { + } + }) motion.setTransition(start,end) motion.transitionToEnd() + handler?.sendEmptyMessage(PLAY_RIGHT) }else{ result_2.imageResource = R.mipmap.zhifushibai + handler?.sendEmptyMessage(PLAY_ERROR) } showResultAnim(cl_2) } cl_3.clickDelay { - if (playing||voiceIndex == -1) //未播放或者正在播放,不可点击 + val voiceIndex = voiceIndex + + 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 @@ -189,23 +315,63 @@ end = R.id.end_4_3 } } + nowVoiceView = voiceViews[voiceIndex] + + motion.setTransitionListener(object :MotionLayout.TransitionListener{ + override fun onTransitionStarted(p0: MotionLayout?, p1: Int, p2: Int) { + + } + + override fun onTransitionChange( + p0: MotionLayout?, + p1: Int, + p2: Int, + p3: Float + ) { + } + + override fun onTransitionCompleted(p0: MotionLayout?, p1: Int) { + cl_voice_end_3.visible() + when(voiceIndex){ + 0->cover_1.visible() + 1->cover_2.visible() + 2->cover_3.visible() + 3->cover_4.visible() + } + } + + override fun onTransitionTrigger( + p0: MotionLayout?, + p1: Int, + p2: Boolean, + p3: Float + ) { + } + }) 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 { - if (playing||voiceIndex == -1) //未播放或者正在播放,不可点击 + val voiceIndex = voiceIndex + 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 @@ -228,12 +394,67 @@ end = R.id.end_4_4 } } + nowVoiceView = voiceViews[voiceIndex] + + motion.setTransitionListener(object :MotionLayout.TransitionListener{ + override fun onTransitionStarted(p0: MotionLayout?, p1: Int, p2: Int) { + + } + + override fun onTransitionChange( + p0: MotionLayout?, + p1: Int, + p2: Int, + p3: Float + ) { + } + + override fun onTransitionCompleted(p0: MotionLayout?, p1: Int) { + cl_voice_end_4.visible() + when(voiceIndex){ + 0->cover_1.visible() + 1->cover_2.visible() + 2->cover_3.visible() + 3->cover_4.visible() + } + } + + override fun onTransitionTrigger( + p0: MotionLayout?, + p1: Int, + p2: Boolean, + p3: Float + ) { + } + }) motion.setTransition(start,end) motion.transitionToEnd() + handler?.sendEmptyMessage(PLAY_RIGHT) }else{ result_4.imageResource = R.mipmap.zhifushibai + handler?.sendEmptyMessage(PLAY_ERROR) } showResultAnim(cl_4) + } + + cl_voice_end_1.setOnClickListener { + voiceIndex = 4 + player.startPlayMusic(requireContext(),data!!.subjectList[group][0].correct) + } + cl_voice_end_2.setOnClickListener { + voiceIndex = 5 + player.startPlayMusic(requireContext(),data!!.subjectList[group][1].correct) + + } + cl_voice_end_3.setOnClickListener { + voiceIndex = 6 + player.startPlayMusic(requireContext(),data!!.subjectList[group][2].correct) + + } + cl_voice_end_4.setOnClickListener { + voiceIndex = 7 + player.startPlayMusic(requireContext(),data!!.subjectList[group][3].correct) + } } @@ -248,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) { @@ -255,17 +477,40 @@ }) } + @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 it.listend = false } - + cover_1.gone() + cover_2.gone() + cover_3.gone() + cover_4.gone() + tv_name.text ="" + cl_voice_end_1.gone() + 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{ @@ -288,12 +533,16 @@ override fun onStartPlay() { playing = true + if (errorPlaying||rightPlaying) + return val list = data!!.subjectList[group] - tv_name.text = list[list.map { it.correct }.indexOf(voiceList[voiceIndex])].name + if (voiceIndex in 0..3) + tv_name.text = list[list.map { it.correct }.indexOf(voiceList[voiceIndex])].name when(voiceIndex){ 0->{ iv1_1.gone() iv2_1.gone() + iv_playing_1.visible() iv_playing_1.visible() } 1->{ @@ -313,35 +562,125 @@ iv_playing_4.visible() } + 4->{ + iv1_1_end.gone() + iv2_1_end.gone() + iv_playing_1_end.visible() + } + 5->{ + iv1_2_end.gone() + iv2_2_end.gone() + iv_playing_2_end.visible() + } + 6->{ + iv1_3_end.gone() + iv2_3_end.gone() + iv_playing_3_end.visible() + } + 7->{ + iv1_4_end.gone() + iv2_4_end.gone() + iv_playing_4_end.visible() + } + } } override fun onFinishPlay() { playing = false - val subject = data!!.subjectList[group][voiceIndex] - subject.listend = true when(voiceIndex){ 0->{ 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