监测屏幕旋转的方案,这里简要说一下screenOrientation,OrientationEventListener,SensorEventListener。

方案一

screenOrientation。

在AndroidManifest中,activity配置screenOrientation,比如值为sensor,系统可以自动改变activity的界面方向。在回调onConfigurationChanged()中可以判断当前方向。

       <activity android:name=".ui.sensor.ScreenOrientationActivity"android:configChanges="orientation|keyboardHidden"android:screenOrientation="sensor"/>

优点:简单,系统自动。

缺点:只能监听屏幕方向;系统自动设置方向,当有条件切换时,无法实现需求;无法知道旋转方向。

方案二

OrientationEventListener。

实现OrientationEventListener方法。在适当的位置调用enable()和disable()来开启和关闭监听。

public class OrientationEventActivity extends AppCompatActivity {@Overrideprotected void onCreate(@Nullable Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_sensor);initOrientationEvent();}OrientationEventListener mOrientationEventListener;public void initOrientationEvent(){mOrientationEventListener = new OrientationEventListener(this,SensorManager.SENSOR_DELAY_NORMAL) {@Overridepublic void onOrientationChanged(int orientation) {if (orientation == OrientationEventListener.ORIENTATION_UNKNOWN) {return;  //手机平放时,检测不到有效的角度}//只检测是否有四个角度的改变if (orientation > 350 || orientation < 10) { //0度orientation = 0;} else if (orientation > 80 && orientation < 100) { //90度orientation = 90;} else if (orientation > 170 && orientation < 190) { //180度orientation = 180;} else if (orientation > 260 && orientation < 280) { //270度orientation = 270;} else {return;}}};if (mOrientationEventListener.canDetectOrientation()) {mOrientationEventListener.enable();} else {mOrientationEventListener.disable();}}@Overrideprotected void onDestroy() {super.onDestroy();if(mOrientationEventListener !=null){mOrientationEventListener.disable();}}
}

优点:可以判断角度,解决按需设置方向。也能通过判断知道旋转方向。但平放时,无法得到有效的角度。可以通过反射,解决平放时,无法获取角度问题。

