關門變數
今天要寫一個檢測手機震動的android程式,剛開始竟然不知到怎麼寫,後來來來回回跳了一天,最後還是用了一個很簡單的方法便解決了。咳坑爹的是最後發現是自己感測器的問題他孃的啊。
寫感測器的程式無非就是過載onSensorChanged這個方法。這個方法應該是被一個執行緒(當然不是主執行緒)一直在監聽,如果有數值改變的事件發生,那麼便響應這個方法。那麼手機晃動的程式該怎麼寫呢?很簡單啊,粗糙的方法只需要判斷這個xyz各個方向上的加速值是不是達到了某一哥邊界就可以了。我取得邊界擲是15,如果能達到便是震動的。
但關鍵是這個方法是在不斷監聽的,我們的目地是檢測到手機晃動然後執行一個動畫。但是現在加速度只要有一點變化,那麼就會重新執行那個動畫,這當然不服和我們的意願,因為我們希望的是在執行動畫的過程中不再去觸發那個事件。那麼怎麼做呢?其實這個思想我們見過的,還記得作業系統中的訊號量機制嗎?對就是互斥思想,我們只需要設定一個guard,一旦進去之後就必須得把門關住了,這就好比上廁所,上的時候關上門,等你拉完屎後,再把門開啟,讓別人上廁所。就是這麼簡單,但是我之所以跳了一天是因為我的感測器懷了好像~!!!!!!
下面摘一段程式,是微信的搖一搖便知道幾個好友線上的程式,也是基於這種思想的:
package boke.sensor.yao;
import com.se.yao.R;
import android.app.Activity;
import android.app.AlertDialog;
import android.app.Dialog;
import android.app.AlertDialog.Builder;
import android.content.Context;
import android.content.DialogInterface;
import android.content.DialogInterface.OnClickListener;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
import android.os.Bundle;
import android.util.Log;
import android.widget.TextView;
import android.widget.Toast;
public class SeActivity extends Activity {
SensorManager sm;
SensorL listener;
private boolean isRefresh=false;
Dialog d;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
sm = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
listener = new SensorL();
// 對加速計進行監聽
sm.registerListener(listener, sm.getDefaultSensor(Sensor.TYPE_ACCELEROMETER),
SensorManager.SENSOR_DELAY_FASTEST);
// sm.registerListener(listener,
// sm.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD),SensorManager.SENSOR_DELAY_FASTEST);
// sm.registerListener(listener,sm.getDefaultSensor(Sensor.TYPE_PRESSURE),SensorManager.SENSOR_DELAY_FASTEST);
AlertDialog.Builder b = new Builder(this);
// 用來顯示的對話方塊
d = b.setPositiveButton("ok", new OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
// TODO Auto-generated method stub
isRefresh = false;
dialog.cancel();
}
}).setMessage("搖到了.................").create();
}
private class SensorL implements SensorEventListener {
@Override
public void onAccuracyChanged(Sensor sensor, int accuracy) {
// TODO Auto-generated method stub
}
@Override
public void onSensorChanged(SensorEvent event) {
// TODO Auto-generated method stub
if (event.sensor.getType() == Sensor.TYPE_ACCELEROMETER) {
// 判斷是否在重新整理
if (isRefresh)
return;
float newX = Math.abs(event.values[SensorManager.DATA_X]);
float newY = Math.abs(event.values[SensorManager.DATA_Y]);
float newZ = Math.abs(event.values[SensorManager.DATA_Z]);
// 這裡是關鍵,判斷某個方向上的加速度值是否達到自己想要的值
// X
if (newX >= 18) {
Toast.makeText(SeActivity.this, "newX" + newX, 0).show();
isRefresh = true;
d.show();
return;
}
// Y
if (newY >= 20) {
Toast.makeText(SeActivity.this, "newY" + newY, 0).show();
isRefresh = true;
d.show();
return;
}
// Z
if (newZ >= 20) {
Toast.makeText(SeActivity.this, "newZ" + newZ, 0).show();
isRefresh = true;
d.show();
return;
}
}
if (event.sensor.getType() == Sensor.TYPE_MAGNETIC_FIELD) {
// Log.e("TYPE_MAGNETIC_FIELD", ""+event.sensor.toString());
}
if (event.sensor.getType() == Sensor.TYPE_PRESSURE) {
// Log.e("TYPE_PRESSURE", ""+event.sensor.toString());
}
}
}
@Override
protected void onPause() {
// ACTIVITY消失時取消監聽
sm.unregisterListener(listener);
super.onPause();
}
}
相關文章
- C++入門教程(20):變數、不變數和常量C++變數
- Shell 入門系列 (一): 變數變數
- TensorFlow入門 - 變數(Variables)變數
- Go 快速入門指南 - 變數Go變數
- Shell入門——shell特性、變數變數
- 關於JavaScript變數提升JavaScript變數
- 關於js變數提升JS變數
- 關於條件變數變數
- 關於繫結變數變數
- Go 語言入門教程:變數Go變數
- 關於argument變數的理解變數
- Java自學入門之靜態變數Java變數
- Go 入門 – 包,函式和變數Go函式變數
- TypeScript基礎入門-變數宣告(一)TypeScript變數
- Go 快速入門指南 - 變長引數Go
- Python入門到實踐-變數Python變數
- 關於繫結變數的使用變數
- 關於例項變數和靜態變數的一點疑問變數
- 關鍵字引數與非關鍵字引數(可變引數)詳解
- C++入門教程之二:變數C++變數
- 機器學習入門:多變數線性迴歸機器學習變數
- 《MySQL 入門教程》第 17 篇 MySQL 變數MySql變數
- 【廖雪峰python入門筆記】變數Python筆記變數
- 4.2.10.1 Oracle Restart 相關變數配置OracleREST變數
- 關於一些變數的使用變數
- 關於DSS中的繫結變數變數
- 關於web應用的static變數Web變數
- 關於批處理中的變數變數
- ECMAScript 6入門 - 變數的解構賦值變數賦值
- [MySQL光速入門]016 圖解變數MySql圖解變數
- Java入門系列-04-java中的變數Java變數
- MySQL入門--設定session,global變數的方法MySqlSession變數
- java:識別符號 關鍵字 變數Java符號變數
- 關於ThreadLocal變數的一個坑thread變數
- 關於pl/sql中的繫結變數SQL變數
- 關於TNS_ADMIN環境變數變數
- var_dump-列印變數的相關資訊變數
- #環境變數 相關的環境變數請複製過來,可能會和變數