Android實現搖一搖功能
搖一搖功能主要用到加速度傳感器:Sensor.TYPE_ACCELEROMETER
搖一搖功能主要是監聽手機加速度變化,當超過設定的某一值時,即觸發事件。/**
* 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;
}
}
}