lmw
12 小时以前 b6d14ec6c19cddb1c8caf1d024e77d250a203929
app/src/main/java/com/dollearn/student/ui/home/QAFragment.kt
@@ -15,11 +15,17 @@
import cn.sinata.xldutils.fragment.BaseFragment
import cn.sinata.xldutils.gone
import cn.sinata.xldutils.invisible
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_q_a.*
import org.greenrobot.eventbus.EventBus
import org.greenrobot.eventbus.Subscribe
import org.jetbrains.anko.support.v4.dip
class QAFragment:BaseFragment(), AudioUtils.OnAudioStatusUpdateListener {
@@ -30,6 +36,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 }
@@ -45,7 +60,7 @@
    private val voiceViews by lazy { arrayListOf(cl_voice_1,cl_voice_2,cl_voice_3,cl_voice_4) } //语音蓝条
    private val v1Views by lazy { arrayListOf(iv1_1,iv1_2,iv1_3,iv1_4,iv1_answer_1,iv1_answer_2,iv1_answer_3) }
    private val v2Views by lazy { arrayListOf(iv2_1,iv2_2,iv2_3,iv2_4,iv2_answer_1,iv2_answer_2,iv2_answer_3) }
    private val v3Views by lazy { arrayListOf(iv3_1,iv3_2,iv3_3,iv3_4) }
    private val resultViews by lazy { arrayListOf(iv_right_1,iv_right_2,iv_right_3,iv_right_4) }
    private val playingViews by lazy { arrayListOf(iv_playing_1,iv_playing_2,iv_playing_3,iv_playing_4,iv_playing_answer_1,iv_playing_answer_2,iv_playing_answer_3) }
    private var voiceIndex = -1 //点击播放的声音序号 0-3取值
@@ -57,8 +72,15 @@
    private var answerList = arrayListOf<String>() //右侧答案语音
    private var nowVoiceView: View? = null
    private var isAutoPlaying = 0
    var right = true //true进入下一题为全对,false 一旦答错过就置为false,此时进入下一题,本题算做错误
    override fun onFirstVisibleToUser() {
        EventBus.getDefault().register(this)
        player.setOnAudioStatusUpdateListener(this)
        player.stopPlayMusic()
        handler = object : Handler(Looper.getMainLooper()){
@@ -66,6 +88,7 @@
                super.handleMessage(msg)
                when(msg.what){
                    PLAY_VOICE->{
                        playing = true
                        if (voiceIndex in 0..3)
                            player.startPlayMusic(requireContext(),list[voiceIndex].correct)
                        else
@@ -76,6 +99,14 @@
                            (requireActivity() as QAActivity).next()
                        }
                    }
                    PLAY_RIGHT->{
                        rightPlaying = true
                        player.startPlayMusic(requireContext(),rightVoice)
                    }
                    PLAY_ERROR->{
                        errorPlaying = true
                        player.startPlayMusic(requireContext(),errorVoice)
                    }
                }
            }
        }
