【默认的角度】
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度生效
....
原文:http://bbs.16rd.com/thread-55000-1-138.html