    public  class ScreenOrientationListener extends OrientationEventListener {private int mOrientation;private OnOrientationChangedListener mOnOrientationChangedListener;private Context mContext;private Field mFieldRotation;private Object mOLegacy;public ScreenOrientationListener(Context context) {super(context);mContext = context;}public void setOnOrientationChangedListener(OnOrientationChangedListener listener) {this.mOnOrientationChangedListener = listener;}public int getOrientation() {int rotation = -1;try {if (null == mFieldRotation) {SensorManager sensorManager = (SensorManager) mContext.getSystemService(Context.SENSOR_SERVICE);Class clazzLegacy = Class.forName("android.hardware.LegacySensorManager");Constructor constructor = clazzLegacy.getConstructor(SensorManager.class);constructor.setAccessible(true);mOLegacy = constructor.newInstance(sensorManager);mFieldRotation = clazzLegacy.getDeclaredField("sRotation");mFieldRotation.setAccessible(true);}rotation = mFieldRotation.getInt(mOLegacy);} catch (Exception e) {LogUtil.e( "getRotation e=" + e.getMessage());e.printStackTrace();}
//        Log.d(TAG, "getRotation rotation=" + rotation);int orientation = -1;switch (rotation) {case Surface.ROTATION_0:orientation = 0;break;case Surface.ROTATION_90:orientation = 90;break;case Surface.ROTATION_180:orientation = 180;break;case Surface.ROTATION_270:orientation = 270;break;default:break;}
//        Log.d(TAG, "getRotation orientation=" + orientation);return orientation;}@Overridepublic void onOrientationChanged(int orientation) {if (orientation == OrientationEventListener.ORIENTATION_UNKNOWN) {return; // 手机平放时,检测不到有效的角度}orientation = getOrientation();if (mOrientation != orientation) {mOrientation = orientation;if (null != mOnOrientationChangedListener) {mOnOrientationChangedListener.onOrientationChanged(mOrientation);LogUtil.d("ScreenOrientationListener onOrientationChanged orientation=" + mOrientation);}}}public interface OnOrientationChangedListener {void onOrientationChanged(int orientation);}}

方案三

SensorEventListener

package com.ader.demo_unit.ui.sensor;import android.annotation.TargetApi;
import android.content.Context;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
import android.os.Build;
import android.os.Bundle;
import android.view.OrientationEventListener;
import android.view.Surface;import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;import com.ader.baseapp.base.ui.BaseActivity;
import com.ader.baseapp.base.utils.LogUtil;
import com.ader.demo_unit.R;import java.lang.reflect.Constructor;
import java.lang.reflect.Field;/*** Create by Wang Xiaowu on 2023-02-06* Describe:*/
public class SensorActivity extends AppCompatActivity {SensorManager sm;SensorEventListener mSensorEventListener = new SensorEventListener() {@Overridepublic void onSensorChanged(SensorEvent event) {
//            float[] values=event.values;
//            String sb="x方向加速度:"+
//                    values[0]+
//                    "\nY轴方向加速度:"+
//                    values[1]+
//                    "\nZ轴方向加速度:"+
//                    values[2];
//            LogUtil.e(String.format("%s accuracy:%d sensor:%s",sb,event.accuracy,event.sensor.toString()));
//
//            /* 判断Sensor的种类 */if (event.sensor.getType() == Sensor.TYPE_ORIENTATION) {/* 取得X值资料 */float x_data = event.values[SensorManager.DATA_X];if ((x_data > 0 && x_data <= 22.5) || x_data > 337.5) {LogUtil.e("北方" + String.valueOf(x_data));} else if (x_data > 22.5 && x_data <= 67.5) {LogUtil.e("东北方" + String.valueOf(x_data));} else if (x_data > 67.5 && x_data <= 112.5) {LogUtil.e("东方" + String.valueOf(x_data));} else if (x_data > 112.5 && x_data <= 157.5) {LogUtil.e("东南方" + String.valueOf(x_data));} else if (x_data > 157.5 && x_data <= 202.5) {LogUtil.e("南方" + String.valueOf(x_data));} else if (x_data > 202.5 && x_data <= 247.5) {LogUtil.e("西南方" + String.valueOf(x_data));} else if (x_data > 247.5 && x_data <= 292.5) {LogUtil.e("西方" + String.valueOf(x_data));} else if (x_data > 292.5 && x_data <= 337.5) {LogUtil.e("西北方" + String.valueOf(x_data));}}}@Overridepublic void onAccuracyChanged(Sensor sensor, int accuracy) {LogUtil.e(String.format("onAccuracyChanged accuracy:%d sensor:%s",accuracy,sensor.toString()));}};@Overrideprotected void onCreate(@Nullable Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_sensor);//1.获取系统的传感器管理服务sm =  (SensorManager)getSystemService(SENSOR_SERVICE);}@TargetApi(Build.VERSION_CODES.LOLLIPOP)@Overrideprotected void onResume() {super.onResume();//2.// 为系统的加速度传感器注册监听事件
//        sm.registerListener(mSensorEventListener,
//                sm.getDefaultSensor(Sensor.TYPE_ACCELEROMETER),
//                SensorManager.SENSOR_DELAY_GAME);
//        //方向传感器sm.registerListener(mSensorEventListener,sm.getDefaultSensor(Sensor.TYPE_ORIENTATION),SensorManager.SENSOR_DELAY_FASTEST);//* Sensor.TYPE_ORIENTATION:方向传感器。////* Sensor.TYPE_GYROSCOPE:陀螺仪传感器。////* Sensor.TYPE_MAGNETIC_FIELD:磁场传感器。////* Sensor.TYPE_GRAVITY:重力传感器。////* Sensor.TYPE_LINEAR_ACCELERATION:线性加速度传感器。////* Sensor.TYPE_AMBIENT_TEMPERATURE:温度传感器。////* Sensor.TYPE_LIGHT:光传感器。////* Sensor.TYPE_PRESSURE:压力传感器。}@Overrideprotected void onPause() {super.onPause();//取消注册sm.unregisterListener(mSensorEventListener);}}

可以获取位置方向,但获取屏幕方向有点困难。已经被废弃。官方推荐使用 SensorManager.getOrientation() 替代。

Android监测屏幕旋转相关推荐

  1. android 屏幕旋转流程,android自动屏幕旋转流程分析.doc