@@ -83,27 +114,38 @@
        iv_2.setImageURI(list[1].img)
        iv_3.setImageURI(list[2].img)
        iv_4.setImageURI(list[3].img)
        showVoiceUi()
        recover()
        rl_check_1.clickDelay {
            if (playing)
                return@clickDelay
            if (list[questionIndex].completed) //已作答
                return@clickDelay
            if (!rl_check_1.isSelected||!rl_check_2.isSelected||!rl_check_3.isSelected){
                myToast("请先听完")
                return@clickDelay
            }
            act.totalCount++
            if (list[questionIndex].correct == answerList[0]){
                act.rightCount++
                Log.e(TAG,"选择正确")
                transAnimation(cl_answer_1,voiceViews[questionIndex])
                list[questionIndex].completed = true
                cl_answer_1.callOnClick()
                val resultView = resultViews[questionIndex]
                resultView.visible()
                resultView.postDelayed({
                    resultView.gone()
                },2000)
                nowVoiceView = voiceViews[questionIndex]
                handler?.sendEmptyMessage(PLAY_RIGHT)
            }else{
                right = false
                recoverAnswer()
                handler?.sendEmptyMessage(PLAY_ERROR)
                dot_1.visible()
                iv_error_1.visible()
                dot_1.postDelayed({
                    dot_1.gone()
                    iv_error_1.gone()
                },500)
                },2000)
            }
        }
        rl_check_2.clickDelay {
@@ -111,20 +153,31 @@
                return@clickDelay
            if (list[questionIndex].completed) //已作答
                return@clickDelay
            if (!rl_check_1.isSelected||!rl_check_2.isSelected||!rl_check_3.isSelected){
                myToast("请先听完")
                return@clickDelay
            }
            act.totalCount++
            if (list[questionIndex].correct == answerList[1]){
                act.rightCount++
                Log.e(TAG,"选择正确")
                transAnimation(cl_answer_2,voiceViews[questionIndex])
                list[questionIndex].completed = true
                cl_answer_2.callOnClick()
                val resultView = resultViews[questionIndex]
                resultView.visible()
                resultView.postDelayed({
                    resultView.gone()
                },2000)
                nowVoiceView = voiceViews[questionIndex]
                handler?.sendEmptyMessage(PLAY_RIGHT)
            }else{
                recoverAnswer()
                handler?.sendEmptyMessage(PLAY_ERROR)
                dot_2.visible()
                iv_error_2.visible()
                dot_2.postDelayed({
                    dot_2.gone()
                    iv_error_2.gone()
                },500)
                },2000)
            }
        }
        rl_check_3.clickDelay {
@@ -132,42 +185,93 @@
                return@clickDelay
            if (list[questionIndex].completed) //已作答
                return@clickDelay
            if (!rl_check_1.isSelected||!rl_check_2.isSelected||!rl_check_3.isSelected){
                myToast("请先听完")
                return@clickDelay
            }
            act.totalCount++
            if (list[questionIndex].correct == answerList[2]){
                act.rightCount++
                Log.e(TAG,"选择正确")
                transAnimation(cl_answer_3,voiceViews[questionIndex])
                list[questionIndex].completed = true
                cl_answer_3.callOnClick()
                val resultView = resultViews[questionIndex]
                resultView.visible()
                resultView.postDelayed({
                    resultView.gone()
                },2000)
                nowVoiceView = voiceViews[questionIndex]
                handler?.sendEmptyMessage(PLAY_RIGHT)
            }else{
                recoverAnswer()
                handler?.sendEmptyMessage(PLAY_ERROR)
                dot_3.visible()
                iv_error_3.visible()
                dot_3.postDelayed({
                    dot_3.gone()
                    iv_error_3.gone()
                },500)
                },2000)
            }
        }
    }
    @Subscribe
    fun onEvent(e: EmptyEvent){
        if (e.code == Const.EventCode.RECOVERD){
            if (act.fragments[act.vp.currentItem] == this){ //自动播放
                isAutoPlaying = 1
                voiceViews.filterIndexed { index, constraintLayout ->
                    val subject = list[index]
                    constraintLayout.isEnabled&&subject.isQuestion == 1
                }.firstOrNull()?.callOnClick()
            }
        }
    }
    /**
     * 恢复答案和题目ui
     */
    fun recover(){
        right = true
        showVoiceUi()
        list.forEach { it.completed = false }
        recoverAnswer()
        if (act.fragments[act.vp.currentItem] == this&&act.recoverd) { //自动播放
            isAutoPlaying = 1
            voiceViews.filterIndexed { index, constraintLayout ->
                val subject = list[index]
                constraintLayout.isEnabled&&subject.isQuestion == 1
            }.firstOrNull()?.callOnClick()
        }
    }
    /**
     * 只恢复答案ui
     */
    private fun recoverAnswer(){
        rl_check_1.isSelected = false
        rl_check_2.isSelected = false
        rl_check_3.isSelected = false
        if (list.filter { it.completed }.isEmpty()){
            voiceViews[2].isEnabled = false
            voiceViews[3].isEnabled = false
        }else{
            voiceViews[2].isEnabled = true
            voiceViews[3].isEnabled = true
        }
    }
    private fun showVoiceUi(){
        list.forEachIndexed { index, subject ->
            if (subject.isQuestion == 1){
                v3Views[index].setImageResource(R.mipmap.voice_question)
                voiceViews[index].visible()
            }else{
                v3Views[index].setImageResource(R.mipmap.voice_answer)
                voiceViews[index].invisible()
            }
            voiceViews[index].clickDelay {
                voiceIndex = index
                handler?.sendEmptyMessage(PLAY_VOICE)
                if (!playing){
                    voiceIndex = index
                    handler?.sendEmptyMessage(PLAY_VOICE)
                }
            }
        }
    }
