最近趁着春节假期,打算系统的再扫一遍androidd知识,学习《Android编程权威指南第三版》,前6章讲了一个项目,关于地理知识问题解答

效果如下

如果作弊了,会检测到

功能点

新知识点

  1. ShowAnswer按钮点击后会消失的动画代码如下
int cx = mShowAnswerButton.getWidth() / 2;
int cy = mShowAnswerButton.getHeight() / 2;
float radius = mShowAnswerButton.getWidth();
// 参数为 目标,中心X坐标,中心Y坐标,开始宽度,结束宽度
Animator animator = ViewAnimationUtils.createCircularReveal(mShowAnswerButton, cx, cy, radius, 0);
animator.addListener(new Animator.AnimatorListener() {
    @Override
    public void onAnimationStart(Animator animation) {
    }
    @Override
    public void onAnimationEnd(Animator animation) {
        mShowAnswerButton.setVisibility(View.INVISIBLE);
    }
    @Override
    public void onAnimationCancel(Animator animation) {
    }
    @Override
    public void onAnimationRepeat(Animator animation) {
    }
});
animator.start();
  1. 作弊能被检测到,方法是,在从QuizActivity界面点击cheat跳转到CheatActivity时,使用startIntentForResult()启动Intent,此时会携带一个请求码(这个请求码会自动返回到QuizActivity),然后在CheatActivity中,如果点击了ShowAnswer按钮,就修改请求码即可,然后返回到QuizActivity处理

在QuizActivity中跳转

startActivityForResult(intent,REQUEST_CODE_CHEAT);

在CheatActivity中设置

mShowAnswerButton.setOnClickListener(new View.OnClickListener() {
            @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP) //动画在LOLLIPOP版本后才加入
            @Override
            public void onClick(View v) {
                if (mAnswerIsTrue) {
                    mAnswerTextView.setText(R.string.true_button);
                }
                else {
                    mAnswerTextView.setText(R.string.false_button);
                }
                setAnswerShownResult(true);
                ...
private void setAnswerShownResult(boolean isAnswerShown) {
    Intent data = new Intent();
    data.putExtra(EXTRA_ANSWER_SHOWN, isAnswerShown);
    setResult(RESULT_OK,data);
}

然后被set过的data返回到QuizActivity中,进行检测

//当startForResult带回的数据含有RESULT_OK和data有数据时,判定为cheat
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if (resultCode != Activity.RESULT_OK) {
        return;
    }
    //判定是否进入的Cheat界面
    if (requestCode == REQUEST_CODE_CHEAT) {
    	//判定是否点击了ShowAnswer按钮
        if (data == null) {
            return;
        }
        mIsCheater = CheatActivity.wasAnswerShown(data);
    }
}

mIsCheater 即为是否作弊的标识 ,这里的wasAnswerShown在CheatActivity中,是一个静态方法

public static boolean wasAnswerShown(Intent result) {
    return result.getBooleanExtra(EXTRA_ANSWER_SHOWN, false);
}

除此之外,代码中还有解决横屏的问题等,书中也有其他要求,比如设置一个自定义的Toast,最多作弊三次等等,不过这些都过于简单,就没有再实现了

如何调试,如何查看内存,如何适配版本等也在前6章有所介绍,和《第一行代码》比起来,这本书可能不适合纯小白,但是如果你有一点基础,那么看这本书一定让你收获颇丰!!

关注公众号 【小松的读书与成长】,回复“ 权威指南” 即可获得pdf

ps:不想关注也行,毕竟我也是从网上搜到的

链接:https://pan.baidu.com/s/1fV83_CgbSfmHXsNwOx011w
提取码:j45a