Android开发实战小游戏“1秒OneSecond”,适合新手训练

1、先上图看下效果

2、基本需求
2.1、玩家凭个人感觉长按点击区域,大概1秒时松开,系统会检测本次时间;
2.2、如果时间误差在0.1秒内(超过0.1秒或差0.1秒)均记录“大神”1次,否则记录“凡人”1次;
2.3、“大神”1次以红色显示,突出效果;

3、主要技术点
3.1、相对布局加线性布局,整体使用相对布局,中间按钮部分使用线性布局;
3.2、中间长按区域不是按钮,是一个布局(可以看成是一个View),并且绑定onTouch事件;
3.3、普通View要实现Touch事件必须加上属性android:clickable=”true”,否则只能TouchDown,其他均无法响应;
3.4、“按钮”上有两行文字,必要的时候只显示一行,2行时平分,1行是居中;
3.5、android:visibility=”xxx”,xxx有三个枚举值分别为:gone、visible、invisible;

4、关键代码
XML

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="#0096FA"
    tools:context="com.yusian.onesecond.MainActivity">
 
    <TextView
        android:id="@+id/tv_tag"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textSize="40sp"
        android:text="你的一秒钟\n有多长?"
        android:gravity="center"
        android:layout_centerHorizontal="true"
        android:layout_marginTop="30dp"
        android:textColor="@color/sa_yellow"/>
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="How long is your one second"
        android:layout_below="@id/tv_tag"
        android:layout_centerInParent="true"
        android:layout_marginTop="20dp"
        android:textSize="20sp"
        android:textColor="#FFFFFF"/>
 
    <LinearLayout
        android:id="@+id/ll_btn"
        android:layout_width="match_parent"
        android:layout_height="60dp"
        android:background="#CCCCCC"
        android:layout_centerInParent="true"
        android:layout_margin="10dp"
        android:gravity="center"
        android:clickable="true"
        android:orientation="vertical">
 
        <TextView
            android:id="@+id/ll_btn_time"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="按住开始"
            android:textSize="18sp"/>
        <TextView
            android:id="@+id/ll_btn_tag"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="碉堡了,少侠你是大神"
            android:visibility="visible"
            android:textColor="#FFFFFF"
            android:textSize="15sp"/>
 
    </LinearLayout>
 
    <TextView
        android:id="@+id/tv_normal"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="凡人:0"
        android:textSize="18sp"
        android:layout_centerHorizontal="true"
        android:layout_below="@id/ll_btn"
        android:textColor="@color/sa_yellow"
        android:layout_marginTop="20dp"/>
 
    <TextView
        android:id="@+id/tv_god"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@id/tv_normal"
        android:layout_centerHorizontal="true"
        android:layout_margin="10dp"
        android:textSize="18sp"
        android:text="大神:0"
        android:textColor="@color/sa_yellow"/>
</RelativeLayout>

Activity

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
package com.yusian.onesecond;
 
import android.graphics.Color;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.MotionEvent;
import android.view.View;
import android.widget.LinearLayout;
import android.widget.TextView;
import java.text.DecimalFormat;
 
import static java.lang.Math.abs;
 
public class MainActivity extends AppCompatActivity {
    private LinearLayout ll_btn;
    long touchDownTime, touchUpTime;
    int godCount, normalCount;
    TextView tv_god, tv_normal, ll_btn_time, ll_btn_tag;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        findView();
    }
 
    /*初始化基础控件及引用*/
    private void findView() {
        tv_god = (TextView)findViewById(R.id.tv_god);
        tv_normal = (TextView)findViewById(R.id.tv_normal);
 
        ll_btn_time = (TextView)findViewById(R.id.ll_btn_time);
        ll_btn_tag = (TextView)findViewById(R.id.ll_btn_tag);
        ll_btn = (LinearLayout) findViewById(R.id.ll_btn);
 
        ll_btn.setOnTouchListener(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View v, MotionEvent event) {
                System.out.println(String.valueOf(event.getAction()));
                int even = event.getAction();
                // 按下去的时候
                if (even == MotionEvent.ACTION_DOWN){
                    touchDownTime = System.currentTimeMillis();
                    v.setBackgroundColor(Color.YELLOW);
 
                    ll_btn_time.setText("正在按下");
                    ll_btn_time.setTextColor(Color.BLACK);
                    ll_btn_tag.setVisibility(View.GONE);
                }
                // 抬起来的时候
                if (even == MotionEvent.ACTION_UP){
                    touchUpTime = System.currentTimeMillis();
                    calculate();
                }
                return false;
            }
        });
    }
 
    /*判断时间计算*/
    private void calculate(){
        long pressTime = touchUpTime - touchDownTime;
        if (pressTime == 0) return;
 
        DecimalFormat decimal = new DecimalFormat("0.000");
        ll_btn_time.setText(decimal.format(pressTime * 0.001) + "秒");
 
        if (abs(pressTime - 1000) > 100){
            normalCount ++;
            ll_btn.setBackgroundColor(Color.rgb(204, 204, 204));
 
            ll_btn_time.setTextColor(Color.BLACK);
            ll_btn_tag.setVisibility(View.GONE);
            tv_normal.setText("凡人:" + normalCount);
        }else{
            godCount ++;
            ll_btn.setBackgroundColor(Color.rgb(200, 0, 0));
 
            ll_btn_time.setTextColor(Color.WHITE);
            ll_btn_tag.setVisibility(View.VISIBLE);
            tv_god.setText("大神:" + godCount);
        }
    }
}

Leave a Reply