环球电气之家-午夜精彩视频-中国专业电气电子产品行业服务网站!

產品分類

當前位置: 首頁 > 傳感測量產品 > 工業傳感器 > 力傳感器

類型分類:
科普知識
數據分類:
力傳感器

安卓傳感器 重力:Android – 小功能 – 傳感器之重力傳感器

發布日期:2022-10-09 點擊率:29


安卓傳感器 重力:Android - 小功能 - 傳感器之重力傳感器  第1張

安卓傳感器 重力:Android - 小功能 - 傳感器之重力傳感器

陀螺儀傳感器叫做Gyro-sensor,陀螺儀測量圍繞設備的x,y和z軸的rad / s旋轉速率,返回x、y、z三軸的角速度數據。
角速度的單位是radians/second。
傳感器的坐標系與用于加速度傳感器的坐標系相同。逆時針旋轉為正。也就是說,如果觀察者從x,y或z軸上某個正位置看向位于原點上的設備,則該觀察者將報告正旋轉,如果該設備看起來是逆時針旋轉的話。這是正向旋轉的標準數學定義,與方向傳感器使用的側傾定義不同。
通常,陀螺儀的輸出會隨時間積分,以計算描述角度隨時間步長變化的旋轉。標準陀螺.安卓傳感器 重力:Android - 小功能 - 傳感器之重力傳感器  第2張

安卓傳感器 重力:Android開發中的重力傳感器用法實例詳解

