Newer
Older
MathsCalc / app / src / main / java / me / bello / mathscalc / activity / CalcActivity.java
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);
    }
}