<rt id="m4md3"></rt>
  • <bdo id="m4md3"><meter id="m4md3"></meter></bdo>
  • <label id="m4md3"></label>
      <center id="m4md3"><optgroup id="m4md3"></optgroup></center>
      產品分類

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

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

      重力傳感器 android:android 重力傳感器gsensor,淺談Android重力感應

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


      重力傳感器 android:android 重力傳感器gsensor,淺談Android重力感應

      重力感應,也算是智能機和非智能機的區別之一了吧,Android設備中自然也能有這個功能。

      在Android中,使用重力感應功能需要使用SensorEventListener,其中有兩個方法,

      onSensorChanged和onAccuracyChanged,一般都是在onSensorChanged方法中做一些希望達到的效果處理(慚

      愧,才剛接觸這個重力感應,所以對這兩個方法也不是很了解)。重力感應是感應的一種方式,因此,我們還要用到感應檢測包Sensor。

      首先,我們要獲得一個SensorManager,SensorManager manager =

      (SensorManager)

      this.getSystemService(Context.SENSOR_SERVICE)。然后,再通過這個manager來獲得一個Sensor

      的列表,Listsensors =

      manager.getSensorList(Sensor.TYPE_ACCELEROMETER)。

      Sensor.TYPE_ACCELEROMETER就是指加速度感應檢測,當然還有一些其他的感應檢測,這邊就沒必要都說一下了。

      我在做重力感應的時候,用的是manager.registerListener(listener, sensor, rate),這邊的sensor就是sensors中的一個Sensor,rate是指延遲時間。

      如果要取消這個重力感應的話,就manager.unregisterListener(listener)來取消注冊就行了。

      public class SensorEventDemoActivity extends Activity implements SensorEventListener{

      private Listsensors;

      private Sensor sensor;

      @Override

      public void onCreate(Bundle savedInstanceState) {

      super.onCreate(savedInstanceState);

      setContentView(R.layout.main);

      }

      @Override

      protected void onResume() {

      super.onResume();

      SensorManager manager = (SensorManager) this.getSystemService(Context.SENSOR_SERVICE);

      sensors = manager.getSensorList(Sensor.TYPE_ACCELEROMETER);

      sensor = sensors.get(0);

      manager.registerListener(this, sensor, SensorManager.SENSOR_DELAY_GAME);

      }

      @Override

      public void onSensorChanged(SensorEvent event) {

      Log.d("Sensor Demo", "do sensor");

      }

      @Override

      public void onAccuracyChanged(Sensor sensor, int accuracy) {

      }

      }

      其實,代碼很簡單,主要就是要看在實際項目中如何運用了。
      重力傳感器 android:android 重力傳感器gsensor,淺談Android重力感應  第1張

      重力傳感器 android: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:android 重力傳感器gsensor,淺談Android重力感應  第2張

      重力傳感器 android: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:Android重力傳感器--隨重力旋轉的圖標

      相機拍攝都有橫屏拍攝和豎屏拍攝,橫豎屏切換,圖標也會跟著重力方向旋轉,于是也做了一個相機旋轉效果。
      代碼在這里面
      啥也不說了,先上效果圖,gif大小限制,只截取了一小段:
      演示
      在Android平臺中,傳感器框架通常是使用一個標準的三維坐標系去表示一個值的。以方向傳感器為例,確定一個方向當然也需要一個三維坐標,三個方向值就是一個長度為3的float數組。
      旋轉工具類:
      根據重力傳感器的監聽,獲取X、Y方向上分量計算數值角度。為了不實時旋轉,定義4個方向范圍,對應角度分別為0,90,180,270度,遍歷view作屬性動畫。
      MainActivity調用,傳遞所有要旋轉圖標,并調用相機。

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

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

      主站蜘蛛池模板: 九九综合VA免费看| 色综合天天综合网国产成人网| 噜噜综合亚洲AV中文无码| 一个色综合国产色综合| 亚洲国产精品成人综合色在线| 色噜噜久久综合伊人一本| 精品国产国产综合精品 | 亚洲狠狠久久综合一区77777| 天天做天天爱天天爽综合网| 狠狠色噜噜狠狠狠狠色综合久 | 国产亚洲综合视频| 婷婷成人丁香五月综合激情| 天天爱天天做色综合| 综合激情五月综合激情五月激情1 综合久久国产九一剧情麻豆 | 色噜噜狠狠狠综合曰曰曰| 六月婷婷国产精品综合| 一本一道久久综合狠狠老| 一本色道久久综合狠狠躁篇 | 狠狠色噜噜色狠狠狠综合久久| 亚洲综合无码无在线观看| 97久久综合精品久久久综合 | 久久婷婷成人综合色综合| 久久综合综合久久97色| 激情五月综合综合久久69| 伊人久久五月丁香综合中文亚洲| 狠狠色狠狠色综合| 国产成人麻豆亚洲综合无码精品| 一本一道色欲综合网中文字幕| 色综合色国产热无码一| 色综合网站国产麻豆| 久久婷婷五月综合色丁香| 婷婷五月综合色中文字幕| 天天色天天射综合网| 亚洲综合在线一区二区三区| 婷婷久久久五月综合色| 国产99久久亚洲综合精品| 天天做天天爱天天爽综合区| 亚洲色图综合在线| 亚洲国产国产综合一区首页| 久久综合久久综合九色| 亚洲第一综合天堂另类专|