Android监测屏幕旋转
监测屏幕旋转的方案,这里简要说一下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监测屏幕旋转相关推荐
- android 屏幕旋转流程,android自动屏幕旋转流程分析.doc
android自动屏幕旋转流程分析.doc android自动屏幕旋转流程分析 在android设置(Settings)中我们可以看到显示(display)下有一个自动屏幕旋转的checkbox, 如 ...
- android 手机屏幕旋转机制与使用说明
android 屏幕旋转机制与使用说明 一 Overview 在开发android应用的时候,有可能需要让应用程序随着系统设置而进行调整,比如判断系统的屏幕方向.判断系统方向的方向导航设备等.除此之外 ...
- Android 禁止屏幕旋转 旋转屏幕时保持Activity内容
Android 禁止屏幕旋转 & 旋转屏幕时保持Activity内容 1.在应用中固定屏幕方向. 在AndroidManifest.xml的activity中加入: an ...
- Android实现屏幕旋转方法
本文实例总结了Android实现屏幕旋转方法.分享给大家供大家参考.具体如下: 在介绍之前,我们需要先了解默认情况下android屏幕旋转的机制: 默认情况下,当用户手机的重力感应器打开后,旋转屏幕方 ...
- Android 打开屏幕旋转
2019独角兽企业重金招聘Python工程师标准>>> 添加设置读写权限: <uses-permission android:name="android.permis ...
- Android之屏幕旋转之后当前activity被finish了依然被拉起来
1 问题 屏幕旋转之后当前activity被finish了依然被拉起来 2 分析思路 不用finish函数,使用 android.os.Process.killProcess(android.os.P ...
- Android App屏幕旋转要点
文章目录 前言 屏幕旋转"预热" android:screenOrientation android:configChanges Acitvity onConfigurationC ...
- Android处理屏幕旋转时的解决方案
Android的Activity在不明确的指定屏幕方向和configChanges,当用户进行屏幕旋转时,Activity就会重新启动,这个时候需要考虑的就是数据的保存与恢复,Android给出了一下 ...
- Android 禁止屏幕旋转
Android 开发中禁止屏幕旋转 我们通常有两种方案 方案一 在AndroidManifest.xml 中设置activity 中的android:screenOrientation 属性值 方案二 ...
最新文章
- golang中的嵌套
- 加点自已内容的新内核下L7-FILTER的应用实例!
- 各种数据库对应的jar包、驱动类名和URL格式
- JAVA入门级教学之(IDEA工具的快捷键和简单设置)
- java socket建立长连接_Java Web项目中使用Socket通信多线程、长连接的方法
- 【编程导航】国外大神总结的实用代码,30 秒学会!
- UVA 11452 Dancing the Cheeky-Cheeky
- 2015年C语言组混搭 C/C++
- android 动态生成直线,Android使用自定义view在指定时间内匀速画一条直线的实例代码...
- python习题练习(chapater 5 -- python核心编程)
- Restlet Introduction
- 不再恐惧入侵者 DLL后门完全清除方法(转)
- 视频自动生成字幕(免费版)
- watch港版微信无法连接到服务器,Apple Watch微信打不开怎么办
- 最小覆盖圆(smallest enclosing circle)算法 python 实现
- 当元宇宙时代来临,才真正让这些新技术跳出了互联网的牵绊
- 关于若依框架多级菜单的设置
- 微信小程序canvas绘制图片真机不显示问题
- 从利用gensim 训练好的word2vec模型中取出向量并计算余弦相似度,Levenshtein distance 计算
- 斐讯k2搭建php环境,斐讯K2T SDK编译环境