public class ScreenSwitchUtils {
private static final String TAG=ScreenSwitchUtils.class.getSimpleName();
private volatile static ScreenSwitchUtils mInstance;
private Activity mActivity;
// 是否是豎屏
private boolean isPortrait=true;
private SensorManager sm;
private OrientationSensorListener listener;
private Sensor sensor;
private SensorManager sm1;
private Sensor sensor1;
private OrientationSensorListener1 listener1;
private Handler mHandler=new Handler() {
 public void handleMessage(Message msg) {
  switch (msg.what) {
  case 888:
int orientation=msg.arg1;
if (orientation > 45 && orientation < 135) {    } else if (orientation > 135 && orientation < 225) {    } else if (orientation > 225 && orientation < 315) {     if (isPortrait) {      Log.e(test, 切換成橫屏);      mActivity.setRequestedOrientation(0);      isPortrait=false;     }    } else if ((orientation > 315 && orientation < 360) || (orientation > 0 && orientation < 45)) {     if (!isPortrait) {      Log.e(test,切換成豎屏);      mActivity.setRequestedOrientation(1);      isPortrait=true;     }    }    break;   default:    break;   }  }; }; public static ScreenSwitchUtils init(Context context) {  if (mInstance==null) {   synchronized (ScreenSwitchUtils.class) {    if (mInstance==null) {     mInstance=new ScreenSwitchUtils(context);    }   }  }  return mInstance; } private ScreenSwitchUtils(Context context) {  Log.d(TAG, init orientation listener.);  // 注冊重力感應器,監聽屏幕旋轉  sm=(SensorManager) context.getSystemService(Context.SENSOR_SERVICE);  sensor=sm.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);  listener=new OrientationSensorListener(mHandler);  // 根據 旋轉之后/點擊全屏之后 兩者方向一致,激活sm.  sm1=(SensorManager) context.getSystemService(Context.SENSOR_SERVICE);  sensor1=sm1.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);  listener1=new OrientationSensorListener1(); } public void start(Activity activity) {  Log.d(TAG, start orientation listener.);  mActivity=activity;  sm.registerListener(listener, sensor, SensorManager.SENSOR_DELAY_UI); } public void stop() {  Log.d(TAG, stop orientation listener.);  sm.unregisterListener(listener);  sm1.unregisterListener(listener1); } public void toggleScreen() {  sm.unregisterListener(listener);  sm1.registerListener(listener1, sensor1,SensorManager.SENSOR_DELAY_UI);  if (isPortrait) {   isPortrait=false;   // 切換成橫屏   mActivity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);  } else {   isPortrait=true;   // 切換成豎屏   mActivity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);  } } public boolean isPortrait(){  return this.isPortrait; } public class OrientationSensorListener implements SensorEventListener {  private static final int _DATA_X=0;  private static final int _DATA_Y=1;  private static final int _DATA_Z=2;  public static final int ORIENTATION_UNKNOWN=-1;  private Handler rotateHandler;  public OrientationSensorListener(Handler handler) {   rotateHandler=handler;  }  public void onAccuracyChanged(Sensor arg0, int arg1) {  }  public void onSensorChanged(SensorEvent event) {   float[] values=event.values;   int orientation=ORIENTATION_UNKNOWN;   float X=-values[_DATA_X];   float Y=-values[_DATA_Y];   float Z=-values[_DATA_Z];   float magnitude=X * X + Y * Y;   // Don't trust the angle if the magnitude is small compared to the y   // value   if (magnitude * 4 >=Z * Z) {
// 屏幕旋轉時
float oneEightyOverPi=57.f;
float angle=(float) Math.atan2(-Y, X) * OneEightyOverPi;
orientation=90 - (int) Math.round(angle);
// normalize to 0 - 359 range
while (orientation >=360) {
orientation -=360;
}
while (orientation < 0) {     orientation +=360;    }   }   if (rotateHandler !=null) {    rotateHandler.obtainMessage(888, orientation, 0).sendToTarget();   }  } } public class OrientationSensorListener1 implements SensorEventListener {  private static final int _DATA_X=0;  private static final int _DATA_Y=1;  private static final int _DATA_Z=2;  public static final int ORIENTATION_UNKNOWN=-1;  public OrientationSensorListener1() {  }  public void onAccuracyChanged(Sensor arg0, int arg1) {  }  public void onSensorChanged(SensorEvent event) {   float[] values=event.values;   int orientation=ORIENTATION_UNKNOWN;   float X=-values[_DATA_X];   float Y=-values[_DATA_Y];   float Z=-values[_DATA_Z];   float magnitude=X * X + Y * Y;   // Don't trust the angle if the magnitude is small compared to the y   // value   if (magnitude * 4 >=Z * Z) {
// 屏幕旋轉時
float oneEightyOverPi=57.f;
float angle=(float) Math.atan2(-Y, X) * OneEightyOverPi;
orientation=90 - (int) Math.round(angle);
// normalize to 0 - 359 range
while (orientation >=360) {
orientation -=360;
}
while (orientation < 0) {     orientation +=360;    }   }   if (orientation > 225 && orientation < 315) {// 檢測到當前實際是橫屏    if (!isPortrait) {     sm.registerListener(listener, sensor,SensorManager.SENSOR_DELAY_UI);     sm1.unregisterListener(listener1);    }   } else if ((orientation > 315 && orientation < 360) || (orientation > 0 && orientation < 45)) {// 檢測到當前實際是豎屏    if (isPortrait) {     sm.registerListener(listener, sensor,SensorManager.SENSOR_DELAY_UI);     sm1.unregisterListener(listener1);    }   }  } } }

安卓傳感器 重力:Android開發之重力傳感器

重力傳感器與方向傳感器的開發步驟類似,只要理清了期中的x,y,z的值之后就可以根據他們的變化來進行編程了,首先來看一副圖

假設當地的重力加速度值為g
當手機正面朝上的時候,z的值為q,反面朝上的時候,z的值為-g
當手機右側面朝上的時候,x的值為g,右側面朝上的時候,x的值為-g
當手機上側面朝上的時候,y的值為g,右側面朝上的時候,y的值為-g
了解了重力傳感器中X,Y,Z的含義之后下面我們就開始學習如何使用
首先我們創建一個傳感器管理器和一個傳感器監聽器,管理器用來管理傳感器以及創建各種各樣的傳感器,監聽器用來監視傳感器的變化并且進行相應的操作
private SensorManager sensorManager;
private MySensorEventListener mySensorEventListener;
mySensorEventListener=new MySensorEventListener();//這個監聽器當然是我們自己定義的,在重力感     應器感應到手機位置有變化的時候,我們可以采取相應的操作,這里緊緊是將x,y,z的值打印出來
private final class MySensorEventListener implements  SensorEventListener{

@Override
//可以得到傳感器實時測量出來的變化值
public void onSensorChanged(SensorEvent event) {
//重力傳感器
if(event.sensor.getType()==Sensor.TYPE_ACCELEROMETER){
float x=event.values[SensorManager.DATA_X];
float y=event.values[SensorManager.DATA_Y];
float z=event.values[SensorManager.DATA_Z];
//tv_accelerometer是界面上的一個TextView標簽,不再贅述
tv_orientation.setText("Orientation:"+x+","+y+","+z);
}
}

我們在onResume方法中創建重力傳感器,并向系統注冊監聽器
protected void onResume() {
Sensor sensor_accelerometer=sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
sensorManager.registerListener(mySensorEventListener,sensor_accelerometer,   SensorManager.SENSOR_DELAY_UI);

super.onResume();
}
最后我們在onPause()中注銷所有傳感器的監聽,釋放重力感應器資源!
protected void onPause() {
/注銷所有傳感器的監聽
sensorManager.unregisterListener(mySensorEventListener);
super.onPause();
}
到此,有關重力傳感器的介紹完畢!
安卓傳感器 重力:Android - 小功能 - 傳感器之重力傳感器  第3張

安卓傳感器 重力:安卓傳感器-重力傳感器

? ? 1、SensorManager mSensorManager = (SensorManager)this.getSystemService(Context.SENSOR_SERVICE); ? //獲取傳感器管理對象
? ? 2、Sensor mSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER); ? //獲得傳感器類型,這里Sensor.TYPE_ACCELEROMETER是重力傳感器
? ? 3、mSensorManager.registerListener(this, mSensor, SensorManager.SENSOR_DELAY_GAME); ?//為傳感器注冊監聽器
? ? 4、繼承傳感器時間接口SensorEventListener,重寫方法,在方法中第重力傳感器獲得的數據進行操作
? ? ? ? ? ? ? ?//獲得各個方向上的重力分量

x = event.values[SensorManager.DATA_X];

y = event.values[SensorManager.DATA_Y];

z = event.values[SensorManager.DATA_Z];
? ? ? ? ? 至于SensorManager.DATA_Y為什么會過時就不得而知了,可能有了更好的方法?在這里歡迎交流

下一篇: PLC、DCS、FCS三大控

上一篇: 電氣控制線路圖控制原

主站蜘蛛池模板: 滁州高低温冲击试验箱厂家_安徽高低温试验箱价格|安徽希尔伯特 | 膜片万向弹性联轴器-冲压铸造模具「沧州昌运模具」 | 河南不锈钢水箱_地埋水箱_镀锌板水箱_消防水箱厂家-河南联固供水设备有限公司 | 自动部分收集器,进口无油隔膜真空泵,SPME固相微萃取头-上海楚定分析仪器有限公司 | 广东健伦体育发展有限公司-体育工程配套及销售运动器材的体育用品服务商 | 儿童乐园|游乐场|淘气堡招商加盟|室内儿童游乐园配套设备|生产厂家|开心哈乐儿童乐园 | 杭州可当科技有限公司—流量卡_随身WiFi_AI摄像头一站式解决方案 | 悬浮拼装地板_幼儿园_篮球场_悬浮拼接地板-山东悬浮拼装地板厂家 | 消防设施操作员考试报名时间,报名入口,报考条件 | 清管器,管道清管器,聚氨酯发泡球,清管球 - 承德嘉拓设备 | 杭州货架订做_组合货架公司_货位式货架_贯通式_重型仓储_工厂货架_货架销售厂家_杭州永诚货架有限公司 | 沈阳缠绕包装机厂家直销-沈阳海鹞托盘缠绕包装机价格 | 航拍_专业的无人机航拍摄影门户社区网站_航拍网 | 沈阳缠绕包装机厂家直销-沈阳海鹞托盘缠绕包装机价格 | 培训中心-翰香原香酥板栗饼加盟店总部-正宗板栗酥饼技术 | 楼承板设备-楼承板成型机-免浇筑楼承板机器厂家-捡来 | ◆大型吹塑加工|吹塑加工|吹塑代加工|吹塑加工厂|吹塑设备|滚塑加工|滚塑代加工-莱力奇塑业有限公司 | 鲁尔圆锥接头多功能测试仪-留置针测试仪-上海威夏环保科技有限公司 | 代写标书-专业代做标书-商业计划书代写「深圳卓越创兴公司」 | 老房子翻新装修,旧房墙面翻新,房屋防水补漏,厨房卫生间改造,室内装潢装修公司 - 一修房屋快修官网 | 自动气象站_农业气象站_超声波气象站_防爆气象站-山东万象环境科技有限公司 | 并网柜,汇流箱,电控设备,中高低压开关柜,电气电力成套设备,PLC控制设备订制厂家,江苏昌伟业新能源科技有限公司 | 全自动不干胶贴标机_套标机-上海今昂贴标机生产厂家 | 钢格板|镀锌钢格板|热镀锌钢格板|格栅板|钢格板|钢格栅板|热浸锌钢格板|平台钢格板|镀锌钢格栅板|热镀锌钢格栅板|平台钢格栅板|不锈钢钢格栅板 - 专业钢格板厂家 | 识禅_对禅的了解,从这里开始| 不锈钢电动球阀_气动高压闸阀_旋塞疏水调节阀_全立阀门-来自温州工业阀门巨头企业 | 高铝砖-高铝耐火球-高铝耐火砖生产厂家-价格【荣盛耐材】 | 湖南印刷厂|长沙印刷公司|画册印刷|挂历印刷|台历印刷|杂志印刷-乐成印刷 | 运动木地板价格,篮球馆体育运动木地板生产厂家_欧氏地板 | 点焊机-缝焊机-闪光对焊机-电阻焊设备生产厂家-上海骏腾发智能设备有限公司 | 化妆品加工厂-化妆品加工-化妆品代加工-面膜加工-广东欧泉生化科技有限公司 | 进口便携式天平,外校_十万分之一分析天平,奥豪斯工业台秤,V2000防水秤-重庆珂偌德科技有限公司(www.crdkj.com) | 民用音响-拉杆音响-家用音响-ktv专用音响-万昌科技 | 闭端端子|弹簧螺式接线头|防水接线头|插线式接线头|端子台|电源线扣+护线套|印刷电路板型端子台|金笔电子代理商-上海拓胜电气有限公司 | 恒温振荡混匀器-微孔板振荡器厂家-多管涡旋混匀器厂家-合肥艾本森(www.17world.net) | 【中联邦】增稠剂_增稠粉_水性增稠剂_涂料增稠剂_工业增稠剂生产厂家 | 宝鸡市人民医院 | 隧道风机_DWEX边墙风机_SDS射流风机-绍兴市上虞科瑞风机有限公司 | 金属管浮子流量计_金属转子流量计厂家-淮安润中仪表科技有限公司 | 编织人生 - 权威手工编织网站,编织爱好者学习毛衣编织的门户网站,织毛衣就上编织人生网-编织人生 | 车充外壳,车载充电器外壳,车载点烟器外壳,点烟器连接头,旅行充充电器外壳,手机充电器外壳,深圳市华科达塑胶五金有限公司 |