色另类_婷婷激情四月_亚洲精品无码不卡在线播放he_欧美第七页_精品国产综合区久久久久99_青娱乐极品盛宴在线

產(chǎn)品分類

當(dāng)前位置: 首頁 > 傳感測量產(chǎn)品 > 工業(yè)傳感器 > 力傳感器

類型分類:
科普知識
數(shù)據(jù)分類:
力傳感器

重力傳感器 android:android 重力傳感器gsensor,淺談Android重力感應(yīng)

發(fā)布日期:2022-10-09 點(diǎn)擊率:132


重力傳感器 android:android 重力傳感器gsensor,淺談Android重力感應(yīng)

重力感應(yīng),也算是智能機(jī)和非智能機(jī)的區(qū)別之一了吧,Android設(shè)備中自然也能有這個功能。

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

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

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

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

(SensorManager)

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

的列表,Listsensors =

manager.getSensorList(Sensor.TYPE_ACCELEROMETER)。

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

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

如果要取消這個重力感應(yīng)的話,就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) {

}

}

其實(shí),代碼很簡單,主要就是要看在實(shí)際項(xiàng)目中如何運(yùn)用了。
重力傳感器 android:android 重力傳感器gsensor,淺談Android重力感應(yīng)  第1張

重力傳感器 android:Android開發(fā)中的重力傳感器用法實(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;   }  }; }; 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.);  // 注冊重力感應(yīng)器,監(jiān)聽屏幕旋轉(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(); } 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) {
// 屏幕旋轉(zhuǎn)時
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) {
// 屏幕旋轉(zhuǎn)時
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) {// 檢測到當(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)) {// 檢測到當(dāng)前實(shí)際是豎屏    if (isPortrait) {     sm.registerListener(listener, sensor,SensorManager.SENSOR_DELAY_UI);     sm1.unregisterListener(listener1);    }   }  } } }重力傳感器 android:android 重力傳感器gsensor,淺談Android重力感應(yīng)  第2張

重力傳感器 android:Android開發(fā)之重力傳感器

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

假設(shè)當(dāng)?shù)氐闹亓铀俣戎禐間
當(dāng)手機(jī)正面朝上的時候,z的值為q,反面朝上的時候,z的值為-g
當(dāng)手機(jī)右側(cè)面朝上的時候,x的值為g,右側(cè)面朝上的時候,x的值為-g
當(dāng)手機(jī)上側(cè)面朝上的時候,y的值為g,右側(cè)面朝上的時候,y的值為-g
了解了重力傳感器中X,Y,Z的含義之后下面我們就開始學(xué)習(xí)如何使用
首先我們創(chuàng)建一個傳感器管理器和一個傳感器監(jiān)聽器,管理器用來管理傳感器以及創(chuàng)建各種各樣的傳感器,監(jiān)聽器用來監(jiān)視傳感器的變化并且進(jìn)行相應(yīng)的操作
private SensorManager sensorManager;
private MySensorEventListener mySensorEventListener;
mySensorEventListener=new MySensorEventListener();//這個監(jiān)聽器當(dāng)然是我們自己定義的,在重力感     應(yīng)器感應(yīng)到手機(jī)位置有變化的時候,我們可以采取相應(yīng)的操作,這里緊緊是將x,y,z的值打印出來
private final class MySensorEventListener implements  SensorEventListener{

@Override
//可以得到傳感器實(shí)時測量出來的變化值
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標(biāo)簽,不再贅述
tv_orientation.setText("Orientation:"+x+","+y+","+z);
}
}

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

super.onResume();
}
最后我們在onPause()中注銷所有傳感器的監(jiān)聽,釋放重力感應(yīng)器資源!
protected void onPause() {
/注銷所有傳感器的監(jiān)聽
sensorManager.unregisterListener(mySensorEventListener);
super.onPause();
}
到此,有關(guān)重力傳感器的介紹完畢!

重力傳感器 android:Android重力傳感器--隨重力旋轉(zhuǎn)的圖標(biāo)

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

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

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

主站蜘蛛池模板: 99精品国产高清在线观看 | 日本亚洲精品色婷婷在线影院 | 狠狠做深爱婷婷久久一区 | 亚洲一二三四2021不卡 | 521色香蕉网站在线观看 | 成人爽A毛片免费啪啪 | 欧美精品一区二区免费 | 欧美亚洲香蕉 | 特黄特色的大片观看免费视频 | 新91| 国产精品久久久久一区二区三区 | 99re3| 精品国产自在久久 | 国产成人综合AV在线观看不止 | 性福演算法 | 性色av免费在线观看 | 欧美乱视频 | 新封神榜杨戬电影免费动画在线观看国语 | 欧美视频在线免费看 | 呦呦在线视频 | 亚洲天天更新 | 99国产精品自拍 | 日本在线视频不卡 | 国产精品爱久久久久久久 | 二区欧美 | 久久久99精品免费观看 | 天天影视免费在线观看入口 | 国产精品久久精品 | 亚洲精品中文字幕在线观看 | 男人天堂网av | 草综合| 成人在线免费观看网站 | 国产视频一区二区在线观看 | 天天操夜夜操夜夜操 | 一级黄片毛片 | 精品免费国产一区二区三区四区 | 日韩精品区 | 国产一区精品视频 | 亚洲狠狠爱 | av中文字幕在线播放 | 日韩大片免费在线观看 |