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

  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开发 设备横屏与竖屏的详解的更多相关文章

  1. Android强制设置横屏或竖屏

    全屏 在Activity的onCreate方法中的setContentView(myview)调用之前添加下面代码 requestWindowFeature(Window.FEATURE_NO_TIT ...

  2. 05 Android强制设置横屏或竖屏/全屏

    全屏 在Activity的onCreate方法中的setContentView(myview)调用之前添加下面代码 requestWindowFeature(Window.FEATURE_NO_TIT ...

  3. (转)Android强制设置横屏或竖屏

    全屏 在Activity的onCreate方法中的setContentView(myview)调用之前添加下面代码 requestWindowFeature(Window.FEATURE_NO_TIT ...

  4. Android 强制设置横屏或竖屏 设置全屏

    (转自:http://blog.csdn.net/yuejingjiahong/article/details/6636981) 强制横屏: @Override protected void onRe ...

  5. 整理最全的Android开发工程师面试题,面试题详解。java、Android程序员

    1.    请描述下Activity的生命周期. 必调用的三个方法:onCreate()--> onStart() --> onResume(),用AAA表示 (1)父Activity启动 ...

  6. Android 开发权限设置中英对照说明详解

    android.permission.ACCESS_CHECKIN_PROPERTIES 允许读写访问 "properties"表在checkin数据库中,改值可以修改上传( Al ...

  7. Android开发之数据存储——SharedPreferences基础知识详解,饿补学会基本知识,开发者必会它的用法。

    一.数据存储选项:Data Storage --Storage Options[重点] 1.Shared Preferences Store private primitive data in key ...

  8. Android开发重点难点:RelativeLayout(相对布局)详解

    https://i.cnblogs.com/EditPosts.aspx?opt=1 重点知识 和线性布局(LinearLayout)一样,RelaiveLayout相对布局也是我们用的比较多的一个布 ...

  9. JQuery 判断IPad、IPhone、Android是横屏还是竖屏(Window.Orientation实现)

    在ipad.iphone网页开发中,我们很可能需要判断是横屏或者竖屏.下面就来介绍如何用 jQuery 判断iPad.iPhone.Android是横屏还是竖屏的方法. 代码如下: function ...

随机推荐

  1. Git 远程仓库分支管理

    目录 目录 速查表 关联远程代码仓库 克隆远程仓库 分支管理 创建分支 切换分支 合并分支 删除分支 解决冲突 速查表 指令 作用 git branch 查看分支 git branch newBran ...

  2. ASP.NET MVC Controller激活系统详解2

    一.引言 此篇博文紧接上篇博文进行阐述,本篇博文阐述的主题是Controller激活和url路由 二.总述 ASP.NET路由系统是HTTP请求抵达服务端的第一道屏障,它根据注册的路由规则对拦截的请求 ...

  3. taskFactory

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...

  4. 2019 牛客多校第一场 F Random Point in Triangle

    题目链接:https://ac.nowcoder.com/acm/contest/881/F 题目大意 给定二维平面上 3 个整数表示的点 A,B,C,在三角形 ABC 内随机选一点 P,求期望$E ...

  5. Codeforces 1176A Divide it!

    题目链接:http://codeforces.com/problemset/problem/1176/A 思路:贪心,对第二个操作进行俩次等于将n变成n/3,第三个操作同理,我们将n不断除以2,再除以 ...

  6. CVE-2017-3248简单复现

    我是这样操作的 目标跟windows在一个段,linux是另一个段的,我的虚拟机 windows主机上 `java -cp ysoserial.jar ysoserial.exploit.JRMPLi ...

  7. <pygame> 打飞机(小游戏)

    0.游戏的基本实现 ''' 游戏的基本实现 游戏的初始化:设置游戏窗口,绘制图像的初始位置,设定游戏时钟 游戏循环:设置刷新频率,检测用户交互,更新所有图像位置,更新屏幕显示 ''' 1.安装pyga ...

  8. uoj#209【UER #6】票数统计

    题目 做UER的A题涨信心 首先我们注意到这个所谓的至少有一条正确在\(x\)和\(y\)不相等的时候非常弱,当\(x<y\)时,只有可能是后\(y\)位用户有\(x\)个通过:当\(x> ...

  9. dubbo视频分享

    一.基础篇 第001节--课程介绍 第01节--使用Dubbo对传统工程进行服务化改造的思路介绍 第02节--使用Dubbo对传统工程进行服务化改造 第03节--ZooKeeper注册中心安装 第04 ...

  10. 2019-8-31-dotnet-非泛型-类型-System.Collections.IEnumerable-不能与类型实参一起使用

    title author date CreateTime categories dotnet 非泛型 类型 System.Collections.IEnumerable 不能与类型实参一起使用 lin ...