| | |
| | | package com.dollearn.student.ui.home |
| | | |
| | | import android.R.attr.animation |
| | | import android.R.attr.max |
| | | import android.animation.Animator |
| | | import android.animation.ObjectAnimator |
| | | import android.animation.PropertyValuesHolder |
| | | import android.animation.ValueAnimator |
| | | import android.os.Handler |
| | | import android.os.Looper |
| | | import android.os.Message |
| | | import android.util.Log |
| | | import android.view.View |
| | | import android.view.animation.LinearInterpolator |
| | | import androidx.recyclerview.widget.GridLayoutManager |
| | | import cn.sinata.xldutils.gone |
| | | import cn.sinata.xldutils.utils.SPUtils |
| | |
| | | import com.dollearn.student.utils.event.EmptyEvent |
| | | import com.dollearn.student.utils.interfaces.StringCallback |
| | | import kotlinx.android.synthetic.main.activity_super_listen.* |
| | | import kotlinx.android.synthetic.main.fragment_q_a.* |
| | | import kotlinx.android.synthetic.main.fragmetn_look_img.* |
| | | import kotlinx.android.synthetic.main.item_game_1.view.* |
| | | import org.greenrobot.eventbus.EventBus |
| | | import org.jetbrains.anko.dip |
| | | import kotlin.math.abs |
| | | import kotlin.math.max |
| | | import kotlin.math.min |
| | |
| | | class SuperListenActivity : TransparentStatusBarActivity(), AudioUtils.OnAudioStatusUpdateListener { |
| | | override fun setContentView() = R.layout.activity_super_listen |
| | | |
| | | val level by lazy { //0就只能点入门,1就是入门和中级都能点,2就是入门、中级高级三个难度都可以点 |
| | | intent.getIntExtra("level", 0) |
| | | } |
| | | private val week by lazy { |
| | | intent.getIntExtra("week", 0) |
| | | } |
| | |
| | | |
| | | val TAG = "Listen====>" |
| | | |
| | | val list = arrayListOf<Subject>() |
| | | var list = arrayListOf<Subject>() |
| | | private val adapter = GameAdapter(list) |
| | | |
| | | val PLAY_VOICE = 1 |
| | |
| | | |
| | | var state = 0 //0:准备听题 1:听题中 2:请作答 3:结束答题 |
| | | |
| | | var showFullImage = false |
| | | var paused = false |
| | | |
| | | override fun initClick() { |
| | | tv_exit.setOnClickListener { |
| | | if (tv_exit.text == "提交"){ |
| | |
| | | finish() |
| | | }else |
| | | onBackPressed() |
| | | } |
| | | |
| | | cl_voice.setOnClickListener { |
| | | if (!playing){ |
| | | handler?.sendEmptyMessage(PLAY_VOICE) |
| | | } |
| | | } |
| | | } |
| | | |
| | |
| | | sendEmptyMessageDelayed(STUDY_TIME, 1000) |
| | | } |
| | | PLAY_VOICE -> { |
| | | if (index < voiceList.size) |
| | | if (!paused&&!playing&&index < voiceList.size) { |
| | | playing = true |
| | | player.startPlayMusic(this@SuperListenActivity, voiceList[index]) |
| | | } |
| | | } |
| | | COUNT_DOWN -> { |
| | | if (!playing) { |
| | |
| | | tv_tip.text = "请在${countTime}s内选择答案!" |
| | | if (countTime == 0) { |
| | | index++ |
| | | startGame() |
| | | startGame(true) |
| | | } else { |
| | | sendEmptyMessageDelayed(COUNT_DOWN, 1000) |
| | | } |
| | | } |
| | | PLAY_RIGHT -> { |
| | | playing = true |
| | | rightPlaying = true |
| | | player.startPlayMusic(this@SuperListenActivity, rightVoice) |
| | | } |
| | | PLAY_ERROR -> { |
| | | playing = true |
| | | errorPlaying = true |
| | | player.startPlayMusic(this@SuperListenActivity, errorVoice) |
| | | } |
| | |
| | | countdownDialog.callback = object :StringCallback{ |
| | | override fun onResult(rst: String) { |
| | | index = 0 |
| | | startGame() |
| | | startGame(true) |
| | | } |
| | | } |
| | | countdownDialog.show(supportFragmentManager, "timer") |
| | |
| | | } |
| | | i++ |
| | | } |
| | | Log.e(TAG,"总数:$total,计算得到行数:${min(bestColumns,bestRows)},列数:${max(bestColumns,bestRows)}") |
| | | Log.e(TAG, "总数:$total,计算得到行数:${min(bestColumns, bestRows)},列数:${max(bestColumns, bestRows)}") |
| | | val lineHeight = rv_list.height.toDouble() / min(bestColumns, bestRows) |
| | | Log.e(TAG,"高度:${rv_list.height},计算得到行高:${lineHeight}") |
| | | rv_list.layoutManager = GridLayoutManager(this, max(bestColumns,bestRows)) |
| | | Log.e(TAG, "高度:${rv_list.height},计算得到行高:${lineHeight}") |
| | | rv_list.layoutManager = GridLayoutManager(this, max(bestColumns, bestRows)) |
| | | adapter.height = lineHeight.toInt() |
| | | adapter.notifyDataSetChanged() |
| | | } |
| | | |
| | | fun startGame() { |
| | | /** |
| | | * 切题 |
| | | * @param playNow true:表示立即播放下一题 false:3秒后播放下一题 |
| | | */ |
| | | fun startGame(playNow: Boolean = false) { |
| | | if (index < voiceList.size){ |
| | | Log.e(TAG, "开始答题:index=${index}") |
| | | tv_sort.text = (index+1).toString() |
| | |
| | | countTime = TIME //重置答题时间 |
| | | tv_tip.text = "准备听题" |
| | | state = 0 |
| | | handler?.sendEmptyMessageDelayed(PLAY_VOICE, if (index == 0) 200 else 3000) |
| | | handler?.sendEmptyMessageDelayed(PLAY_VOICE, if (playNow) 200 else 1000) |
| | | }else{ |
| | | tv_sort.visibility = View.INVISIBLE |
| | | cl_voice.visibility = View.INVISIBLE |
| | | tv_tip.text = "" |
| | | state = 3 |
| | | tv_end.text = "已完成全部问题" |
| | |
| | | handler?.removeMessages(STUDY_TIME) |
| | | } |
| | | } |
| | | |
| | | fun transAnimation(endView: View){ |
| | | val offx = getScreenX(endView) - getScreenX(cl_voice) |
| | | val offy = getScreenY(endView) - getScreenY(cl_voice) |
| | | val x = PropertyValuesHolder.ofFloat("translationX", 0f, offx.toFloat()) |
| | | val y = PropertyValuesHolder.ofFloat("translationY", 0f, offy.toFloat()) |
| | | val animator = ObjectAnimator.ofPropertyValuesHolder(cl_voice, x, y) |
| | | animator.duration = 500 |
| | | animator.interpolator = LinearInterpolator() |
| | | val withAnim = ValueAnimator.ofInt(cl_voice.width, endView.width).setDuration(500) //会影响结束坐标 |
| | | withAnim.addUpdateListener { |
| | | cl_voice.layoutParams.width = it.animatedValue as Int |
| | | cl_voice.requestLayout() |
| | | } |
| | | val heightAnim = ValueAnimator.ofInt(cl_voice.height, endView.height).setDuration(500) |
| | | heightAnim.addUpdateListener { |
| | | cl_voice.layoutParams.height = it.animatedValue as Int |
| | | cl_voice.requestLayout() |
| | | } |
| | | withAnim.start() |
| | | heightAnim.start() |
| | | animator.start() |
| | | animator.addListener(object : Animator.AnimatorListener { |
| | | override fun onAnimationStart(animation: Animator?) { |
| | | |
| | | } |
| | | |
| | | override fun onAnimationEnd(animation: Animator?) { |
| | | endView.visible() |
| | | } |
| | | |
| | | override fun onAnimationCancel(animation: Animator?) { |
| | | } |
| | | |
| | | override fun onAnimationRepeat(animation: Animator?) { |
| | | } |
| | | }) |
| | | } |
| | | |
| | | private fun getScreenY(v: View):Int{ |
| | | val xy = IntArray(2) |
| | | v.getLocationOnScreen(xy) |
| | | return xy[1] |
| | | } |
| | | private fun getScreenX(v: View):Int{ |
| | | val xy = IntArray(2) |
| | | v.getLocationOnScreen(xy) |
| | | return xy[0] |
| | | } |
| | | |
| | | |
| | | override fun onUpdate(db: Double, time: Long) { |
| | | } |
| | |
| | | playing = true |
| | | if (errorPlaying||rightPlaying) |
| | | return |
| | | if (!data!!.subjectList[data!!.subjectList.map { it.correct }.indexOf(voiceList[index])].completed){//首次播放 |
| | | // if (!data!!.subjectList[data!!.subjectList.map { it.correct }.indexOf(voiceList[index])].completed){//首次播放 |
| | | if (handler?.hasMessages(COUNT_DOWN) == false){//首次播放 |
| | | state = 1 |
| | | tv_tip.text = "请在${countTime}s内选择答案!" |
| | | handler?.sendEmptyMessageDelayed(COUNT_DOWN, 1000) |
| | |
| | | iv1.visible() |
| | | iv2.visible() |
| | | iv_playing.gone() |
| | | if (data!!.subjectList[data!!.subjectList.map { it.correct }.indexOf(voiceList[index])].completed){ //当前题目已作答,3秒后进入下一题 |
| | | if (data!!.subjectList[data!!.subjectList.map { it.correct }.indexOf(voiceList[min(index,voiceList.lastIndex)])].completed){ //当前题目已作答,3秒后进入下一题 |
| | | index++ |
| | | startGame() |
| | | } |
| | | if (errorPlaying) |
| | | errorPlaying = false |
| | | if (rightPlaying){ |
| | | else if (rightPlaying){ |
| | | rightPlaying = false |
| | | val subject = data!!.subjectList[data!!.subjectList.map { it.correct } |
| | | .indexOf(voiceList[index])] //当前音频对应题目 |
| | | subject.completed = true |
| | | handler?.sendEmptyMessage(PLAY_VOICE) |
| | | cl_voice.translationX = 0f |
| | | cl_voice.translationY = 0f |
| | | cl_voice.layoutParams.width = dip(159) |
| | | cl_voice.layoutParams.height = dip(52) |
| | | cl_voice.requestLayout() |
| | | }else{ |
| | | |
| | | } |
| | | } |
| | | |
| | |
| | | EventBus.getDefault().post(EmptyEvent(Const.EventCode.STOP_TIMER)) |
| | | } |
| | | |
| | | override fun onResume() { |
| | | super.onResume() |
| | | if (paused){ |
| | | paused = false |
| | | handler?.sendEmptyMessageDelayed(PLAY_VOICE, 200) |
| | | } |
| | | } |
| | | |
| | | override fun onPause() { |
| | | super.onPause() |
| | | player.stopPlayMusic() |
| | | if (!showFullImage){ |
| | | player.stopPlayMusic() |
| | | paused = true |
| | | } |
| | | showFullImage = false |
| | | } |
| | | } |