jasmine1

Android4.0 ICS怎么修改屏幕自动旋转的角度临界值

0
阅读(1022)

【默认的角度】

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;

}

来源:一牛网论坛