@@ -186,6 +290,15 @@
            layoutChanged = true
        }
        questionIndex = position
        if (questionIndex == 0||questionIndex == 2){
            iv2_answer_1.setImageResource(R.mipmap.voice_question_2)
            iv2_answer_2.setImageResource(R.mipmap.voice_question_2)
            iv2_answer_3.setImageResource(R.mipmap.voice_question_2)
        }else{
            iv2_answer_1.setImageResource(R.mipmap.voice_answer_2)
            iv2_answer_2.setImageResource(R.mipmap.voice_answer_2)
            iv2_answer_3.setImageResource(R.mipmap.voice_answer_2)
        }
        rl_check_1.visible()
        rl_check_2.visible()
        rl_check_3.visible()
@@ -223,7 +336,7 @@
        val x = PropertyValuesHolder.ofFloat("translationX",0f,offx.toFloat())
        val y = PropertyValuesHolder.ofFloat("translationY",0f,offy.toFloat())
        val animator = ObjectAnimator.ofPropertyValuesHolder(v, x, y)
        animator.duration = 1000
        animator.duration = 500
        animator.interpolator = LinearInterpolator()
        animator.start()
        animator.addListener(object :Animator.AnimatorListener{
@@ -273,6 +386,8 @@
    override fun onStartPlay() {
        playing = true
        if (rightPlaying||errorPlaying)
            return
        v1Views[voiceIndex].gone()
        v2Views[voiceIndex].gone()
        playingViews[voiceIndex].visible()
@@ -296,8 +411,56 @@
        v1Views[voiceIndex].visible()
        v2Views[voiceIndex].visible()
        playingViews[voiceIndex].gone()
        if (list.filter { it.completed }.size == 2){ //全部作答,3秒后下一题
            handler?.sendEmptyMessageDelayed(TO_NEXT,3000)
        if (!errorPlaying&&!rightPlaying&&!list[questionIndex].completed){
            if (voiceIndex == 4){
                rl_check_1.isSelected = true
            }
            if (voiceIndex == 5){
                rl_check_2.isSelected = true
            }
            if (voiceIndex == 6){
                rl_check_3.isSelected = true
            }
        }
        if (isAutoPlaying in 1..2){
            if (voiceIndex in 0..3){
                cl_answer_1.callOnClick()
            }else if (voiceIndex == 4)
                cl_answer_2.callOnClick()
            else if (voiceIndex == 5)
                cl_answer_3.callOnClick()
            else if (voiceIndex == 6){
                isAutoPlaying = if (isAutoPlaying == 1) 0 else -1
            }
        }
        if (errorPlaying)
            errorPlaying = false
        else if (rightPlaying){
            rightPlaying = false
            nowVoiceView?.callOnClick()
            list[questionIndex].completed = true
            recoverAnswer()
        }else if (list.filter { it.completed }.size == 2){ //全部作答,3秒后下一题
            handler?.sendEmptyMessageDelayed(TO_NEXT,500) //万俊杰:缩短为0.5秒
        }else if (list.filter { it.completed }.size == 1&& isAutoPlaying == 0){//答完一题,自动播放下一题
            isAutoPlaying = 2
            voiceViews.filterIndexed { index, constraintLayout ->
                val subject = list[index]
                constraintLayout.isEnabled&&subject.isQuestion == 1
            }.lastOrNull()?.callOnClick()
        }
    }
    override fun onPause() {
        super.onPause()
        player.stopPlayMusic()
    }
    override fun onDestroy() {
        super.onDestroy()
        handler?.removeCallbacksAndMessages(null)
        EventBus.getDefault().unregister(this)
    }
}