package com.dollearn.student.ui.home
|
|
import android.os.Handler
|
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.extention.clickDelay
|
import kotlinx.android.synthetic.main.fragment_include.*
|
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
|
|
private val TAG = "Include=======》"
|
|
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 }
|
private val data by lazy {
|
(requireActivity() as IncludeActivity).data
|
}
|
|
private val act by lazy { requireActivity() as IncludeActivity }
|
|
private var voiceIndex = -1 //点击播放的声音序号 0-5取值
|
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()
|
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->{
|
if (isAdded&&!playing){
|
(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]
|
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)
|
constraintLayout.isEnabled = true
|
else{
|
if (index == 3||index == 5)
|
constraintLayout.isEnabled = data!!.subjectList[group][index-1].completed
|
else
|
constraintLayout.isEnabled = data!!.subjectList[group][index].listend
|
}
|
}
|
initClick()
|
showVoiceEnable()
|
isAutoPlaying = true
|
voiceViews[0].callOnClick()
|
}
|
|
private fun initClick() {
|
voiceViews.forEachIndexed { index, constraintLayout ->
|
constraintLayout.setOnClickListener {
|
if (!playing){
|
if (index!=0&&!data!!.subjectList[group][index-1].listend){
|
myToast("请按顺序听语音")
|
return@setOnClickListener
|
}
|
voiceIndex = index
|
handler?.sendEmptyMessage(PLAY_VOICE)
|
}
|
}
|
}
|
|
cl_answer_1.clickDelay {
|
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++
|
handler?.sendEmptyMessage(PLAY_RIGHT)
|
motion.transitionToEnd()
|
showResultAnim()
|
}else{
|
right = false
|
handler?.sendEmptyMessage(PLAY_ERROR)
|
iv_error_1.visible()
|
iv_error_1.postDelayed({
|
clearAnswerImg()
|
},3000)
|
}
|
}
|
|
cl_answer_2.clickDelay {
|
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){
|
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()
|
},3000)
|
}
|
}
|
|
cl_answer_3.clickDelay {
|
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){
|
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(){
|
voiceViews.forEachIndexed { index, constraintLayout ->
|
if (index == 0)
|
constraintLayout.isEnabled = true
|
else{
|
if (index == 3||index == 5)
|
constraintLayout.isEnabled = data!!.subjectList[group][index-1].completed
|
else
|
constraintLayout.isEnabled = data!!.subjectList[group][index-1].listend
|
}
|
}
|
}
|
|
/**
|
* 答错后重置
|
*/
|
private fun clearAnswerImg(){
|
iv_answer_1.setImageURI("")
|
iv_answer_2.setImageURI("")
|
iv_answer_3.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()
|
iv_error_1.gone()
|
iv_error_2.gone()
|
iv_error_3.gone()
|
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])
|
iv_answer_3.setImageURI(answerImg[2])
|
|
iv_full_1.visible()
|
iv_full_2.visible()
|
iv_full_3.visible()
|
|
val voiceNow = data!!.subjectList[group][currentImage]
|
//设置动画飞行路径 3对3
|
val rightImageIndex = answerImg.indexOf(voiceNow.img)
|
var start = 0
|
var end = 0
|
when(rightImageIndex){
|
0->{
|
start = R.id.start_1
|
when(currentImage){
|
2-> end = R.id.end_1_1
|
4-> end = R.id.end_1_2
|
5-> end = R.id.end_1_3
|
}
|
}
|
1->{
|
start = R.id.start_2
|
when(currentImage){
|
2-> end = R.id.end_2_1
|
4-> end = R.id.end_2_2
|
5-> end = R.id.end_2_3
|
}
|
}
|
2->{
|
start = R.id.start_3
|
when(currentImage){
|
2-> end = R.id.end_3_1
|
4-> end = R.id.end_3_2
|
5-> end = R.id.end_3_3
|
}
|
}
|
}
|
motion.progress = 0f
|
motion.setTransition(start,end)
|
motion.setTransitionListener(object : MotionLayout.TransitionListener{
|
override fun onTransitionStarted(p0: MotionLayout?, p1: Int, p2: Int) {
|
when(rightImageIndex){
|
0->{
|
iv_full_1.gone()
|
}
|
1->{
|
iv_full_2.gone()
|
}
|
2->{
|
iv_full_3.gone()
|
}
|
}
|
}
|
|
override fun onTransitionChange(p0: MotionLayout?, p1: Int, p2: Int, p3: Float) {
|
}
|
|
override fun onTransitionCompleted(p0: MotionLayout?, p1: Int) {
|
when(currentImage){
|
2->{
|
iv_3.setImageURI(data!!.subjectList[group][2].img)
|
}
|
4->{
|
iv_5.setImageURI(data!!.subjectList[group][4].img)
|
}
|
5->{
|
iv_6.setImageURI(data!!.subjectList[group][5].img)
|
}
|
}
|
}
|
|
override fun onTransitionTrigger(p0: MotionLayout?, p1: Int, p2: Boolean, p3: Float) {
|
}
|
})
|
}
|
|
/**
|
* 回到上一题,恢复状态
|
*/
|
fun recover(){
|
Log.e(TAG,"回到上一题,恢复答题前的状态")
|
right = true
|
isAutoPlaying = false
|
motion.progress = 0f
|
clearAnswerImg()
|
currentImage = 0
|
data!!.subjectList[group].forEach {
|
it.completed = false
|
it.listend = false
|
}
|
showVoiceEnable()
|
}
|
|
companion object{
|
/**
|
* @param group 题组号
|
* @param index 组内序号
|
*/
|
fun getInstance(group:Int):IncludeFragment{
|
val listenFragment = IncludeFragment()
|
listenFragment.arguments = bundleOf("group" to group)
|
return listenFragment
|
}
|
}
|
|
override fun onUpdate(db: Double, time: Long) {
|
}
|
|
override fun onStop(filePath: String?) {
|
}
|
|
override fun onStartPlay() {
|
playing = true
|
if (errorPlaying||rightPlaying)
|
return
|
when(voiceIndex){
|
0->{
|
iv1_1.gone()
|
iv2_1.gone()
|
iv_playing_1.visible()
|
}
|
1->{
|
iv1_2.gone()
|
iv2_2.gone()
|
iv_playing_2.visible()
|
}
|
2->{
|
iv1_3.gone()
|
iv2_3.gone()
|
iv_playing_3.visible()
|
|
}
|
3->{
|
iv1_4.gone()
|
iv2_4.gone()
|
iv_playing_4.visible()
|
}
|
4->{
|
iv1_5.gone()
|
iv2_5.gone()
|
iv_playing_5.visible()
|
}
|
5->{
|
iv1_6.gone()
|
iv2_6.gone()
|
iv_playing_6.visible()
|
}
|
|
}
|
}
|
|
override fun onFinishPlay() {
|
playing = false
|
val subject = data!!.subjectList[group][voiceIndex]
|
when(voiceIndex){
|
0->{
|
iv1_1.visible()
|
iv2_1.visible()
|
iv_playing_1.gone()
|
}
|
1->{
|
iv1_2.visible()
|
iv2_2.visible()
|
iv_playing_2.gone()
|
}
|
2->{
|
iv1_3.visible()
|
iv2_3.visible()
|
iv_playing_3.gone()
|
if (!subject.completed){
|
currentImage = 2
|
showAnswerImg()
|
}else{
|
hideAnswerImg()
|
}
|
}
|
3->{
|
iv1_4.visible()
|
iv2_4.visible()
|
iv_playing_4.gone()
|
}
|
4->{
|
iv1_5.visible()
|
iv2_5.visible()
|
iv_playing_5.gone()
|
if (!subject.completed){
|
currentImage = 4
|
showAnswerImg()
|
}else{
|
hideAnswerImg()
|
}
|
}
|
5->{
|
iv1_6.visible()
|
iv2_6.visible()
|
iv_playing_6.gone()
|
if (!subject.completed){
|
currentImage = 5
|
showAnswerImg()
|
}else{
|
hideAnswerImg()
|
Log.e(TAG,"本题全部答对,3秒后进入下一图")
|
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)
|
}
|
}
|