广告
返回顶部
首页 > 资讯 > 精选 >怎么在Android项目中实现一个重力传感器功能
  • 765
分享到

怎么在Android项目中实现一个重力传感器功能

android 2023-05-30 18:05:01 765人浏览 安东尼
摘要

怎么在Android项目中实现一个重力传感器功能?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。首先我们创建一个传感器管理器和一个传感器监听器,管理器用来管理传感

怎么在Android项目中实现一个重力传感器功能?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。

首先我们创建一个传感器管理器和一个传感器监听器,管理器用来管理传感器以及创建各种各样的传感器,监听器用来监视传感器的变化并且进行相应的操作

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用重力传感器做横竖屏切换的例子

在播放视频的时候,可能要做横竖屏的切换,但是,用户可以设置自己的手机关掉屏幕旋转,这个时候就需要想其他的办法了,比如:重力传感器。

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.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) {    // 屏幕旋转时    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) {// 检测到当前实际是横屏    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);    }   }  } }}

使用的时候:

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;  } }}

调用了activity.setRequestedOrientation()以后,会触发activity.onConfigurationChanged();可以在这里面重新设置播放界面的大小。

看完上述内容是否对您有帮助呢?如果还想对相关知识有进一步的了解或阅读更多相关文章,请关注编程网精选频道,感谢您对编程网的支持。

--结束END--

本文标题: 怎么在Android项目中实现一个重力传感器功能

本文链接: https://www.lsjlt.com/news/220276.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 怎么在Android项目中实现一个重力传感器功能
    怎么在Android项目中实现一个重力传感器功能?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。首先我们创建一个传感器管理器和一个传感器监听器,管理器用来管理传感...
    99+
    2023-05-30
    android
  • 在Android项目中使用OKHttp3怎么实现一个下载功能
    这篇文章给大家介绍在Android项目中使用OKHttp3怎么实现一个下载功能,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。app Module下的build.gradle,代码如下apply plugin: '...
    99+
    2023-05-31
    okhttp android roi
  • 怎么在html5项目中实现一个录音功能
    这篇文章给大家介绍怎么在html5项目中实现一个录音功能,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。步骤1由于新的api是通过navigator.mediaDevices.getUserMedia,且返回一个prom...
    99+
    2023-06-09
  • 怎么在Java项目中实现一个分页功能
    怎么在Java项目中实现一个分页功能?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。分页对象public class PageUtils imp...
    99+
    2023-05-31
    java ava 目中
  • Android开发中项目实现一个画板功能
    这期内容当中小编将会给大家带来有关Android开发中项目实现一个画板功能,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。效果图如下XML布局代码<RelativeLayout xmlns:andro...
    99+
    2023-05-31
    android roi
  • 怎么在Android项目中添加 一个进度条功能
    怎么在Android项目中添加 一个进度条功能?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。效果如图… 代码实现过程–main布局 这个布局中就是一个简单的引用<...
    99+
    2023-05-31
    android roi 目中
  • 怎么在Android应用中实现一个选项卡功能
    怎么在Android应用中实现一个选项卡功能?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。选项卡(TabHost)方便的在窗口上设置多个标签页,每个标签页相当于获得一个与外...
    99+
    2023-05-31
    android roi
  • 怎么在Android中实现一个双重选择框功能
    这期内容当中小编将会给大家带来有关怎么在Android中实现一个双重选择框功能,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。原理:定义四个RadioGroup,通过第一个RadioGroup的选择来控制其...
    99+
    2023-05-30
    android
  • 怎么在Java Web项目中利用Html5 FormData实现一个文件上传功能
    怎么在Java Web项目中利用Html5 FormData实现一个文件上传功能?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。首先html页面定义有两种:Html1<fo...
    99+
    2023-05-31
    javaweb html5 formdata
  • Android项目中利用CountDownTimer实现一个倒数功能
    Android项目中利用CountDownTimer实现一个倒数功能?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。实现倒计时的效果例子:发送验证码按钮效果图:p...
    99+
    2023-05-31
    android countdowntimer tim
  • 怎么在java项目中实现一个选择排序功能
    本篇文章为大家展示了怎么在java项目中实现一个选择排序功能,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。一、基本概念      每趟从待排序的记录...
    99+
    2023-05-31
    java 选择排序 ava
  • 在Android项目中利用TextView实现一个自动滚动功能
    在Android项目中利用TextView实现一个自动滚动功能?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。在做android 应用的开发的时候,横向滚动或者要...
    99+
    2023-05-31
    android textview roi
  • 通过在android项目中使用MediaRecorder实现一个录音功能
    这篇文章将为大家详细讲解有关通过在android项目中使用MediaRecorder实现一个录音功能,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。MainActivitypackage co...
    99+
    2023-05-31
    mediarecorder android roi
  • 在android项目中使用LinearLayoutManager实现一个一键返回顶部功能
    本篇文章为大家展示了在android项目中使用LinearLayoutManager实现一个一键返回顶部功能,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。效果图要实现这种效果,有两点需要实现:控制L...
    99+
    2023-05-31
    android linearlayout age
  • 怎么在Android中实现一个计步器功能
    本篇文章给大家分享的是有关怎么在Android中实现一个计步器功能,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。activity_main.xml<xml ve...
    99+
    2023-06-14
  • 如何在Android sdutio项目中利用Zxing实现一个扫码功能
    今天就跟大家聊聊有关如何在Android sdutio项目中利用Zxing实现一个扫码功能,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。最快的调用Zxing方法关联第三方库调用基础的...
    99+
    2023-05-31
    android studio zxing
  • 怎么在JAVA项目中实现一个UDP网络通讯功能
    今天就跟大家聊聊有关怎么在JAVA项目中实现一个UDP网络通讯功能,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。具体如下:UDP协议全称是用户数据报协议,在网络中它与TCP协议一样用...
    99+
    2023-05-31
    java udp ava
  • 怎么在JAVA项目中实现一个TCP网络通讯功能
    怎么在JAVA项目中实现一个TCP网络通讯功能?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。具体如下:TCP(Transmission Control Prot...
    99+
    2023-05-31
    java tcp ava
  • 怎么在Android中实现一个摇一摇功能
    本篇文章给大家分享的是有关怎么在Android中实现一个摇一摇功能,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。步骤1:声明一个SensorManager对象步骤2:重写Act...
    99+
    2023-06-14
  • 在java项目中使用Demo如何实现一个文件上传功能
    在java项目中使用Demo如何实现一个文件上传功能?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。说到文件上传我们要做到:引入两个包:commons-fileupload-1....
    99+
    2023-05-31
    文件上传 demo java
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作