    android自动屏幕旋转流程分析.doc android自动屏幕旋转流程分析 在android设置(Settings)中我们可以看到显示(display)下有一个自动屏幕旋转的checkbox, 如 ...

  2. android 手机屏幕旋转机制与使用说明

    android 屏幕旋转机制与使用说明 一 Overview 在开发android应用的时候,有可能需要让应用程序随着系统设置而进行调整,比如判断系统的屏幕方向.判断系统方向的方向导航设备等.除此之外 ...

  3. Android 禁止屏幕旋转 旋转屏幕时保持Activity内容

    Android 禁止屏幕旋转 & 旋转屏幕时保持Activity内容 1.在应用中固定屏幕方向. 在AndroidManifest.xml的activity中加入:            an ...

  4. Android实现屏幕旋转方法

    本文实例总结了Android实现屏幕旋转方法.分享给大家供大家参考.具体如下: 在介绍之前,我们需要先了解默认情况下android屏幕旋转的机制: 默认情况下,当用户手机的重力感应器打开后,旋转屏幕方 ...

  5. Android 打开屏幕旋转

    2019独角兽企业重金招聘Python工程师标准>>> 添加设置读写权限: <uses-permission android:name="android.permis ...

  6. Android之屏幕旋转之后当前activity被finish了依然被拉起来

    1 问题 屏幕旋转之后当前activity被finish了依然被拉起来 2 分析思路 不用finish函数,使用 android.os.Process.killProcess(android.os.P ...

  7. Android App屏幕旋转要点

    文章目录 前言 屏幕旋转"预热" android:screenOrientation android:configChanges Acitvity onConfigurationC ...

  8. Android处理屏幕旋转时的解决方案

    Android的Activity在不明确的指定屏幕方向和configChanges,当用户进行屏幕旋转时,Activity就会重新启动,这个时候需要考虑的就是数据的保存与恢复,Android给出了一下 ...

  9. Android 禁止屏幕旋转

    Android 开发中禁止屏幕旋转 我们通常有两种方案 方案一 在AndroidManifest.xml 中设置activity 中的android:screenOrientation 属性值 方案二 ...

最新文章

  1. golang中的嵌套
  2. 加点自已内容的新内核下L7-FILTER的应用实例!
  3. 各种数据库对应的jar包、驱动类名和URL格式
  4. JAVA入门级教学之(IDEA工具的快捷键和简单设置)
  5. java socket建立长连接_Java Web项目中使用Socket通信多线程、长连接的方法
  6. 【编程导航】国外大神总结的实用代码,30 秒学会!
  7. UVA 11452 Dancing the Cheeky-Cheeky
  8. 2015年C语言组混搭 C/C++
  9. android 动态生成直线,Android使用自定义view在指定时间内匀速画一条直线的实例代码...
  10. python习题练习(chapater 5 -- python核心编程)
  11. Restlet Introduction
  12. 不再恐惧入侵者 DLL后门完全清除方法(转)
  13. 视频自动生成字幕(免费版)
  14. watch港版微信无法连接到服务器,Apple Watch微信打不开怎么办
  15. 最小覆盖圆(smallest enclosing circle)算法 python 实现
  16. 当元宇宙时代来临,才真正让这些新技术跳出了互联网的牵绊
  17. 关于若依框架多级菜单的设置
  18. 微信小程序canvas绘制图片真机不显示问题
  19. 从利用gensim 训练好的word2vec模型中取出向量并计算余弦相似度,Levenshtein distance 计算
  20. 斐讯k2搭建php环境,斐讯K2T SDK编译环境

热门文章

  1. 汇编语言实现冒泡排序
  2. MySQL为什么错误选择代价更大的索引
  3. 请写一段代码 把cv2 imshow窗口可以保存为动图
  4. 3dsmax导入Autocad立体图问题
  5. 忆阻器(一)——基本概念和实例
  6. 数学建模之数据的标准化处理(C语言)
  7. Java事件模型与Android事件模型的比较
  8. 逻辑数据模型之层次数据模型、网状数据模型和关系数据模型
  9. python接收弹幕_Python爬虫自动化爬取b站实时弹幕实例方法
  10. React16常用api解析以及原理剖析