国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 系統(tǒng) > Android > 正文

詳解Android開發(fā)中的重力傳感器用法實(shí)例

2020-02-21 17:23:46
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

Android手機(jī)系統(tǒng)中的重力傳感器又稱加速度傳感器,Android手機(jī)可以根據(jù)這個(gè)傳感器的度數(shù)來(lái)反轉(zhuǎn)手機(jī),感興趣的話就隨武林技術(shù)頻道小編一起來(lái)詳解Android開發(fā)中的重力傳感器用法實(shí)例吧!

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

假設(shè)當(dāng)?shù)氐闹亓铀俣戎禐間
當(dāng)手機(jī)正面朝上的時(shí)候,z的值為q,反面朝上的時(shí)候,z的值為-g
當(dāng)手機(jī)右側(cè)面朝上的時(shí)候,x的值為g,右側(cè)面朝上的時(shí)候,x的值為-g
當(dāng)手機(jī)上側(cè)面朝上的時(shí)候,y的值為g,右側(cè)面朝上的時(shí)候,y的值為-g

了解了重力傳感器中X,Y,Z的含義之后下面我們就開始學(xué)習(xí)如何使用

首先我們創(chuàng)建一個(gè)傳感器管理器和一個(gè)傳感器監(jiān)聽(tīng)器,管理器用來(lái)管理傳感器以及創(chuàng)建各種各樣的傳感器,監(jiān)聽(tīng)器用來(lái)監(jiān)視傳感器的變化并且進(jìn)行相應(yīng)的操作

private SensorManager sensorManager;private MySensorEventListener mySensorEventListener;mySensorEventListener= new MySensorEventListener();//這個(gè)監(jiān)聽(tīng)器當(dāng)然是我們自己定義的,在重力感應(yīng)器感應(yīng)到手機(jī)位置有變化的時(shí)候,我們可以采取相應(yīng)的操作,這里緊緊是將x,y,z的值打印出來(lái)private final class MySensorEventListener implements SensorEventListener{@Override//可以得到傳感器實(shí)時(shí)測(cè)量出來(lái)的變化值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是界面上的一個(gè)TextView標(biāo)簽,不再贅述tv_orientation.setText("Orientation:"+x+","+y+","+z);}}

我們?cè)?code>onResume()方法中創(chuàng)建重力傳感器,并向系統(tǒng)注冊(cè)監(jiān)聽(tīng)器

protected void onResume() { Sensor sensor_accelerometer=sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER); sensorManager.registerListener(mySensorEventListener,sensor_accelerometer, SensorManager.SENSOR_DELAY_UI);super.onResume();}

最后我們?cè)?code>onPause()中注銷所有傳感器的監(jiān)聽(tīng),釋放重力感應(yīng)器資源!

