Android搖一搖、螢幕方向的監聽
踩坑記錄
這個工具類裡有兩個獨立的監聽
1.先貼程式碼
1.使用示例
1.例項化
UGravity gravity = new UGravity(this);
//監聽手機方向
gravity.setOrientationListener(orientation -> {
//do sth
});
//監聽手機搖晃
gravity.setOnShakeListener(() -> {
//do sth
});
2.用完清理
@Override
protected void onDestroy() {
gravity.clear();
super.onDestroy();
}
2.工具類原始碼
原理是使用Android的重力感測器返回值來判斷
/**
* @Description: 重力監聽
* @Author: Kosmos
* @Date: 2019.01.28 11:56
* @Email: KosmoSakura@gmail.com
* 1.搖晃手機
* 2.螢幕旋轉
*/
public class UGravity implements SensorEventListener {
private static final int SPEED_SHRESHOLD = 2000;// 速度閾值
private static final int UPTATE_INTERVAL_TIME = 200;// 檢測的時間間隔
private SensorManager sorMgr;// 感測器管理器
private OnShakeListener onShakeListener;//搖晃監聽器
private OrientationListener orientationListener;////旋轉監聽器
private long lastUpdateTime;//上次檢測時間
// 手機上一個位置時重力感應座標
private float lastX;
private float lastY;
private float lastZ;
// 構造器
public UGravity(Context context) {
sorMgr = (SensorManager) context.getSystemService(Context.SENSOR_SERVICE);
// 註冊
if (sorMgr != null) {
sorMgr.registerListener(this,
sorMgr.getDefaultSensor(Sensor.TYPE_ACCELEROMETER), SensorManager.SENSOR_DELAY_GAME);
}
}
// 搖晃監聽介面
public interface OnShakeListener {
void onShake();
}
// 旋轉監聽介面
public interface OrientationListener {
void orientation(int orientation);
}
// 設定搖晃監聽
public void setOnShakeListener(OnShakeListener listener) {
onShakeListener = listener;
}
// 設定旋轉監聽
public void setOrientationListener(OrientationListener orientationListener) {
this.orientationListener = orientationListener;
}
@Override
public void onAccuracyChanged(Sensor sensor, int accuracy) {
}
/*
* 重力感應器感應獲得變化資料
*/
@Override
public void onSensorChanged(SensorEvent event) {
//返回的不是重力感測訊號
if (Sensor.TYPE_ACCELEROMETER != event.sensor.getType()) {
return;
}
// 檢測時間必須大於間隔時間
long currentUpdateTime = System.currentTimeMillis();
long timeInterval = currentUpdateTime - lastUpdateTime;//時間間隔
if (timeInterval < UPTATE_INTERVAL_TIME) {
return;
}
// 儲存
lastUpdateTime = currentUpdateTime;
// 獲得x,y,z座標
float x = event.values[0];
float y = event.values[1];
float z = event.values[2];
//搖晃監聽
if (onShakeListener != null) {
// 獲得x,y,z的變化值
float deltaX = x - lastX;
float deltaY = y - lastY;
float deltaZ = z - lastZ;
// 將現在的座標變成last座標
lastX = x;
lastY = y;
lastZ = z;
double speed = Math.sqrt(deltaX * deltaX + deltaY * deltaY + deltaZ * deltaZ) / timeInterval * 10000;
// 達到閥值
if (speed >= SPEED_SHRESHOLD) {
onShakeListener.onShake();
}
}
//旋轉監聽
if (orientationListener != null) {
//理論上臨界值應為4.5,但是實際效果有所偏差,值為6時效果最佳
if (x < 6 && x > -6 && y > 6) {
//豎屏:x∈(-4.5,4.5),y∈(4.5,+∞)
orientationListener.orientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
} else if (x < 6 && x > -6 && y < -6) {
//豎屏反轉:x∈(-4.5,4.5),y∈(-∞,-4.5)
orientationListener.orientation(ActivityInfo.SCREEN_ORIENTATION_REVERSE_PORTRAIT);
} else if (y > -6 && y < 6 && x > 6) {
//橫屏:x∈(4.5,+∞),y∈(-4.5,4.5)
orientationListener.orientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
} else {
//橫屏反轉:x∈(-∞,-4.5),y∈(-4.5,4.5)
orientationListener.orientation(ActivityInfo.SCREEN_ORIENTATION_REVERSE_LANDSCAPE);
}
}
}
/**
* 資源清理,登出監聽
*/
public void clear() {
if (sorMgr != null) {
sorMgr.unregisterListener(this);
sorMgr = null;
}
if (onShakeListener != null) {
onShakeListener = null;
}
if (orientationListener != null) {
orientationListener = null;
}
}
}
相關文章
- 不會吧,這也行?iOS後臺鎖屏監聽搖一搖iOS
- 如何用純 CSS 創作一個搖搖晃晃的 loaderCSS
- swift實現仿知乎搖一搖彈出框Swift
- iOS通過加速計計算搖一搖次數iOS
- Android joystick,安卓模擬搖桿Android安卓
- Flutter 實現微信搖一搖的功能 Flutter 加速度感應Flutter
- 和 transformjs 一起搖擺ORMJS
- HTML5 語音聊天 IM|仿微信語音介面|搖一搖效果HTML
- html5版聊天室|仿微信語音|搖一搖|地圖定位HTML地圖
- webpack 搖樹處理Web
- 價格離譜的配件,與蘋果搖搖欲墜的奢侈品人設蘋果
- mui 控制旋轉螢幕方向UI
- Android-Kotlin VS Flutter-Dart - 自定義控制搖桿AndroidKotlinFlutterDart
- Python監測監聽螢幕介面內容變化併傳送通知Python
- 用HTML5實現手機搖一搖功能你有做過嗎?你知道它的原理嗎?HTML
- 天體搖擺儀的工作原理
- Apple裝置螢幕尺寸和方向APP
- Flutter之支援不同的螢幕尺寸和方向Flutter
- android 螢幕適配Android
- android 喚醒螢幕Android
- Unity——EasyTouch搖桿外掛使用Unity
- Android螢幕適配方案Android
- Android 禁止螢幕旋轉Android
- android螢幕適配方法Android
- Android 螢幕自適應Android
- 【canvas】搖桿操控飛船的動畫原理Canvas動畫
- 風雨飄搖中的高鑫零售
- 趣玩Python——利用python搖身一變社會人Python
- R星:我的成功,源自我的搖滾核心
- Android截圖監聽Android
- 《寶可夢 劍/盾》:一次天平的搖擺,一場夢的破碎
- Android 突破螢幕重新整理的桎梏Android
- Android 主流螢幕以及適配Android
- Android螢幕適配方案分析Android
- Angular 應用裡的搖樹優化 - tree shakingAngular優化
- 堅持“動態清零”不動搖
- WannaMine再升級! 搖身一變成為軍火商
- 2018.03.31、Android-ObjectBox-監聽AndroidObject