【默认的角度】
ICS对原本GB坐标矩阵换算的计算方式做了简化,简单地将360度平均划分为四个方向区间:
区间0:[315,45) // 上
区间1:[45,135) // 右
区间2:[135,225) // 左
区间3:[225,315) // 下
区间的转换通过一个很简单的语句:
windowOrientationListener.java的onsensorChanged函数中,
int nearestRotation = (orientationAngle + 45) / 90;
但是这并不意味着在45度时屏幕就会旋转,为了防止在临界值附近来回摆动,ICS中还定义了一个
gap区域;
顾名思义,在这个gap区域内,不会发生旋转;gap区域在两个相邻方向区间的中间;
windowOrientationListener.java中有个全局变量定义了gap区的大小,
ADJACENT_ORIENTATION_ANGLE_GAP,默认值是45,
通过函数isOrientationAngleAcceptable来控制gap区的作用;
所以真正的默认旋转角度临界值是45 + GAP/2 = 45 + 45/2 = 67.5度
【修改默认角度临界值的例子】
1. 如果要修改成在超过45度的角度旋转,并且横竖屏切换角度一致,就比较简单
比如要在60度旋转,那么只需要计算GAP = (60-45)*2 = 30
将ADJACENT_ORIENTATION_ANGLE_GAP改成30
2. 其他情况根据需求会比较复杂,需要重新划分方向区间
需求不同,很难一概而论,但是重新划分区间是一定要做的,
比如需求是垂直转水平临界值是60度,水平转垂直是45度,
那么需要做两个修改:
(1)这个需求实际上已经定义了天然的gap区域,我们不需要ICS本身提供的gap机制,
将isOrientationAngleAcceptable直接返回true;
(2)修改方向区间,
将int nearestRotation = (orientationAngle + 45) / 90改成:
switch (mOrientationListener.mCurrentRotation)
{
// 原来是竖直,旋转60度生效
case 0:
case 2:
{
if( 60 <= orientationAngle && orientationAngle < 135)
nearestRotation = 1;
else if( 135 <= orientationAngle && orientationAngle < 225)
nearestRotation = 2;
else if( 225 <= orientationAngle && orientationAngle < 300)
nearestRotation = 3;
else
nearestRotation = 0;
break;
}
// 原来是水平,旋转45度生效
case 1:
case 3:
{
if( 45 <= orientationAngle && orientationAngle < 135)
nearestRotation = 1;
else if( 135 <= orientationAngle && orientationAngle< 225)
nearestRotation = 2;
else if( 225 <= orientationAngle && orientationAngle< 315)
nearestRotation = 3;
else
nearestRotation = 0;
break;
}
default:
break;
}
来源:一牛网论坛