博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Android开发 设备横屏与竖屏的详解
阅读量:4466 次
发布时间:2019-06-08

本文共 5050 字,大约阅读时间需要 16 分钟。

需要了解横竖屏切换关键知识

  1.在Android设备的横竖屏幕,每一次切换横竖屏其实是在重新创建Activity,Activity会重新走一遍生命周期.从onCreate 到 onDestroy

  2.在Activity类里的变量也会重新创建,这点需要注意!

判断屏幕方向,方式一

判断屏幕是否竖屏

  @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_test);        if (getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT){            L.e("触发竖屏");        }    }

判断屏幕是否横屏

@Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_test);        if (getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE){            L.e("触发横屏");        }    }

判断屏幕是否是未知方向

@Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_test);        if (getResources().getConfiguration().orientation == Configuration.ORIENTATION_UNDEFINED){            L.e("未定义方向");        }    }

判断屏幕方向,方式二

这个方式其实是监听activity的配置变化时的回调

 在activity里重写onConfigurationChanged方法

@Override    public void onConfigurationChanged(Configuration newConfig) {        L.e("newConfig.orientation="+newConfig.orientation);        if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT){            L.e("触发竖屏");        }        if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE){            L.e("触发横屏");        }        super.onConfigurationChanged(newConfig);    }

注意!,这个方法没想象这么简单.这个方法回调的条件:   这个方法要求,切换横竖屏不在重新创建activity,就是activity不会再次onCreate,才会回调这个方法.所以正常情况下,你无法在横竖屏后触发这个回调.

为了触发这个回调,我们需要在AndroidManifest.xml给目标Activity添加属性 android:configChanges="orientation|screenSize":

configChanges这个属性控制着,我们activity在某些情况下是不需要重新创建activity的,这里的不重新创建意味着activity的生命周期将保持不变,不会重新走任何一个生命周期包括onResume.

这里设置方向orientation和尺寸screenSize,就会让方向与尺寸改变时不会重新创建activity.当然还有以下几种情况:

  • “mcc“ 移动国家号码,由三位数字组成,每个国家都有自己独立的MCC,可以识别手机用户所属国家。
  • “mnc“ 移动网号,在一个国家或者地区中,用于区分手机用户的服务商。
  • “locale“ 所在地区发生变化。
  • “touchscreen“ 触摸屏已经改变。(这不应该常发生。)
  • “keyboard“ 键盘模式发生变化,例如:用户接入外部键盘输入。
  • “keyboardHidden“ 用户打开手机硬件键盘
  • “navigation“ 导航型发生了变化。(这不应该常发生。)
  • “orientation“ 设备旋转,横向显示和竖向显示模式切换。
  • “fontScale“ 全局字体大小缩放发生改变

判断屏幕方向,方式三

 这个方法其实是最强的,因为它是监听了方向传感器的值.所以它能监听获取任意方向.

 我们只要new一个OrientationEventListener,开启就行了.注意它不是接口类,是一个抽象类.

private OrientationEventListener mOrientationEventListener;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_test);        mOrientationEventListener = new OrientationEventListener(this) {            @Override            public void onOrientationChanged(int orientation) {                L.e("onOrientationChanged: " + orientation);                if (orientation > 350 || orientation < 20) { //0度  90 正竖屏                } else if (orientation > 70 && orientation < 110) { //90度 右横屏                } else if (orientation > 160 && orientation < 200) { //180度 倒竖屏                } else if (orientation > 250 && orientation < 290) { //270度 左横屏                }            }        };        if (mOrientationEventListener.canDetectOrientation()) {            Log.v(TAG, "可以检测方向");            mOrientationEventListener.enable();//开启        } else {            Log.v(TAG, "无法检测方向");            mOrientationEventListener.disable();        }    }    @Override    protected void onDestroy() {        super.onDestroy();        mOrientationEventListener.disable();//注销    }

最后注意,在退出时需要注销关闭监听.

另外还有一个更合适在方向监听上使用的,配置参数 SensorManager.SENSOR_DELAY_NORMAL:

mOrientationEventListener = new OrientationEventListener(this, SensorManager.SENSOR_DELAY_NORMAL) { //            @Override            public void onOrientationChanged(int orientation) {                L.e("onOrientationChanged: " + orientation);                          }        };

SensorManager.SENSOR_DELAY_NORMAL 的意思是,让传感器延迟,更适合在方向的监听使用.所以如果你只需要方向上面的监听推荐添加这个参数创建OrientationEventListener.

这样设置延迟的好处是排除一些中间的波动值,返回的值会更加稳定,这样你可以在判断方向时,不会出现在边界值上反反复复切来切去的问题.

设置当前屏幕方向

在activity里写以下任意一个属性

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);//设置屏幕为横屏, 设置后会锁定方向setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);//设置屏幕为竖屏, 设置后会锁定方向setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED);//方向未定义, 设置后放弃锁定方向

注意,这里的锁定方向意思是指,用户将无法自己改变这个activity的方向. 包括自动切换屏幕的方向传感器.

  • SCREEN_ORIENTATION_UNSPECIFIED 方向未指定
  • SCREEN_ORIENTATION_LANDSCAPE 方向横屏
  • SCREEN_ORIENTATION_PORTRAIT 方向竖屏
  • SCREEN_ORIENTATION_USER 方向用户
  • SCREEN_ORIENTATION_BEHIND 方向背后
  • SCREEN_ORIENTATION_SENSOR 方向传感器
  • SCREEN_ORIENTATION_NOSENSOR  方向没有传感器
  • SCREEN_ORIENTATION_SENSOR_LANDSCAPE 传感器横向
  • SCREEN_ORIENTATION_SENSOR_PORTRAIT 传感器竖向
  • SCREEN_ORIENTATION_REVERSE_LANDSCAPE 反转横向
  • SCREEN_ORIENTATION_REVERSE_PORTRAIT 反转竖向
  • SCREEN_ORIENTATION_FULL_SENSOR 全传感器
  • SCREEN_ORIENTATION_USER_LANDSCAPE 用户横向
  • SCREEN_ORIENTATION_USER_PORTRAIT 用户竖向
  • SCREEN_ORIENTATION_FULL_USER 方向用户
  • SCREEN_ORIENTATION_LOCKED 方向锁定

 

end

posted on
2019-07-13 15:11  阅读(
...) 评论(
...) 收藏

转载于:https://www.cnblogs.com/guanxinjing/p/11180701.html

你可能感兴趣的文章
用myEclipse连接数据源生成动态数据报表
查看>>
[myeclipse]@override报错问题
查看>>
超简单的listview单选模式SingleMode(自定义listview item)
查看>>
HDU 1199 - Color the Ball 离散化
查看>>
[SCOI2005]骑士精神
查看>>
Hibernate原理解析-Hibernate中实体的状态
查看>>
六时车主 App 隐私政策
查看>>
C语言常见问题 如何用Visual Studio编写C语言程序测试
查看>>
Web用户的身份验证及WebApi权限验证流程的设计和实现
查看>>
hdu 2098 分拆素数和
查看>>
ECMAScript6-let与const命令详解
查看>>
iOS 使用系统相机、相册显示中文
查看>>
什么是敏捷设计
查看>>
SCSS的基本操作
查看>>
"安装程序无法定位现有系统分区" 问题解决
查看>>
.NET中栈和堆的比较
查看>>
【莫队】bzoj 3781,bzoj 2038,bzoj 3289
查看>>
如何优化limit
查看>>
几种常用数据库字段类型查询语句
查看>>
提高效率必须改掉的7种习惯
查看>>