横竖屏切换问题(不使用onConfigurationChanged)
2014-03-05 12:23
405 查看
有这样个需求:要求父Activity横屏(或竖屏),但在弹出的窗口(例如系统配置项)能根据用户的当前手机状态(横屏或者竖屏)进行横竖屏切换
方案1:使用Dialog样式的Activity进行弹窗,然后在子窗口使用onConfigurationChanged进行判断横竖屏。这个方案的问题在于:当你根据用户手机的当前状态(横屏或者竖屏)对弹出的窗口进行横竖屏切换时,你会发现父Activity(已强制横屏或强制竖屏)也会跟着改变!所以此方案不能解决需求。
方案2:使用popupwindows进行弹窗,然后使用传感器(方向传感器 或者 重力传感器)进行判断。该方案的不足之处是,如果你的判断取值不够精确的话,窗口会在横屏和竖屏之间来一直回切换,就是会抖动得很厉害。经过网上查找资料,根本解决方案就是使用android源码内的横竖屏判断方法。整理后的代码如下:
方案1:使用Dialog样式的Activity进行弹窗,然后在子窗口使用onConfigurationChanged进行判断横竖屏。这个方案的问题在于:当你根据用户手机的当前状态(横屏或者竖屏)对弹出的窗口进行横竖屏切换时,你会发现父Activity(已强制横屏或强制竖屏)也会跟着改变!所以此方案不能解决需求。
方案2:使用popupwindows进行弹窗,然后使用传感器(方向传感器 或者 重力传感器)进行判断。该方案的不足之处是,如果你的判断取值不够精确的话,窗口会在横屏和竖屏之间来一直回切换,就是会抖动得很厉害。经过网上查找资料,根本解决方案就是使用android源码内的横竖屏判断方法。整理后的代码如下:
int orientation; /** * 横竖屏切换 */ private SensorEventListener mLsnSensorEvent = new SensorEventListener() { @Override public void onSensorChanged(SensorEvent event) {//横屏 if(mFlashOption.isShowing()){ float[] values = event.values; float X = -values[0]; float Y = -values[1]; float Z = -values[2]; float magnitude = X*X + Y*Y; 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 while (orientation >= 360) { orientation -= 360; } while (orientation < 0) { orientation += 360; } } if(dirtChange!=null){ dirtChange.obtainMessage(888, orientation, 0).sendToTarget(); } } } @Override public void onAccuracyChanged(Sensor sensor, int accuracy) { } }; private boolean isHorizontal=true; private boolean isVertical=false; private Handler dirtChange=new Handler(){ public void handleMessage(android.os.Message msg) { if (msg.what==888) { int orientation = msg.arg1; if (orientation>45&&orientation<135) { //setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_REVERSE_LANDSCAPE); //setRequestedOrientation(8); }else if (orientation>135&&orientation<225){ //activity.setRequestedOrientation(9); }else if (orientation>225&&orientation<315){//横屏 changeType=0; //Log.v("屏幕切换", "横屏"); isVertical=false; //activity.setRequestedOrientation(0); }else if ((orientation>315&&orientation<360)||(orientation>0&&orientation<45)){//竖屏 //activity.setRequestedOrientation(1); changeType=1; isHorizontal=false; //Log.v("屏幕切换", "竖屏"); } if(changeType==0&&!isHorizontal){ mFlashItemHorizontal(); isHorizontal=true; } if(changeType==1&&!isVertical){ mFlashItemVertical(); isVertical=true; } } }; };
相关文章推荐
- 针对横竖屏切换没有调用onConfigurationChanged方法
- Android 禁止横竖屏切换,onConfigurationChanged的作用
- android转屏,切换屏幕,横竖屏(onConfigurationChanged)会重新加载 OnCreate 的解决方案
- android转屏,切换屏幕,横竖屏(onConfigurationChanged)会重新加载 OnCreate 的解决方案
- android 4.0以上横竖屏切换不销毁activity,只调用onConfigurationChanged
- android 横竖屏切换令人费解的地方(横屏切换竖屏调用两次onConfigurationChanged)及其个人看法
- android转屏,切换屏幕,横竖屏(onConfigurationChanged)会重新加载 OnCreate 的解决方案
- Android 3.2 以上转屏,切换屏幕,横竖屏(onConfigurationChanged)会重新 OnCreate 的解决方案
- android转屏,切换屏幕,横竖屏(onConfigurationChanged)会重新 OnCreate 的解决方案
- android 4.0以上横竖屏切换不销毁activity,不重新走生命周期,只调用onConfigurationChanged
- Android中横竖屏切换时,onConfigurationChanged方法不被调用
- android转屏,切换屏幕,横竖屏(onConfigurationChanged)会重新 OnCreate 的解决方案
- android4.0 横竖屏切换执行不到onConfigurationChanged
- onConfigurationChanged的使用
- onConfigurationChanged使用的几点总结
- 关于android旋转屏幕时activity重建和android 转屏 onConfigurationChanged 不会执行的问题
- 安卓开发中,小知识点:onConfigurationChanged方法未调用,onMeasure的使用
- 使用RadioGroup 的时候出现onCheckChanged() 执行了三次的问题和App重启页面重叠现象
- Android 屏幕切换和onConfigurationChanged不调用的原因
- Android 强制横屏或竖屏注意事项及onConfigurationChanged的使用