android中有很多未知的“路”,只有走好每一步,才有可能找到捷径!!!
1.获取屏幕大小
/** * 获取手机屏幕 * * @return String */ public String getScreenSize() { WindowManager wManager = this.getWindowManager(); Display display = wManager.getDefaultDisplay(); int screenHeight = display.getHeight(); int screenWidth = display.getWidth(); return screenWidth + "*" + screenHeight; }
还有一种方法,可以获取屏幕大小(像素),如下:
/** * 获取手机屏幕 * * @return String */ public String getScreenSize() { DisplayMetrics dm = new DisplayMetrics(); this.getWindowManager().getDefaultDisplay().getMetrics(dm); int screenHeight = dm.heightPixels; int screenWidth = dm.widthPixels; return screenHeight + "*" + screenWidth; }
2.改变屏幕方向
android手机在改变屏幕方向(横屏与竖屏互相切换)的时候,会多次调用onCreate()方法,以及onPause()、onStop()、onDestroy()方法,然后重新调用onCreate()、onStart()、onResume()方法使该activity重新展现在我们面前。
利用这种特性可以实现某些特殊的效果,但是在大多数情况下,我们还是想让它只调用一次onCreate()方法。因为onCreate()方法一般用来做一些初始化的工作,毕竟没有多少人希望初始化工作会一次又一次的进行着。特别是你的app有多个activity,如果在改变屏幕方向(横屏与竖屏互相切换)的时候onCreate()方法总是在调用,那么这可能就是一场噩梦!!下面介绍改变这中现状的方法。主要两个步骤!!
<1> 修改manifest.xml文件
添加如下代码,即可
android:configChanges="keyboardHidden|orientation|navigation|keyboard|"
完整示例如下:
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="test.test" android:versionCode="1" android:versionName="1.0"> <uses-sdk android:minSdkVersion="7" /> <application android:icon="@drawable/icon" android:label="@string/app_name"> <activity android:name=".MasterActivity" android:label="@string/app_name" android:configChanges="keyboardHidden|orientation|navigation|keyboard"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> </manifest>
这样,切换屏幕时就不会多次调用onCreate()方法,从而不会影响activity生命周期。那么,既然不会多次调用onCreate()方法,系统又是调用哪个方法呢?接着看.....
<2>覆写Activity的onConfigurationChanged()方法
如果你想在屏幕方向改变时,做一些操作必须覆写onConfigurationChanged()方法。在该方法中我们可以添加自己的代码,主要有两中写法,如下:
@Override public void onConfigurationChanged(Configuration newConfig) { // 必须写,否则报异常 super.onConfigurationChanged(newConfig); Log.d(TAG, "onConfigurationChanged() is invoked!"); if(newConfig.orientation == Configuration.ORIENTATION_PORTRAIT) { Log.d(TAG, "竖屏"); } else if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) { Log.d(TAG, "横屏"); } }
或者:
@Override public void onConfigurationChanged(Configuration newConfig) { // 必须写,否则报异常 super.onConfigurationChanged(newConfig); Log.d(TAG, "onConfigurationChanged() is invoked!"); if(getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT) { Log.d(TAG, "竖屏"); } else if(getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE) { Log.d(TAG, "横屏"); } }
这两种方式,打印结果:
onConfigurationChanged() is invoked! 横屏 onConfigurationChanged() is invoked! 横屏 onConfigurationChanged() is invoked! 竖屏
但是这是在模拟器上面测试的结果,在真机上测试结果不一样。
还有一点需要注意:super.onConfigurationChanged(newConfig);必须写,否则报异常!
异常信息:
Activity MasterActivity did not call through to super.onConfigurationChanged()
说明要调用父类Activity的onConfigurationChanged()方法。看一下Activity的onConfigurationChanged()方法源码:
public void onConfigurationChanged(Configuration newConfig) { mCalled = true; if (mWindow != null) { // Pass the configuration changed event to the window mWindow.onConfigurationChanged(newConfig); } }
可以看出,调用了抽象类Window的onConfigurationChanged()方法。看源码如下:
/** * Should be called when the configuration is changed. * * @param newConfig The new configuration. */ public abstract void onConfigurationChanged(Configuration newConfig);
3.固定屏幕方向
从上面我们知道,当改变设备或者模拟器的屏幕方向时,相应的显示模式也将根据变化匹配现有的情况,这样,Activity
根据不同的模式(Portrait和Landscape)重新调整视图的显示方式。如果你想让你的视图一直处于某一个固定方向,可以
在Manifest里为相应的Activity添加Android:screenOrientation属性,并赋予”portrait”或”Landscape”属性。
4.跟Camera有关
使用过android的照相机的api的朋友知道,如果不做处理,画面是不会随着手机的方向变化而变化。
其实改变这种现状也很简单,一句代码的事:
this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
记住:这种方法不会禁止应用程序多次调用onCreate()方法,所以你需要按照上面的方法去禁止这种现象发生,如果你需要的话。
对应的getRequestedOrientation( )方法返回屏幕方向的数据,如果没有指定屏幕方向的话,调用getRequestedOrientation( )
方法会返回-1(SCREEN_ORIENTATION_UNSPECIFIED),表示没有指定。
如果你在manifest.xml或者代码中使用setRequestedOrientation()方法设置了屏幕方向的话,会返回对应数据。
具体参数可以查看ActivityInfo类的常量。