1在Android设备的横竖屏幕,每一次切换横竖屏其实是在重新创建Activity,Activity会重新走一遍生命周期从onCreate 到 onDestroy
2在Activity类里的变量也会重新创建,这点需要注意!
判断屏幕方向,方式一
判断屏幕是否竖屏
@Override
protected void onCreate(Bundle savedInstanceState) {
superonCreate(savedInstanceState);
setContentView(Rlayoutactivity_test);
if (getResources()getConfiguration()orientation == ConfigurationORIENTATION_PORTRAIT){
Le("触发竖屏");
}
}
判断屏幕是否横屏
@Override
protected void onCreate(Bundle savedInstanceState) {
superonCreate(savedInstanceState);
setContentView(Rlayoutactivity_test);
if (getResources()getConfiguration()orientation == ConfigurationORIENTATION_LANDSCAPE){
Le("触发横屏");
}
}
判断屏幕是否是未知方向
@Override
protected void onCreate(Bundle savedInstanceState) {
superonCreate(savedInstanceState);
setContentView(Rlayoutactivity_test);
if (getResources()getConfiguration()orientation == ConfigurationORIENTATION_UNDEFINED){
Le("未定义方向");
}
}
判断屏幕方向,方式二
这个方式其实是监听activity的配置变化时的回调
在activity里重写onConfigurationChanged方法
@Override
public void onConfigurationChanged(Configuration newConfig) {
Le("newConfigorientation="+newConfigorientation);
if (newConfigorientation == ConfigurationORIENTATION_PORTRAIT){
Le("触发竖屏");
}
if (newConfigorientation == ConfigurationORIENTATION_LANDSCAPE){
Le("触发横屏");
}
superonConfigurationChanged(newConfig);
}
注意!,这个方法没想象这么简单这个方法回调的条件: 这个方法要求,切换横竖屏不在重新创建activity,就是activity不会再次onCreate,才会回调这个方法所以正常情况下,你无法在横竖屏后触发这个回调
为了触发这个回调,我们需要在AndroidManifestxml给目标Activity添加属性 android:configChanges="orientation|screenSize":
<activity android:name="testTestActivity"
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) {
superonCreate(savedInstanceState);
setContentView(Rlayoutactivity_test);
mOrientationEventListener = new OrientationEventListener(this) { @Override
public void onOrientationChanged(int orientation) {
Le("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 (mOrientationEventListenercanDetectOrientation()) {
Logv(TAG, "可以检测方向");
mOrientationEventListenerenable();//开启
} else {
Logv(TAG, "无法检测方向");
mOrientationEventListenerdisable();
}
}
@Override
protected void onDestroy() {
superonDestroy();
mOrientationEventListenerdisable();//注销
}
最后注意,在退出时需要注销关闭监听
另外还有一个更合适在方向监听上使用的,配置参数 SensorManagerSENSOR_DELAY_NORMAL:
mOrientationEventListener = new OrientationEventListener(this, SensorManagerSENSOR_DELAY_NORMAL) { //
@Override
public void onOrientationChanged(int orientation) {
Le("onOrientationChanged: " + orientation);
}
};
SensorManagerSENSOR_DELAY_NORMAL 的意思是,让传感器延迟,更适合在方向的监听使用所以如果你只需要方向上面的监听推荐添加这个参数创建OrientationEventListener
这样设置延迟的好处是排除一些中间的波动值,返回的值会更加稳定,这样你可以在判断方向时,不会出现在边界值上反反复复切来切去的问题
设置当前屏幕方向
在activity里写以下任意一个属性
setRequestedOrientation(ActivityInfoSCREEN_ORIENTATION_LANDSCAPE);//设置屏幕为横屏, 设置后会锁定方向
setRequestedOrientation(ActivityInfoSCREEN_ORIENTATION_PORTRAIT);//设置屏幕为竖屏, 设置后会锁定方向
setRequestedOrientation(ActivityInfoSCREEN_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、ios实现监听的方法,也不用去解决竖屏锁定后仍然能回调的问题。
本插件实现的功能:
在手机开启允许屏幕旋转、或者关闭竖屏锁定的情况下,可以实时的监听用户旋转手机的动作,获取当前屏幕的朝向:上下左右。
Android屏幕旋转使用传感器+读取系统是否允许旋转的配置实现监听。
IOS使用UIDeviceOrientationDidChangeNotification通知进行监听。
不多说了,github地址:
>
1常规的显示为HVGA-P(port),即分辨率为320x480如果使用横屏(land)。如果模拟器尚未启动,可以在Eclipse的项目Runas=>OpenRunDialog对话框中设置,如果android模拟器已经启动后,可以使用快捷键F12或CtrlF11来切换。当然是用命令行仅仅启动模拟器可以使用参数emulatorexe-skinHVGA-L来启动。
2需要注意的是,切换land或port可以通过资源文件来让界面自适应窗体,但程序可能会重载onCreate,避免的方法可以通过在xml文件中重新定义方向,以及根据Activity的重写(newConfig)方法来控制,相关的可以在AndroidSDK中获取到。
以上就是关于安卓导航竖屏和横屏接口定义相同吗全部的内容,包括:安卓导航竖屏和横屏接口定义相同吗、Flutter 真正可以监听屏幕旋转的插件、安卓SDK模拟器怎样横屏_安卓怎么横屏等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)