Android实现摇一摇功能

来源:互联网 发布:php断点续传 上传 编辑:程序博客网 时间:2024/06/05 18:51

做过一个小项目,其中实现了摇一摇功能和刮一刮功能还有播放背景音乐等

摇一摇功能主要用到加速度传感器Sensor.TYPE_ACCELEROMETER

摇一摇功能主要是监听手机加速度变化,当超过设定的某一值时,即触发事件。


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
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
/**
 * FileName: MainActivity.java
 * @desc 该类是用于显示摇一摇界面
 * @author HTP
 * @Date    20140311
 * @version 1.00
 */
publicclass MainActivity extendsActivity implementsOnClickListener {
    privateTabHost tabHost;
    privateMusicNameDao dao;
    // private ImageButton bt_setMusic;
    // 声音
    privateMediaPlayer mediaPlayer;
    // 显示摇一摇出现的内容
    privateTextView tv;
    // 要显示在tv中的内容
    privateString msentence;
    // 通过类Sentence可得到摇一摇显示的内容
    privateSentence sentence;
    // 显示标签“刮一刮”
    privateTextView tv_rubbler;
    // 重力感应管理器
    privateSensorManager sensorManager;
    // 震动控件
    privateVibrator vibrator;
    // 标签
    privatestatic final String TAG = "MainActivity";
    privatestatic final int SENSOR_SHAKE = 10;
 
    // private Intent musicIntent = new Intent("com.angel.Android.MUSIC");
    /** Called when the activity is first created. */
    @Override
    publicvoid onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        dao = newMusicNameDao(this);
        Uri musicUri = Uri.parse("android.resource://com.example.romance/raw/"
                + dao.getName());
 
        mediaPlayer = MediaPlayer.create(this, musicUri);
        //Toast.makeText(MainActivity.this, musicUri.toString(), 1).show();
        mediaPlayer.start();// 播放音乐
        mediaPlayer.setLooping(true);// 设置循环
        dao = newMusicNameDao(this);
        // startService(musicIntent);
        tv_rubbler = (TextView) findViewById(R.id.tv_rubber);
        tv_rubbler.setOnClickListener(this);
        // bt_setMusic.setOnClickListener(this);
 
        sentence = newSentence();
        // Uri musicUri = Uri.parse("/sdcard/ttpod/song/虹之间.mp3");
        // 获取res/raw/下的音乐路径
         
        tv = (TextView) findViewById(R.id.tv_text);// 关联要显示的TextView空间
        sensorManager = (SensorManager) getSystemService(SENSOR_SERVICE);
        vibrator = (Vibrator) getSystemService(VIBRATOR_SERVICE);
    }
 
    @Override
    protectedvoid onResume() {
        super.onResume();
        if(sensorManager != null) {// 注册监听器
            sensorManager.registerListener(sensorEventListener,
                    sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER),
                    SensorManager.SENSOR_DELAY_NORMAL);
            // 第一个参数是Listener,第二个参数是所得传感器类型,第三个参数值获取传感器信息的频率
        }
    }
 
    @Override
    protectedvoid onPause() {
        super.onPause();
        if(sensorManager != null) {// 取消监听器
            sensorManager.unregisterListener(sensorEventListener);
        }
    }
 
    /**
     * 重力感应监听
     */
    privateSensorEventListener sensorEventListener = newSensorEventListener() {
        @Override
        publicvoid onSensorChanged(SensorEvent event) {
            // 传感器信息改变时执行该方法
            float[] values = event.values;
            floatx = values[0];// x轴方向的重力加速度,向右为正
            floaty = values[1];// y轴方向的重力加速度,向前为正
            floatz = values[2];// z轴方向的重力加速度,向上为正
            Log.i(TAG,"x轴方向的重力加速度"+ x + ";y轴方向的重力加速度"+ y + ";z轴方向的重力加速度"+ z);
            // 一般在这三个方向的重力加速度达到40就达到了摇晃手机的状态。
            intmedumValue = 18;
            if(Math.abs(x) > medumValue && Math.abs(y) > medumValue
                    || Math.abs(y) > medumValue && Math.abs(z) > medumValue
                    || Math.abs(x) > medumValue && Math.abs(z) > medumValue
                    ) {
                vibrator.vibrate(200);
                Message msg = newMessage();
                msg.what = SENSOR_SHAKE;
                handler.sendMessage(msg);
            }
        }
 
        @Override
        publicvoid onAccuracyChanged(Sensor sensor, intaccuracy) {
        }
    };
    /**
     * 动作执行
     */
    Handler handler = newHandler() {
        @Override
        publicvoid handleMessage(Message msg) {
            super.handleMessage(msg);
            switch(msg.what) {
            caseSENSOR_SHAKE:
                msentence = sentence.getSentence();// 得到随机的句子
                // Toast.makeText(MainActivity.this, msentence, 1).show();
                tv.setText(msentence);// 将得到的句子显示在textview上
                // Log.i(TAG, "检测到摇晃,执行操作!");
                break;
            }
        }
    };
 
    @Override
    protectedvoid onDestroy() {
        // TODO Auto-generated method stub
        super.onDestroy();
        mediaPlayer.stop();// 退出时停止音乐
 
    }
 
    /**
     * 键盘事件,当按下back键的时候询问是否再按一次退出程序
     */
    // 退出时间
    privatelong exitTime = 0;
 
    @Override
    publicboolean onKeyDown(intkeyCode, KeyEvent event) {
        if(keyCode == KeyEvent.KEYCODE_BACK
                && event.getAction() == KeyEvent.ACTION_DOWN) {
            if((System.currentTimeMillis() - exitTime) > 2000) {
                Toast.makeText(getApplicationContext(),"再按一次退出程序",
                        Toast.LENGTH_SHORT).show();
                exitTime = System.currentTimeMillis();
            }else{
                finish();
                System.exit(0);
 
            }
            returntrue;
        }
        returnsuper.onKeyDown(keyCode, event);
    }
 
    /**
     * 按钮事件监听
     */
    @Override
    publicvoid onClick(View v) {
        // TODO Auto-generated method stub
        switch(v.getId()) {
        // 当按下按钮,将切换到刮一刮页面
        caseR.id.tv_rubber: {
            Toast.makeText(MainActivity.this,"刮一刮",1).show();
            Intent rubblerIntent = newIntent(MainActivity.this,
                    RubblerAct.class);
            startActivity(rubblerIntent);
            break;
        }
        default:
            break;
        }
    }
 
}

http://www.2cto.com/kf/201408/328408.html








?
0 0