package com.yhy.myapplication22;
import android.app.Activity;
import android.content.Context;
import android.content.pm.ActivityInfo;
import android.util.Log;
import android.view.OrientationEventListener;
/**
* Created by ${yinhaiyang} on 2018/4/3.
* android的屏幕旋转只能一次旋转90度,如果你突然一下子旋转180度,
* onConfigurationChanged函数不会被调用。
* 所以此时可以通过调用这个监听方法实现
*/
public class MyOrientationDetector extends OrientationEventListener {
MyOrientationDetector detector;
Activity mContext;
int rate;
public MyOrientationDetector(Context context) {
super(context);
this.mContext = (Activity) context;
}
public MyOrientationDetector(Context context, int rate) {
super(context, rate);
this.mContext = (Activity) context;
this.rate = rate;
}
@Override
public void onOrientationChanged(int orientation) {
Log.i("MyOrientationDetector ", "onOrientationChanged:" + orientation);
final int rotation = mContext.getWindowManager().getDefaultDisplay().getOrientation();
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 (orientation == 0)
{
mContext.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);//横向
} else if (orientation == 90)
{
mContext.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_REVERSE_LANDSCAPE);//希望Activity在横向屏幕上显示,但与正常的横向屏幕方向相反。
} else if (orientation == 180)
{
mContext.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_REVERSE_LANDSCAPE);//希望Activity在横向屏幕上显示,但与正常的横向屏幕方向相反。
} else if (orientation == 270)
{
mContext.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);//横向
}
}
}
注:其他调用的方法参考上篇文章《AndroidPad设置只支持三个方向旋转(正方向竖屏0度方向,90度和270度横屏方向)》地址:点击打开链接
screenOrientation的属性值必须是以下常量值。
1 ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED:// 不指定方向,让系统决定Activity的最佳方向。
2 ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE://希望Activity在横向屏上显示,也就是说横向的宽度要大于纵向的高度,并且忽略方向传感器的影响。
3 ActivityInfo.SCREEN_ORIENTATION_PORTRAIT:// 希望Activity在纵向屏上显示,也就是说纵向的高度要大于横向的宽度,并且忽略方向传感器的影响。
4 ActivityInfo.SCREEN_ORIENTATION_USER://使用用户设备的当前首选方向。
5 ActivityInfo.SCREEN_ORIENTATION_BEHIND://始终保持与屏幕一致的方向,不管这个Activity在前台还是后台。
6. ActivityInfo.SCREEN_ORIENTATION_SENSOR:.//Activity的方向由物理方向传感器来决定,按照用户旋转设备的方向来显示。
7 ActivityInfo.SCREEN_ORIENTATION_NOSENSOR:.//始终忽略方向传感器的判断,当用户旋转设备时,显示不跟着旋转。
8 ActivityInfo.SCREEN_ORIENTATION_SENSOR_LANDSCAPE://希望Activity在横向屏幕上显示,但是可以根据方向传感器指示的方向来进行改变。
9 ActivityInfo.SCREEN_ORIENTATION_SENSOR_PORTRAIT://希望Activity在纵向屏幕上显示,但是可以根据方向传感器指示的方向来进行改变。
10 ActivityInfo.SCREEN_ORIENTATION_REVERSE_LANDSCAPE://希望Activity在横向屏幕上显示,但与正常的横向屏幕方向相反。
11 ActivityInfo.SCREEN_ORIENTATION_REVERSE_PORTRAIT:// 希望Activity在纵向屏幕上显示,但与正常的纵向屏幕方向相反
12 ActivityInfo.SCREEN_ORIENTATION_FULL_SENSOR: //Activity的方向由方向传感器来决定,显示会根据用户设备的移动情况来旋转。