之前 , 只是介绍了一些代码去实现视频播放的平复翻转这一功能!可以随你意进行屏幕的翻转,满足用户的需求。但是,当你真的去做一个像的时候,会有问题出现的哦!那到底是什么问题呢?待我。。娓娓道来!
是酱汁的,我在使用视频播放的时候会有点击屏幕切换的按钮来进行屏幕横竖屏的切换播放,当然我还有使用翻转屏幕通过感重力来自动的切换屏幕的横竖屏。那么,问题就出现了,点击按钮和感重力~~~会出现冲突!而冲突是这样子的:当前我将手机处于横屏(竖屏),然后此时的我想通过点击按钮来切换屏幕的方向。那么,你会遇到 我点击按钮来切换屏幕不起作用了!!!原因是,手机处于横屏的时候,此时的感重力命令是一直让手机处于横屏的,虽然你有通过点击按钮切换屏幕方向的命令。但是,感重力命令一直在执行并掩盖了按钮的命令。使的按钮的操作没什么用了。
/** OrientationSensorListener.java 类中 */ public void onSensorChanged(SensorEvent event) { float[] values = event.values; int orientation = 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 OneEightyOverPi = 57.29577957855f; float angle = (float)Math.atan2(-Y, X) * OneEightyOverPi; orientation = 90 - (int)Math.round(angle); // normalize to 0 - 359 range if (orientation >= 360) { orientation -= 360; } if (orientation < 0) { orientation += 360; } } if(isClickFullScreenButton){ //竖屏 if(isLandscape && (((orientation > 315 && orientation <= 360) || (orientation >= 0 && orientation <= 45)) || (orientation > 135 && orientation <= 225)) ){ isLandscape = false; isClickFullScreenButton = false; isSennor = true; } //横屏 if(!isLandscape && ((orientation > 45 && orientation <= 135) || (orientation > 225 && orientation <= 315))){ isLandscape = true; isClickFullScreenButton = false; isSennor = true; } } if(!isSennor){//判断是否要进行中断信息传递 return ; } if (rotateHandler!=null) { rotateHandler.obtainMessage(888, orientation, 0).sendToTarget(); } } /** 点击屏幕切换按钮的时候 同时调用该方法 : 中断Handler信息传递 */ public void setIsSennor(){ isSennor = false; } /** 点击屏幕切换按钮的时候 同时调用该方法 : 确认此时屏幕的方向 */ public void setIsLandscape(boolean bool){ isLandscape = bool; } /** 点击屏幕切换按钮的时候 同时调用该方法 :设置按钮是否已被点击 */ public void setButtonFullScreenClicked(){ isClickFullScreenButton = true; }
那么,我们就这么来解决(思路):
感重力当被注册过之后,感重力的方法就会一直监听着并传递信息释放命令。其实就像是人体神经通过神经中枢来进行传递信息一样传递信息释放命令。那么,我们就下点药中断信息的传输并在此做点手脚就好了。
第一步:当你点击切换按钮的时候,发布信息到感重力说,此时你要中断信息的传输。
第二步:当你点击切换按钮的时候,发布信息到感重力说,我已经点击了屏幕的切换按钮。
第三步:当你点击切换按钮的时候,进行了第一步之后,还要告诉感重力说,此时屏幕所处于的状态:横屏或竖屏状态。
然后,由上面的代码来看。按照代码的读取方向讲,在onSensorChanged方法中。当用户点击按钮来切换了屏幕,而没有翻转屏幕的时候,程序读到 if(!isSennor) 的时候就会中断!感重力不起作用并完全由按钮的命令来控制屏幕翻转。而当用户翻转过来屏幕之后,程序一直进行读下去不会被中断并实现感重力的被激活。代码中当遇到 boolean变量(isClickFullScreenButton)时候继续向其方法中走读。然后会看到两个判断分别是横屏和竖屏状态,这个是按钮被点击时候的屏幕状态,假设是横屏。(此时用户翻转了屏幕)这时候就会设置状态值,因此也就激活了感重力(isSennor)使得程序会一直保持信息的传递,即是激活了感重力切换屏幕功能。
从而实现了,假设~横屏~状态下:用户通过点击按钮能够切换屏幕的竖屏状态,并一直保持下去。直到用户翻转屏幕到竖屏,并由此激活了感重力状态。由此用户又能够随意通过感重力翻转屏幕来切换横竖屏!
原文地址:http://blog.csdn.net/junhuahouse/article/details/42025303