package com.youku.player.util;
|
|
|
import android.app.Activity;
|
import android.hardware.SensorManager;
|
import android.view.OrientationEventListener;
|
/**
|
* 播放器横竖屏翻转 传感器 代替系统sensor
|
* @author hail_lelouch
|
*
|
*/
|
public class DeviceOrientationHelper extends OrientationEventListener{
|
|
private OrientationChangeCallback callback;
|
private DeviceOrientation localOrientation = DeviceOrientation.UNKONWN;
|
|
//判断是否为用户点击放大缩小按钮 竖屏点击放大时判断
|
public boolean fromUser = false;
|
|
private boolean fromComplete = false;
|
|
//设备方向
|
public static enum DeviceOrientation{
|
|
|
|
|
UNKONWN,
|
|
|
|
// _______
|
// | _____ |
|
// || ||
|
UPRIGHT, // ||_____||
|
// | |
|
// | |
|
// |_______|
|
|
|
|
// __________________
|
// | __ |
|
LEFTONTOP, // | | | |
|
// | |__| |
|
// |_________________|
|
|
|
|
// _______
|
// | |
|
// | |
|
BOTTOMUP, // | _____ |
|
// || ||
|
// ||_____||
|
// |_______|
|
|
|
|
// __________________
|
// | __ |
|
RIGHTONTOP // || | |
|
// ||__| |
|
// |_________________|
|
|
|
|
}
|
|
public DeviceOrientationHelper(Activity ctxt, OrientationChangeCallback callback){
|
|
super(ctxt, SensorManager.SENSOR_DELAY_NORMAL);
|
this.callback = callback;
|
|
}
|
|
private void initLocalOrientation(int orientation) {
|
|
if ((orientation >= 0 && orientation <= 30) || (orientation >= 330 && orientation <= 360)) {
|
|
localOrientation = DeviceOrientation.UPRIGHT;
|
|
} else if ((orientation >= 60) && orientation <= 120) {
|
|
localOrientation = DeviceOrientation.LEFTONTOP;
|
|
} else if (orientation >= 150 && orientation <= 210) {
|
|
localOrientation = DeviceOrientation.BOTTOMUP;
|
|
} else if (orientation >= 240 && orientation <= 300) {
|
|
localOrientation = DeviceOrientation.RIGHTONTOP;
|
|
}
|
}
|
|
@Override
|
public void onOrientationChanged(int orientation) {
|
|
if (localOrientation == DeviceOrientation.UNKONWN) {
|
initLocalOrientation(orientation);
|
}
|
|
if((orientation >= 0 && orientation <= 30) || (orientation >= 330 && orientation <= 360)){
|
|
if(!fromUser && localOrientation != DeviceOrientation.UPRIGHT && (localOrientation == DeviceOrientation.LEFTONTOP || localOrientation == DeviceOrientation.RIGHTONTOP) && !fromComplete){
|
if(callback != null) {
|
callback.land2Port();
|
}
|
}else if(fromUser){
|
fromUser = false;
|
}else if(fromComplete){
|
if(callback != null) {
|
callback.onFullScreenPlayComplete();
|
fromComplete = false;
|
}
|
}
|
localOrientation = DeviceOrientation.UPRIGHT;
|
|
}else if((orientation >= 60) && orientation <= 120){
|
|
if(localOrientation != DeviceOrientation.LEFTONTOP){
|
if(callback != null) {
|
callback.reverseLand();
|
}
|
}
|
|
localOrientation = DeviceOrientation.LEFTONTOP;
|
|
}else if(orientation >= 150 && orientation <= 210){
|
if(localOrientation != DeviceOrientation.BOTTOMUP) {
|
if(callback != null) {
|
callback.reversePort();
|
}
|
}
|
|
localOrientation = DeviceOrientation.BOTTOMUP;
|
|
}else if(orientation >= 240 && orientation <= 300){
|
|
if(!fromUser && localOrientation != DeviceOrientation.RIGHTONTOP && (localOrientation == DeviceOrientation.UPRIGHT || localOrientation == DeviceOrientation.BOTTOMUP)){
|
if(callback != null) {
|
callback.port2Land();
|
}
|
} else if(fromUser) {
|
fromUser = false;
|
}
|
|
localOrientation = DeviceOrientation.RIGHTONTOP;
|
|
}
|
|
}
|
|
public interface OrientationChangeCallback{
|
|
public void land2Port();
|
|
public void port2Land();
|
|
//点击放大按钮后 旋转180%
|
public void reverseLand();
|
|
public void reversePort();
|
|
public void onFullScreenPlayComplete();
|
|
}
|
|
public void enableListener(){
|
|
if(this.canDetectOrientation())
|
this.enable();
|
|
}
|
|
public void disableListener(){
|
|
this.disable();
|
localOrientation = DeviceOrientation.UNKONWN;
|
|
}
|
|
public void isFromUser(){
|
fromUser = true;
|
}
|
|
public void isFromComplete(){
|
fromComplete = true;
|
}
|
|
public DeviceOrientation getLocalOrientation(){
|
|
return localOrientation;
|
|
}
|
|
public void setCallback(OrientationChangeCallback callback) {
|
this.callback = callback;
|
}
|
|
}
|