Android开发 设备横屏与竖屏的详解
需要了解横竖屏切换关键知识
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":
- <activity android:name=".test.TestActivity"
- 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
Android开发 设备横屏与竖屏的详解的更多相关文章
- Android强制设置横屏或竖屏
全屏 在Activity的onCreate方法中的setContentView(myview)调用之前添加下面代码 requestWindowFeature(Window.FEATURE_NO_TIT ...
- 05 Android强制设置横屏或竖屏/全屏
全屏 在Activity的onCreate方法中的setContentView(myview)调用之前添加下面代码 requestWindowFeature(Window.FEATURE_NO_TIT ...
- (转)Android强制设置横屏或竖屏
全屏 在Activity的onCreate方法中的setContentView(myview)调用之前添加下面代码 requestWindowFeature(Window.FEATURE_NO_TIT ...
- Android 强制设置横屏或竖屏 设置全屏
(转自:http://blog.csdn.net/yuejingjiahong/article/details/6636981) 强制横屏: @Override protected void onRe ...
- 整理最全的Android开发工程师面试题,面试题详解。java、Android程序员
1. 请描述下Activity的生命周期. 必调用的三个方法:onCreate()--> onStart() --> onResume(),用AAA表示 (1)父Activity启动 ...
- Android 开发权限设置中英对照说明详解
android.permission.ACCESS_CHECKIN_PROPERTIES 允许读写访问 "properties"表在checkin数据库中,改值可以修改上传( Al ...
- Android开发之数据存储——SharedPreferences基础知识详解,饿补学会基本知识,开发者必会它的用法。
一.数据存储选项:Data Storage --Storage Options[重点] 1.Shared Preferences Store private primitive data in key ...
- Android开发重点难点:RelativeLayout(相对布局)详解
https://i.cnblogs.com/EditPosts.aspx?opt=1 重点知识 和线性布局(LinearLayout)一样,RelaiveLayout相对布局也是我们用的比较多的一个布 ...
- JQuery 判断IPad、IPhone、Android是横屏还是竖屏(Window.Orientation实现)
在ipad.iphone网页开发中,我们很可能需要判断是横屏或者竖屏.下面就来介绍如何用 jQuery 判断iPad.iPhone.Android是横屏还是竖屏的方法. 代码如下: function ...
随机推荐
- java带jar编译与运行
javac -classpath ./wxpay-sdk-0.0.3.jar HttpsTest2.java java -cp .:./wxpay-sdk-0.0.3.jar HttpsTest2
- P1624 单词缩写
P1624 单词缩写 题目描述 树树发现好多计算机中的单词都是缩写,如GDB是全称Gnu DeBug的缩写.但是,有时候缩写对应的全称会不固定,如缩写LINUX可以理解为: (1) LINus’s U ...
- CodeForces-1244C-The Football Season-思维
The football season has just ended in Berland. According to the rules of Berland football, each matc ...
- <router-link :to="...">
一.<router-link :to="..."> to里的值可以是一个字符串路径,或者一个描述地址的对象.例如: // 字符串<router-link to=& ...
- 干货:Java技术栈18年02月精彩好文汇总
一晃眼,一个月过去了,新年也过完了. 一晃眼,又老了一岁了,感觉新的一年压力更大了. 我们也该为这一个月的技术做做汇总了,错过的同学正好可以统一回顾看看,已经看过的同学也可以再温习一下.. Java技 ...
- Day9 - 异步IO\数据库\队列\缓存
本节内容 Gevent协程 Select\Poll\Epoll异步IO与事件驱动 Python连接Mysql数据库操作 RabbitMQ队列 Redis\Memcached缓存 Paramiko SS ...
- hadoop系列(一)window10下hadoop安装
风闻win10不需要cygwin就能用hadoop了,赶紧试试. 去官网下载hadoop-2.8.3,然后去 https://github.com/steveloughran/winutils 下载h ...
- JS对象 JavaScript 中的所有事物都是对象,如:字符串、数值、数组、函数等,每个对象带有属性和方法。
什么是对象 JavaScript 中的所有事物都是对象,如:字符串.数值.数组.函数等,每个对象带有属性和方法. 对象的属性:反映该对象某些特定的性质的,如:字符串的长度.图像的长宽等: 对象的方法: ...
- QT之发布
https://blog.csdn.net/qq_40194498/article/details/79926054打开windows控制台直接输入 windeployqt --help 可以知道想要 ...
- 查看ubuntu系统的版本信息
显示如下 Linux version 4.10.0-28-generic (buildd@lgw01-12) linux内核版本号 gcc version 5.4.0 20160609 gcc编译器版 ...