L迁客

技术博客
随笔 - 1, 文章 - 12, 评论 - 1, 引用 - 0
数据加载中……

Android程序对不同手机屏幕分辨率自适应的总结

Android程序对不同手机屏幕分辨率自适应的总结

  各种Android操作系统的手机简直就是琳琅满目,屏幕分辨率的差异可想而知。目前比较主流的有WVGA=800x480HVGA=480x320,另外的还有QVGA=320x240。当然还有魅族M9DVGA=960x640,还有蛋疼的摩托罗拉的FWVGA=854x480

  其实,在你layoutxml文件中,编写的时候是不是用了许多的padding呢?如果是,那你就蛋疼了。因为这样的布局永远是无法适应所有手机屏幕的。

  正确的做法应该是使用的是weight属性。将你控件的layout中的widthheight设置为fill-parent,不要使用wrap——content。因为wrap-content的大小是不固定的。而weight(权重)这个属性很好的解决了这个问题。

  当包裹在控件外面的Layoutwidthheight属性都设置为fill-parent时,可以利用weight的反比特性。即如果控件A设置weight5,控件B设置weight7,那么A所占的空间为5/5+7),B所占的空间为7/5+7)。这样的反比属性对任何分辨率下的手机都是合适的。


  当然,字体就不行了。那怎么保证字体能够跟布局一样能够自适应呢?
  呵呵,很简单,就是在你的res文件夹中创建一个文件夹,叫做values-320x240。其中320x240是你手机屏幕的分辨率,根据你手机屏幕的情况做不同的命名,例如values- 800x480。在该文件夹下创建一个dimens.xml文件,定义各种字体的大小。那么系统就会自动根据你手机屏幕的分辨率去调用响应的文件夹。


    另外,值得提醒的是,记得在你默认的values文件下的dimens.xml文件中也要写上相应的字体大小哦,因为当系统无法认识你手机屏幕大小的时候,它会自动去找你默认文件中的

东西,没有写的话程序会崩溃。

************************************************************分割线************************************************************

  在看下面内容之前首先请看你SDK文档中以下这篇文章

  其实google在分辨率适应性的东西已经写的很清楚了,只是我们很多人没去看而已

  以下是结论:
    屏幕分辨率:1024x600
    density1160
    文件夹:values-mdpi-1024x600

    屏幕分辨率:1024x600
    density1.5240
    文件夹:values-hdpi-683x400  1024/1.5  600/1.5得到,需要四舍五入。

    屏幕分辨率:800x480
    density1160
    文件夹:values-mdpi-800x480

    屏幕分辨率:800x480
    density1.5240
    文件夹:values-hdpi-533x320  800/1.5  480/1.5得到,需要四舍五入。

  以此类推
    一般情况下需要创建出values values-mdpi values-hdpi文件夹,以备在一些没有规定的尺寸屏幕上找不到资源的情况。

    然后在里面使用不同的dimens文件,Layout中不要使用显示的数字,所有的尺寸定义全都援引dimens里面的内容。

    这样能够保证深度UI定制的情况

    另外在工程的default.properties中如果split.density=false,则分辨率适配的时候文件夹命名不需要与scale相除

  例
  屏幕分辨率:800x480
  density1.5240
  文件夹:values-hdpi-800x480

************************************************************分割线************************************************************

  关于dimens 

    位置:res\values
    单位:px   Pixel 以画面的像素为单位;
         in     Inches以画面的多少英寸为单位;
         mm  Millimeter以画面的多少毫米为单位;
         pt     Points 一点为1/72英寸;
         dpdip  Density-indepentdent 160dpi屏幕的一个pixel;
         ap Scale-independent Pixels 随屏幕尺寸改变的一个pixel;

 

 

  不同的Android target会有不同的大小,应用程序的界面需要针对不同的大小调整界面元素的尺寸。而且Android屏幕大小也可以在横屏和竖屏之间切换,界面也需要调整。

  如何取得屏幕的方向:

  默认情况下,当屏幕方面切换时,activityonCreate()方法会被重新调用,所以可以在其中通过以下代码来读取屏的方向:

  1.view plaincopy to clipboardprint?

  2.public void onCreate() {

  3.if(this.getResources().getConfiguration()

  .orientation == Configuration.ORIENTATION_LANDSCAPE) {

  4.Log.i("info", "landscape");

  5.} else if (this.getResources().getConfiguration()

  .orientation == Configuration.ORIENTATION_PORTRAIT) {

  6.Log.i("info", "portrait");

  7.}

  8.}

  9.public void onCreate() {

  10.if(this.getResources().getConfiguration()

  .orientation == Configuration.ORIENTATION_LANDSCAPE) {

  11.Log.i("info", "landscape");

  12.} else if (this.getResources().getConfiguration()

  .orientation == Configuration.ORIENTATION_PORTRAIT) {

  13.Log.i("info", "portrait");

  14.}

  15.}

  如果在androidmanifest.xml中加入配置

  android:configChanges="orientation|keyboardHidden|navigation

  当屏幕翻转时,Activity就不会重复的调用onCreate()onPause()onResume().

  而是调用onConfigurationChanged(Configuration newConfig)

  如何取得Android屏幕大小:

  1.view plaincopy to clipboardprint?

  2.int screenWidth,screenHeight;

  3.WindowManager windowManager = getWindowManager();

  4.Display display = windowManager.getDefaultDisplay();

  5.screenWidth = display.getWidth();

  6.screenHeight = display.getHeight();

  7.int screenWidth,screenHeight;

  8.WindowManager windowManager = getWindowManager();

  9.Display display = windowManager.getDefaultDisplay();

  10.screenWidth = display.getWidth();

  11.screenHeight = display.getHeight();

  也有人提到另一种Android屏幕大小的更改方法:

  1.view plaincopy to clipboardprint?

  2.DisplayMetrics dm = new DisplayMetrics();

  3.getWindowManager().getDefaultDisplay().getMetrics(dm);

  4.int screenWidth = dm.widthPixels;

  5.int screenHeight = dm.heightPixels;

 

posted on 2013-02-24 16:50 L迁客 阅读(130) 评论(0)  编辑  收藏


只有注册用户登录后才能发表评论。


网站导航: