Android实现摇一摇功能

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

摇一摇功能主要用到加速度传感器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
  */
public class MainActivity extends Activity implements OnClickListener {
     private TabHost tabHost;
     private MusicNameDao dao;
     // private ImageButton bt_setMusic;
     // 声音
     private MediaPlayer mediaPlayer;
     // 显示摇一摇出现的内容
     private TextView tv;
     // 要显示在tv中的内容
     private String msentence;
     // 通过类Sentence可得到摇一摇显示的内容
     private Sentence sentence;
     // 显示标签“刮一刮”
     private TextView tv_rubbler;
     // 重力感应管理器
     private SensorManager sensorManager;
     // 震动控件
     private Vibrator vibrator;
     // 标签
     private static final String TAG = "MainActivity" ;
     private static final int SENSOR_SHAKE = 10 ;
 
     // private Intent musicIntent = new Intent("com.angel.Android.MUSIC");
     /** Called when the activity is first created. */
     @Override
     public void onCreate(Bundle savedInstanceState) {
         super .onCreate(savedInstanceState);
         setContentView(R.layout.activity_main);
         dao = new MusicNameDao( 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 = new MusicNameDao( this );
         // startService(musicIntent);
         tv_rubbler = (TextView) findViewById(R.id.tv_rubber);
         tv_rubbler.setOnClickListener( this );
         // bt_setMusic.setOnClickListener(this);
 
         sentence = new Sentence();
         // 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
     protected void onResume() {
         super .onResume();
         if (sensorManager != null ) { // 注册监听器
             sensorManager.registerListener(sensorEventListener,
                     sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER),
                     SensorManager.SENSOR_DELAY_NORMAL);
             // 第一个参数是Listener,第二个参数是所得传感器类型,第三个参数值获取传感器信息的频率
         }
     }
 
     @Override
     protected void onPause() {
         super .onPause();
         if (sensorManager != null ) { // 取消监听器
             sensorManager.unregisterListener(sensorEventListener);
         }
     }
 
     /**
      * 重力感应监听
      */
     private SensorEventListener sensorEventListener = new SensorEventListener() {
         @Override
         public void onSensorChanged(SensorEvent event) {
             // 传感器信息改变时执行该方法
             float [] values = event.values;
             float x = values[ 0 ]; // x轴方向的重力加速度,向右为正
             float y = values[ 1 ]; // y轴方向的重力加速度,向前为正
             float z = values[ 2 ]; // z轴方向的重力加速度,向上为正
             Log.i(TAG, "x轴方向的重力加速度" + x + ";y轴方向的重力加速度" + y + ";z轴方向的重力加速度" + z);
             // 一般在这三个方向的重力加速度达到40就达到了摇晃手机的状态。
             int medumValue = 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 = new Message();
                 msg.what = SENSOR_SHAKE;
                 handler.sendMessage(msg);
             }
         }
 
         @Override
         public void onAccuracyChanged(Sensor sensor, int accuracy) {
         }
     };
     /**
      * 动作执行
      */
     Handler handler = new Handler() {
         @Override
         public void handleMessage(Message msg) {
             super .handleMessage(msg);
             switch (msg.what) {
             case SENSOR_SHAKE:
                 msentence = sentence.getSentence(); // 得到随机的句子
                 // Toast.makeText(MainActivity.this, msentence, 1).show();
                 tv.setText(msentence); // 将得到的句子显示在textview上
                 // Log.i(TAG, "检测到摇晃,执行操作!");
                 break ;
             }
         }
     };
 
     @Override
     protected void onDestroy() {
         // TODO Auto-generated method stub
         super .onDestroy();
         mediaPlayer.stop(); // 退出时停止音乐
 
     }
 
     /**
      * 键盘事件,当按下back键的时候询问是否再按一次退出程序
      */
     // 退出时间
     private long exitTime = 0 ;
 
     @Override
     public boolean onKeyDown( int keyCode, 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 );
 
             }
             return true ;
         }
         return super .onKeyDown(keyCode, event);
     }
 
     /**
      * 按钮事件监听
      */
     @Override
     public void onClick(View v) {
         // TODO Auto-generated method stub
         switch (v.getId()) {
         // 当按下按钮,将切换到刮一刮页面
         case R.id.tv_rubber: {
             Toast.makeText(MainActivity. this , "刮一刮" , 1 ).show();
             Intent rubblerIntent = new Intent(MainActivity. this ,
                     RubblerAct. class );
             startActivity(rubblerIntent);
             break ;
         }
         default :
             break ;
         }
     }
 
}

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值