package me.bello.mathscalc.activity;
import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.media.MediaPlayer;
import android.os.Bundle;
import android.os.CountDownTimer;
import android.os.Handler;
import android.support.annotation.Nullable;
import android.support.v4.content.ContextCompat;
import android.support.v7.app.AppCompatActivity;
import android.text.Html;
import android.text.TextUtils;
import android.util.Log;
import android.view.KeyEvent;
import android.view.View;
import android.widget.FrameLayout;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.ListView;
import android.widget.RelativeLayout;
import android.widget.TextView;
import android.widget.Toast;
import java.math.BigDecimal;
import java.util.ArrayList;
import me.bello.mathscalc.R;
import me.bello.mathscalc.adapter.QuestionAdapter;
import me.bello.mathscalc.data.MathsBean;
import me.bello.mathscalc.util.AnimUtils;
import me.bello.mathscalc.util.AppBarUtils;
import me.bello.mathscalc.util.GenerateUtils;
import me.bello.mathscalc.util.PreferenceUtils;
import me.bello.mathscalc.util.ScoreUtils;
/**
* @Info
* @Auth Bello
* @Time 2018/11/10 10:49
* @Ver
*/
public class CalcActivity extends AppCompatActivity implements View.OnClickListener {
private Context mContext;
private TextView topText;
private TextView stepText;
private TextView rightText;
private TextView wrongText;
private TextView questionText;
private TextView answerText;
private TextView timerText;
private ImageView resultImg;
private FrameLayout okBtn;
private RelativeLayout resultLayout;
private ListView mListView;
private LinearLayout keyLayout;
private RelativeLayout questionLayout;
private ImageView scoreImg;
private TextView scoreDesc;
private MediaPlayer mediaPlayer;
private ImageView voiceImg;
//题目集合
private ArrayList<MathsBean> list;
private int min;
private int max;
private int series;
private boolean add;
private boolean sub;
private boolean mult;
private boolean divs;
private int timeLength;
private int count;
//当前题目位置
private int currentPosition = 0;
//音效开关
private boolean voiceEnable = true;
//是否正在答题
private boolean isAnswering = true;
private TextView scoreText;
private CountDownTimer timer;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
AppBarUtils.hideStatusBarAndShowNavigationBar(this, false);
setContentView(R.layout.activity_calc);
mContext = CalcActivity.this;
min = getIntent().getIntExtra("min", 0);
max = getIntent().getIntExtra("max", 10);
series = getIntent().getIntExtra("series", 1);
add = getIntent().getBooleanExtra("add", true);
sub = getIntent().getBooleanExtra("sub", true);
mult = getIntent().getBooleanExtra("mult", false);
divs = getIntent().getBooleanExtra("divs", false);
timeLength = getIntent().getIntExtra("timeLength", 0);
count = getIntent().getIntExtra("count", 10);
startGeneration();
}
/**
* 开始生成题目
*/
private void startGeneration() {
//生成数据
list = GenerateUtils.generate(min, max, series, add, sub, mult, divs, count);
if (null == list || list.size() == 0)
return;
initUI();
isAnswering = true;
scoreText.setVisibility(View.GONE);
// 初始化倒计时
timer = new CountDownTimer((timeLength+1) * 1000, 1000) {
@Override
public void onTick(long l) {
// 显示倒计时值
// AnimUtils.animAlpha(timerText);
timerText.setText((l / 1000) + "");
}
@Override
public void onFinish() {
calc();
}
};
// 开始出题
start(0);
}
/**
* 初始化UI
*/
private void initUI() {
findViewById(R.id.top_back_image).setOnClickListener(this);
topText = findViewById(R.id.top_title_text);
String title = min + "-" + max + "以内的" + (add ? "加" : "") + (sub ? "减" : "") + (mult ? "乘" : "") + (divs ? "除" : "") + "法";
topText.setText(title);
stepText = findViewById(R.id.step_text);
voiceImg = findViewById(R.id.voice_image);
voiceImg.setOnClickListener(this);
if (voiceEnable) {
voiceImg.setImageResource(R.drawable.ic_voice_normal);
} else {
voiceImg.setImageResource(R.drawable.ic_voice_close);
}
rightText = findViewById(R.id.right_text);
wrongText = findViewById(R.id.wrong_text);
rightText.setText("0");
wrongText.setText("0");
questionText = findViewById(R.id.question_text);
answerText = findViewById(R.id.answer_text);
resultImg = findViewById(R.id.result_image);
timerText = findViewById(R.id.timer_text);
findViewById(R.id.key_0).setOnClickListener(this);
findViewById(R.id.key_1).setOnClickListener(this);
findViewById(R.id.key_2).setOnClickListener(this);
findViewById(R.id.key_3).setOnClickListener(this);
findViewById(R.id.key_4).setOnClickListener(this);
findViewById(R.id.key_5).setOnClickListener(this);
findViewById(R.id.key_6).setOnClickListener(this);
findViewById(R.id.key_7).setOnClickListener(this);
findViewById(R.id.key_8).setOnClickListener(this);
findViewById(R.id.key_9).setOnClickListener(this);
findViewById(R.id.key_clean).setOnClickListener(this);
okBtn = findViewById(R.id.key_ok);
okBtn.setOnClickListener(this);
keyLayout = findViewById(R.id.key_layout);
keyLayout.setVisibility(View.VISIBLE);
questionLayout = findViewById(R.id.question_layout);
questionLayout.setVisibility(View.VISIBLE);
resultLayout = findViewById(R.id.result_layout);
resultLayout.setVisibility(View.GONE);
findViewById(R.id.reset_btn).setOnClickListener(this);
findViewById(R.id.close_btn).setOnClickListener(this);
scoreImg = findViewById(R.id.score_image);
scoreDesc = findViewById(R.id.score_desc_text);
scoreText = findViewById(R.id.add_score_text);
mListView = findViewById(R.id.question_list_view);
}
@Override
public void onClick(View view) {
String value = answerText.getText().toString().trim();
switch (view.getId()) {
//返回
case R.id.top_back_image:
case R.id.close_btn:
closeDialog();
break;
//开关音效
case R.id.voice_image:
voiceEnable = !voiceEnable;
if (voiceEnable) {
voiceImg.setImageResource(R.drawable.ic_voice_normal);
} else {
voiceImg.setImageResource(R.drawable.ic_voice_close);
}
break;
case R.id.key_0:
answerText.setText(value + "0");
break;
case R.id.key_1:
answerText.setText(value + "1");
break;
case R.id.key_2:
answerText.setText(value + "2");
break;
case R.id.key_3:
answerText.setText(value + "3");
break;
case R.id.key_4:
answerText.setText(value + "4");
break;
case R.id.key_5:
answerText.setText(value + "5");
break;
case R.id.key_6:
answerText.setText(value + "6");
break;
case R.id.key_7:
answerText.setText(value + "7");
break;
case R.id.key_8:
answerText.setText(value + "8");
break;
case R.id.key_9:
answerText.setText(value + "9");
break;
//清空答案
case R.id.key_clean:
answerText.setText("");
break;
//提交答案
case R.id.key_ok:
if (okBtn.isClickable()) {
okBtn.setClickable(false);
calc();
}
break;
//重新开始
case R.id.reset_btn:
currentPosition = 0;
list.clear();
startGeneration();
break;
}
}
/**
* 取第几题
*
* @param position
*/
private void start(int position) {
okBtn.setClickable(true);
currentPosition = position;
MathsBean data = list.get(position);
//位置
stepText.setText((position + 1) + "/" + list.size());
//题目
String q = data.getQuestion();
q = q.replace("=", " <font color='#f4ce9b'>=</font>")
.replace("+", " <font color='#c1a6e7'>+</font> ")
.replace("-", " <font color='#c1a6e7'>-</font> ")
.replace("x", " <font color='#c1a6e7'>x</font> ")
.replace("÷", " <font color='#c1a6e7'>÷</font> ");
Log.e("result", q);
questionText.setText(Html.fromHtml(q));
answerText.setText("");
AnimUtils.animTranslate(questionText);
resultImg.setBackground(null);
// 打开倒计时
if (timeLength != 0) {
timerText.setVisibility(View.VISIBLE);
timer.start();
}
}
/**
* 计算结果
*/
private void calc() {
// 取消本次倒计时
timer.cancel();
timerText.setVisibility(View.GONE);
//比较答案
int answer;
// 不带倒计时功能时
if (timeLength == 0) {
if (TextUtils.isEmpty(answerText.getText().toString().trim())) {
Toast.makeText(mContext, "要填答案哦!", Toast.LENGTH_SHORT).show();
okBtn.setClickable(true);
return;
} else {
answer = Integer.parseInt(answerText.getText().toString().trim());
}
// 带倒计时功能时
} else {
if (TextUtils.isEmpty(answerText.getText().toString().trim())) {
answer = -1;
} else {
answer = Integer.parseInt(answerText.getText().toString().trim());
}
}
if (answer == list.get(currentPosition).getResult()) {
playMp3(true);
resultImg.setBackground(ContextCompat.getDrawable(mContext, R.drawable.ic_smile));
AnimUtils.animScale(resultImg);
list.get(currentPosition).setRight(true);
} else {
playMp3(false);
resultImg.setBackground(ContextCompat.getDrawable(mContext, R.drawable.ic_sad));
AnimUtils.animScale(resultImg);
list.get(currentPosition).setRight(false);
}
//保存答案
list.get(currentPosition).setAnswer(answerText.getText().toString().trim());
//统计对错
int rightCount = 0;
int wrongCount = 0;
for (MathsBean d : list) {
if (!TextUtils.isEmpty(d.getAnswer())) {
if (d.isRight()) {
rightCount++;
} else {
wrongCount++;
}
}
}
rightText.setText(rightCount + "");
wrongText.setText(wrongCount + "");
if (currentPosition < list.size() - 1) {
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
start(currentPosition + 1);
}
}, 1000);
} else {
end(rightCount);
}
}
//显示结果
private void end(int rightCount) {
keyLayout.setVisibility(View.GONE);
questionLayout.setVisibility(View.GONE);
resultLayout.setVisibility(View.VISIBLE);
QuestionAdapter adapter = new QuestionAdapter(mContext, list);
mListView.setAdapter(adapter);
//计算得分
int score = new BigDecimal(rightCount).multiply(new BigDecimal(100)).divide(new BigDecimal(count), BigDecimal.ROUND_HALF_DOWN).intValue();
if (score >= 90) {
scoreDesc.setText("你真棒!(O ^ ~ ^ O)");
scoreImg.setImageResource(R.drawable.ic_score1);
} else if (score >= 80) {
scoreDesc.setText("真厉害!ˇ▽ˇ");
scoreImg.setImageResource(R.drawable.ic_score2);
} else if (score >= 70) {
scoreDesc.setText("不错,你离100分不差多少了!>3<");
scoreImg.setImageResource(R.drawable.ic_score3);
} else if (score >= 60) {
scoreDesc.setText("加油!⊙ω⊙");
scoreImg.setImageResource(R.drawable.ic_score4);
} else if (score >= 30) {
scoreDesc.setText("嘿嘿,继续! ( ̄3 ̄)");
scoreImg.setImageResource(R.drawable.ic_score5);
} else {
scoreDesc.setText("再做10遍吧! ̄▽ ̄");
scoreImg.setImageResource(R.drawable.ic_score6);
}
//记录答题完成
isAnswering = false;
//保存积分
int points = 0;
if (series == 1) {
if (add && sub) {
points = rightCount * 2;
} else {
points = rightCount;
}
} else if (series == 2) {
if (add && sub) {
points = rightCount * 4;
} else {
points = rightCount * 3;
}
} else if (series == 3) {
if (add && sub) {
points = rightCount * 6;
} else {
points = rightCount * 5;
}
}
scoreText.setText("+" + points);
scoreText.setVisibility(View.VISIBLE);
AnimUtils.animRotate(scoreText);
points += PreferenceUtils.getInt(PreferenceUtils.SCORE, 0);
PreferenceUtils.setInt(PreferenceUtils.SCORE, points);
ScoreUtils.checkScoreLine(mContext, points);
}
/**
* 退出答题页
*/
private void closeDialog() {
//答题状态时,提示退出
if (isAnswering) {
final AlertDialog.Builder builder = new AlertDialog.Builder(mContext);
builder.setTitle("确认框");
builder.setMessage("你确定要退出练习吗?");
builder.setPositiveButton("确定", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
dialogInterface.cancel();
finish();
}
});
builder.setNegativeButton("取消", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
dialogInterface.cancel();
}
});
builder.show();
} else {
finish();
}
}
/**
* 播放音效
*
* @param isRight
*/
private void playMp3(boolean isRight) {
//静音返回
if (!voiceEnable)
return;
if (isRight) {
mediaPlayer = MediaPlayer.create(mContext, R.raw.m_right);
} else {
mediaPlayer = MediaPlayer.create(mContext, R.raw.m_wrong);
}
mediaPlayer.start();
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
if (null != mediaPlayer) {
mediaPlayer.stop();
mediaPlayer.release();
mediaPlayer = null;
}
}
}, 1000);
}
@Override
protected void onDestroy() {
timer.cancel();
super.onDestroy();
}
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_BACK) {
closeDialog();
return true;
}
return super.onKeyDown(keyCode, event);
}
}