Android用重力传感器做横竖屏切换 -电脑资料

电脑资料 时间:2019-01-01 我要投稿
【www.unjs.com - 电脑资料】

    在播放视频的时候,可能要做横竖屏的切换,但是,用户可以设置自己的手机关掉屏幕旋转,这个时候就需要想其他的办法了,比如:重力传感器,

Android用重力传感器做横竖屏切换

public class ScreenSwitchUtils {		private static final String TAG = ScreenSwitchUtils.class.getSimpleName();		private volatile static ScreenSwitchUtils mInstance;		private Activity mActivity;		// 是否是竖屏	private boolean isPortrait = true;		private SensorManager sm;	private OrientationSensorListener listener;	private Sensor sensor;	private SensorManager sm1;	private Sensor sensor1;	private OrientationSensorListener1 listener1;		private Handler mHandler = new Handler() {		public void handleMessage(Message msg) {			switch (msg.what) {			case 888:				int rientation = msg.arg1;				if (orientation > 45 && orientation < 135) {				} else if (orientation > 135 && orientation < 225) {				} else if (orientation > 225 && orientation < 315) {					if (isPortrait) {						Log.e(test, 切换成横屏);						mActivity.setRequestedOrientation(0);						isPortrait = false;					}				} else if ((orientation > 315 && orientation < 360) || (orientation > 0 && orientation < 45)) {					if (!isPortrait) {						Log.e(test,切换成竖屏);						mActivity.setRequestedOrientation(1);						isPortrait = true;					}				}				break;			default:				break;			}		};	};		/** 返回ScreenSwitchUtils单例 **/    public static ScreenSwitchUtils init(Context context) {        if (mInstance == null) {            synchronized (ScreenSwitchUtils.class) {                if (mInstance == null) {                    mInstance = new ScreenSwitchUtils(context);                }            }        }        return mInstance;    }    private ScreenSwitchUtils(Context context) {        Log.d(TAG, init orientation listener.);        // 注册重力感应器,监听屏幕旋转        sm = (SensorManager) context.getSystemService(Context.SENSOR_SERVICE);        sensor = sm.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);        listener = new OrientationSensorListener(mHandler);        // 根据 旋转之后/点击全屏之后 两者方向一致,激活sm.        sm1 = (SensorManager) context.getSystemService(Context.SENSOR_SERVICE);        sensor1 = sm1.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);        listener1 = new OrientationSensorListener1();    }        /** 开始监听 */    public void start(Activity activity) {    	Log.d(TAG, start orientation listener.);        mActivity = activity;        sm.registerListener(listener, sensor, SensorManager.SENSOR_DELAY_UI);    }    /** 停止监听 */    public void stop() {    	Log.d(TAG, stop orientation listener.);    	sm.unregisterListener(listener);		sm1.unregisterListener(listener1);    }        /**     * 手动横竖屏切换方向     */    public void toggleScreen() {		sm.unregisterListener(listener);		sm1.registerListener(listener1, sensor1,SensorManager.SENSOR_DELAY_UI);		if (isPortrait) {			isPortrait = false;			// 切换成横屏			mActivity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);		} else {			isPortrait = true;			// 切换成竖屏			mActivity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);		}	}        public boolean isPortrait(){    	return this.isPortrait;    }        /**	 * 重力感应监听者	 */	public class OrientationSensorListener implements SensorEventListener {		private static final int _DATA_X = 0;		private static final int _DATA_Y = 1;		private static final int _DATA_Z = 2;		public static final int ORIENTATION_UNKNOWN = -1;		private Handler rotateHandler;		public OrientationSensorListener(Handler handler) {			rotateHandler = handler;		}		public void onAccuracyChanged(Sensor arg0, int arg1) {		}		public void onSensorChanged(SensorEvent event) {			float[] values = event.values;			int rientation = ORIENTATION_UNKNOWN;			float X = -values[_DATA_X];			float Y = -values[_DATA_Y];			float Z = -values[_DATA_Z];			float magnitude = X * X + Y * Y;			// Don't trust the angle if the magnitude is small compared to the y			// value			if (magnitude * 4 >= Z * Z) {				// 屏幕旋转时				float neEightyOverPi = 57.29577957855f;				float angle = (float) Math.atan2(-Y, X) * OneEightyOverPi;				rientation = 90 - (int) Math.round(angle);				// normalize to 0 - 359 range				while (orientation >= 360) {					orientation -= 360;				}				while (orientation < 0) {					orientation += 360;				}			}			if (rotateHandler != null) {				rotateHandler.obtainMessage(888, orientation, 0).sendToTarget();			}		}	}	public class OrientationSensorListener1 implements SensorEventListener {		private static final int _DATA_X = 0;		private static final int _DATA_Y = 1;		private static final int _DATA_Z = 2;		public static final int ORIENTATION_UNKNOWN = -1;		public OrientationSensorListener1() {		}		public void onAccuracyChanged(Sensor arg0, int arg1) {		}		public void onSensorChanged(SensorEvent event) {			float[] values = event.values;			int rientation = ORIENTATION_UNKNOWN;			float X = -values[_DATA_X];			float Y = -values[_DATA_Y];			float Z = -values[_DATA_Z];			float magnitude = X * X + Y * Y;			// Don't trust the angle if the magnitude is small compared to the y			// value			if (magnitude * 4 >= Z * Z) {				// 屏幕旋转时				float neEightyOverPi = 57.29577957855f;				float angle = (float) Math.atan2(-Y, X) * OneEightyOverPi;				rientation = 90 - (int) Math.round(angle);				// normalize to 0 - 359 range				while (orientation >= 360) {					orientation -= 360;				}				while (orientation < 0) {					orientation += 360;				}			}			if (orientation > 225 && orientation < 315) {// 检测到当前实际是横屏				if (!isPortrait) {					sm.registerListener(listener, sensor,SensorManager.SENSOR_DELAY_UI);					sm1.unregisterListener(listener1);				}			} else if ((orientation > 315 && orientation < 360) || (orientation > 0 && orientation < 45)) {// 检测到当前实际是竖屏				if (isPortrait) {					sm.registerListener(listener, sensor,SensorManager.SENSOR_DELAY_UI);					sm1.unregisterListener(listener1);				}			}		}	}}

