| | |
| | | package com.dollearn.student.ui.home |
| | | |
| | | import android.os.Handler |
| | | import android.util.Log |
| | | import androidx.core.os.bundleOf |
| | | import androidx.recyclerview.widget.GridLayoutManager |
| | | import cn.sinata.xldutils.gone |
| | | import cn.sinata.xldutils.utils.SPUtils |
| | | import cn.sinata.xldutils.utils.showAllowingStateLoss |
| | | import cn.sinata.xldutils.visible |
| | | import com.dollearn.student.R |
| | | import com.dollearn.student.dialog.TipDialog |
| | | import com.dollearn.student.network.HttpManager |
| | | import com.dollearn.student.network.entity.Card |
| | | import com.dollearn.student.network.entity.MemoryBean |
| | | import com.dollearn.student.network.request |
| | | import com.dollearn.student.ui.TransparentStatusBarActivity |
| | | import com.dollearn.student.ui.home.adapter.CardAdapter |
| | | import com.dollearn.student.utils.AudioUtils |
| | | import com.dollearn.student.utils.Const |
| | | import com.dollearn.student.utils.event.EmptyEvent |
| | | import kotlinx.android.synthetic.main.activity_memory.* |
| | | import kotlinx.android.synthetic.main.item_card.view.* |
| | | import org.greenrobot.eventbus.EventBus |
| | | import org.jetbrains.anko.imageResource |
| | | import kotlin.math.abs |
| | | import kotlin.math.max |
| | | import kotlin.math.min |
| | | import kotlin.math.sqrt |
| | | |
| | | class MemoryActivity : TransparentStatusBarActivity() { |
| | | class MemoryActivity : TransparentStatusBarActivity(), AudioUtils.OnAudioStatusUpdateListener { |
| | | override fun setContentView() = R.layout.activity_memory |
| | | |
| | | private val data by lazy { |
| | |
| | | } |
| | | private val list = arrayListOf<Card>() |
| | | private val adapter = CardAdapter(list) |
| | | val TAG = "Memory====>" |
| | | |
| | | private var lastTime = 600 //剩余秒 |
| | | |
| | | private var totalCount = 0 |
| | | private var rightCount = 0 |
| | | |
| | | private var handler: Handler? = null |
| | | var handler: Handler? = null |
| | | var time = 0 //学习秒数 |
| | | |
| | | |
| | | private val PLAY_VOICE = 1 |
| | | val PLAY_VOICE = 1 |
| | | private val STUDY_TIME = 2 |
| | | |
| | | private val player by lazy { com.dollearn.student.utils.AudioUtils() } |
| | | val PLAY_RIGHT = 4 |
| | | val PLAY_ERROR = 5 |
| | | |
| | | private var index = 0 |
| | | 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() } |
| | | |
| | | var index = 0 |
| | | |
| | | var playing = false |
| | | |
| | | override fun initClick() { |
| | | tv_exit.setOnClickListener { |
| | | if (tv_exit.text == "提交"){ |
| | | //todo 分数问题 |
| | | ResultActivity.startResult(this,0,0,0,7,totalCount,rightCount,100,time,data!!.data.id) |
| | | val right = list.filter { !it.isBack }.size / 2 |
| | | val total = data.photoList.size |
| | | val score = right*data.data.answerIntegral/total |
| | | ResultActivity.startResult(this,0,0,0,7, total, right,score,time,data!!.data.id) |
| | | finish() |
| | | }else |
| | | finish() |
| | | onBackPressed() |
| | | } |
| | | } |
| | | |
| | | override fun initView() { |
| | | player.setOnAudioStatusUpdateListener(this) |
| | | player.stopPlayMusic() |
| | | handler = object : Handler(android.os.Looper.getMainLooper()){ |
| | | override fun handleMessage(msg: android.os.Message) { |
| | | super.handleMessage(msg) |
| | |
| | | tipDialog.arguments = bundleOf("msg" to "答题时间已结束,停止作答!","isAlert" to true,"ok" to "查看成绩") |
| | | tipDialog.setDismissCallback(object :TipDialog.OnDismiss{ |
| | | override fun onDismiss() { |
| | | ResultActivity.startResult(this@MemoryActivity,0,0,0,7,totalCount,rightCount |
| | | ,100,time,data!!.data.id) |
| | | val right = list.filter { !it.isBack }.size / 2 |
| | | val total = data.photoList.size |
| | | val score = right*data.data.answerIntegral/total |
| | | ResultActivity.startResult(this@MemoryActivity,0,0,0,7,total,right |
| | | ,score,time,data.data.id) |
| | | finish() |
| | | } |
| | | }) |
| | | tipDialog.showAllowingStateLoss(supportFragmentManager,"finish") |
| | |
| | | sendEmptyMessageDelayed(STUDY_TIME,1000) |
| | | } |
| | | PLAY_VOICE->{ |
| | | playing = true |
| | | player.startPlayMusic(this@MemoryActivity,list[index].url) |
| | | rv_list.getChildAt(index).iv_play.setImageResource(R.mipmap.playing_blue) |
| | | } |
| | | PLAY_RIGHT->{ |
| | | playing = true |
| | | rightPlaying = true |
| | | player.startPlayMusic(this@MemoryActivity,rightVoice) |
| | | } |
| | | PLAY_ERROR->{ |
| | | playing = true |
| | | errorPlaying = true |
| | | player.startPlayMusic(this@MemoryActivity,errorVoice) |
| | | } |
| | | } |
| | | } |
| | | } |
| | | |
| | | lastTime = data.data.answerTime //倒计时时间 |
| | | tv_timer.text = "${lastTime}S" |
| | | handler?.sendEmptyMessageDelayed(STUDY_TIME,1000) |
| | | |
| | | rv_list.layoutManager = GridLayoutManager(this,5) |
| | | rv_list.adapter = adapter |
| | | list.addAll(data.photoList.map { Card(it.id,1,it.photo) }) |
| | | list.addAll(data.voiceList.map { Card(it.id,2,it.voice) }) |
| | | list.shuffle() |
| | | rv_list.postDelayed({ |
| | | initRecycler(list.size) |
| | | },500) |
| | | } |
| | | |
| | | /** |
| | | * 需要计算行列数 |
| | | */ |
| | | private fun initRecycler(total: Int){ |
| | | var bestRows = 1 |
| | | var bestColumns: Int = total |
| | | var i = 1 |
| | | while (i <= sqrt(total.toDouble())) { |
| | | val rows = i |
| | | val columns: Int = if (total%i>0) (total / i)+1 else total / i |
| | | // Calculate the absolute difference between rows and columns |
| | | val diff = abs(rows - columns) |
| | | // Update the best rows and columns if this pair has a smaller difference |
| | | if (diff < abs(bestRows - bestColumns)) { |
| | | bestRows = rows |
| | | bestColumns = columns |
| | | } |
| | | i++ |
| | | } |
| | | Log.e(TAG,"总数:$total,计算得到行数:${min(bestColumns,bestRows)},列数:${max(bestColumns,bestRows)}") |
| | | val lineHeight = rv_list.height.toDouble() / min(bestColumns, bestRows) |
| | | val lineWidth = rv_list.width.toDouble() / max(bestColumns, bestRows) |
| | | Log.e(TAG,"高度:${rv_list.height},计算得到行高:${lineHeight},宽度:${rv_list.width},计算得到行宽:${lineWidth}") |
| | | rv_list.layoutManager = GridLayoutManager(this, max(bestColumns,bestRows)) |
| | | adapter.height = lineHeight.toInt() |
| | | adapter.widgh = lineWidth.toInt() |
| | | adapter.notifyDataSetChanged() |
| | | } |
| | | |
| | |
| | | */ |
| | | fun flyover(position:Int){ |
| | | val card = list[position] |
| | | if (card.type == 2){ |
| | | if (card.type == 2){ //如果是语音 先播放语音 |
| | | index = position |
| | | handler?.sendEmptyMessage(PLAY_VOICE) |
| | | }else{ //不是语音直接比较结果 |
| | | checkResult() |
| | | } |
| | | } |
| | | |
| | | private fun checkResult(){ |
| | | if (adapter.position1!=-1&&adapter.position2!=-1){ //已经翻开2张卡片,比较结果是否匹配 |
| | | totalCount++ |
| | | val card1 = list[adapter.position1] |
| | | val card2 = list[adapter.position2] |
| | | if (card1.type!=card2.type&&card1.id == card2.id){//匹配成功 |
| | | adapter.releaseHolder() |
| | | handler?.sendEmptyMessage(PLAY_RIGHT) |
| | | rightCount++ |
| | | rv_list.getChildAt(adapter.position1).iv_result?.apply { |
| | | imageResource = R.mipmap.successs |
| | | visible() |
| | | postDelayed({ |
| | | gone() |
| | | },3000) |
| | | } |
| | | rv_list.getChildAt(adapter.position2).iv_result?.apply { |
| | | imageResource = R.mipmap.successs |
| | | visible() |
| | | postDelayed({ |
| | | gone() |
| | | },3000) |
| | | } |
| | | tv_timer.postDelayed({ |
| | | if (list.filter { !it.isBack }.size == list.size){ //全部答对 |
| | | tv_exit.text = "提交" |
| | |
| | | } |
| | | },500) |
| | | }else{ |
| | | tv_timer.postDelayed({ |
| | | adapter.bothToBack() |
| | | },500) |
| | | handler?.sendEmptyMessage(PLAY_ERROR) |
| | | rv_list.getChildAt(adapter.position1).iv_result?.apply { |
| | | imageResource = R.mipmap.zhifushibai |
| | | visible() |
| | | postDelayed({ |
| | | gone() |
| | | },3000) |
| | | } |
| | | rv_list.getChildAt(adapter.position2).iv_result?.apply { |
| | | imageResource = R.mipmap.zhifushibai |
| | | visible() |
| | | postDelayed({ |
| | | gone() |
| | | },3000) |
| | | } |
| | | } |
| | | } |
| | | } |
| | | |
| | | override fun onBackPressed() { |
| | | HttpManager.exitGameOrStory(time).request(this){ _, _-> |
| | | super.onBackPressed() |
| | | } |
| | | } |
| | | |
| | | override fun onDestroy() { |
| | | super.onDestroy() |
| | | handler?.removeMessages(PLAY_VOICE) |
| | | handler?.removeMessages(STUDY_TIME) |
| | | handler = null |
| | | EventBus.getDefault().post(EmptyEvent(Const.EventCode.STOP_TIMER)) |
| | | } |
| | | |
| | | override fun onPause() { |
| | | super.onPause() |
| | | player.stopPlayMusic() |
| | | } |
| | | |
| | | override fun onUpdate(db: Double, time: Long) { |
| | | |
| | | } |
| | | |
| | | override fun onStop(filePath: String?) { |
| | | } |
| | | |
| | | override fun onStartPlay() { |
| | | playing = true |
| | | } |
| | | |
| | | override fun onFinishPlay() { |
| | | playing = false |
| | | if (errorPlaying){ |
| | | errorPlaying = false |
| | | playing = true |
| | | tv_timer.postDelayed({ |
| | | adapter.bothToBack() |
| | | playing = false //防止翻转过程中点击,造成缓存view被销毁 |
| | | },500) |
| | | }else if (rightPlaying){ |
| | | rightPlaying = false |
| | | val card1 = list[adapter.position1] |
| | | if (card1.type == 2) |
| | | index = adapter.position1 |
| | | else |
| | | index = adapter.position2 |
| | | adapter.releaseHolder() |
| | | handler?.sendEmptyMessage(PLAY_VOICE) |
| | | }else{ |
| | | rv_list.getChildAt(index).iv_play.setImageResource(R.mipmap.play_blue) |
| | | checkResult() |
| | | } |
| | | } |
| | | } |