protected void onPause() {//注銷所有傳感器的監(jiān)聽(tīng)sensorManager.unregisterListener(mySensorEventListener);super.onPause();}

到此,有關(guān)重力傳感器的介紹完畢!

接下來(lái)看一個(gè)Android用重力傳感器做橫豎屏切換的例子

在播放視頻的時(shí)候,可能要做橫豎屏的切換,但是,用戶可以設(shè)置自己的手機(jī)關(guān)掉屏幕旋轉(zhuǎn),這個(gè)時(shí)候就需要想其他的辦法了,比如:重力傳感器。

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;   }  }; }; /** 返回ScreenSwitchUtils單例 **/ 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.);  // 注冊(cè)重力感應(yīng)器,監(jiān)聽(tīng)屏幕旋轉(zhuǎn)  sm = (SensorManager) context.getSystemService(Context.SENSOR_SERVICE);  sensor = sm.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);  listener = new OrientationSensorListener(mHandler);  // 根據(jù) 旋轉(zhuǎn)之后/點(diǎn)擊全屏之后 兩者方向一致,激活sm.  sm1 = (SensorManager) context.getSystemService(Context.SENSOR_SERVICE);  sensor1 = sm1.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);  listener1 = new OrientationSensorListener1(); } /** 開始監(jiān)聽(tīng) */ public void start(Activity activity) {  Log.d(TAG, start orientation listener.);  mActivity = activity;  sm.registerListener(listener, sensor, SensorManager.SENSOR_DELAY_UI); } /** 停止監(jiān)聽(tīng) */ public void stop() {  Log.d(TAG, stop orientation listener.);  sm.unregisterListener(listener);  sm1.unregisterListener(listener1); } /**  * 手動(dòng)橫豎屏切換方向  */ 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; } /**  * 重力感應(yīng)監(jiān)聽(tīng)者  */ 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) {    // 屏幕旋轉(zhuǎn)時(shí)    float OneEightyOverPi = 57.29577957855f;    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) {    // 屏幕旋轉(zhuǎn)時(shí)    float OneEightyOverPi = 57.29577957855f;    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) {// 檢測(cè)到當(dāng)前實(shí)際是橫屏    if (!isPortrait) {     sm.registerListener(listener, sensor,SensorManager.SENSOR_DELAY_UI);     sm1.unregisterListener(listener1);    }   } else if ((orientation > 315 && orientation < 360) || (orientation > 0 && orientation < 45)) {// 檢測(cè)到當(dāng)前實(shí)際是豎屏    if (isPortrait) {     sm.registerListener(listener, sensor,SensorManager.SENSOR_DELAY_UI);     sm1.unregisterListener(listener1);    }   }  } }}

使用的時(shí)候:

public class MainActivity extends Activity implements OnClickListener { private ScreenSwitchUtils instance; @Override protected void onCreate(Bundle savedInstanceState) {  super.onCreate(savedInstanceState);  instance = ScreenSwitchUtils.init(this.getApplicationContext()); } @Override protected void onStart() {  super.onStart();  instance.start(this); } @Override protected void onStop() {  super.onStop();  instance.stop(); } @SuppressLint(NewApi) @Override public void onConfigurationChanged(Configuration newConfig) {  super.onConfigurationChanged(newConfig);  Log.e(test, onConfigurationChanged);  if (instance.isPortrait()) {   // 切換成豎屏   LayoutParams params1 = new RelativeLayout.LayoutParams(screenWidth, DensityUtil.dip2px(this, 160));   videoView.setLayoutParams(params1);   Toast.makeText(getApplicationContext(), 豎屏, 0).show();   Log.e(test, 豎屏);  } else {   // 切換成橫屏   LayoutParams params1 = new RelativeLayout.LayoutParams(screenHeight, screenWidth);   videoView.setLayoutParams(params1);   Toast.makeText(getApplicationContext(), 橫屏, 0).show();   Log.e(test, 橫屏);  } } @Override public void onClick(View arg0) {  switch (arg0.getId()) {  case R.id.iv_stretch:   instance.toggleScreen();   break;  } }}

調(diào)用了activity.setRequestedOrientation()以后,會(huì)觸發(fā)activity.onConfigurationChanged();可以在這里面重新設(shè)置播放界面的大小。

以上就是詳解Android開發(fā)中的重力傳感器用法實(shí)例,如果你們的技術(shù)比較厲害,我們可以選擇進(jìn)行操作。

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 仪征市| 东宁县| 刚察县| 河津市| 鄂托克前旗| 中阳县| 关岭| 阿拉尔市| 甘谷县| 克山县| 灌阳县| 乐都县| 勐海县| 广西| 西安市| 渭源县| 大理市| 东明县| 民权县| 乾安县| 姚安县| 肃南| 上林县| 武乡县| 安丘市| 博客| 隆尧县| 来凤县| 施秉县| 孟村| 泉州市| 黔西县| 桑日县| 元江| 汕尾市| 建宁县| 建宁县| 酒泉市| 扎赉特旗| 富源县| 大新县|