    转载请标明出处:http://blog.csdn.net/goldenfish1919/article/details/47423131

    使用的时候:

public class MainActivity extends Activity implements OnClickListener {	private ScreenSwitchUtils instance;	@Override	protected void onCreate(Bundle savedInstanceState) {		super.onCreate(savedInstanceState);		instance = ScreenSwitchUtils.init(this.getApplicationContext());	}	@Override	protected void onStart() {		super.onStart();		instance.start(this);	}	@Override	protected void onStop() {		super.onStop();		instance.stop();	}	@SuppressLint(NewApi)	@Override	public void onConfigurationChanged(Configuration newConfig) {		super.onConfigurationChanged(newConfig);		Log.e(test, onConfigurationChanged);		if (instance.isPortrait()) {			// 切换成竖屏			LayoutParams params1 = new RelativeLayout.LayoutParams(screenWidth, DensityUtil.dip2px(this, 160));			videoView.setLayoutParams(params1);			Toast.makeText(getApplicationContext(), 竖屏, 0).show();			Log.e(test, 竖屏);		} else {			// 切换成横屏			LayoutParams params1 = new RelativeLayout.LayoutParams(screenHeight, screenWidth);			videoView.setLayoutParams(params1);			Toast.makeText(getApplicationContext(), 横屏, 0).show();			Log.e(test, 横屏);		}	}	@Override	public void onClick(View arg0) {		switch (arg0.getId()) {		case R.id.iv_stretch:			instance.toggleScreen();			break;		}	}}

    调用了activity.setRequestedOrientation()以后,会触发activity.onConfigurationChanged();可以在这里面重新设置播放界面的大小,

电脑资料

Android用重力传感器做横竖屏切换》(https://www.unjs.com)。

最新文章