`
艳过留痕
  • 浏览: 40363 次
社区版块
存档分类

自适应多分辨率多尺寸布局

 
阅读更多

 

一:不同的layout

Android手机 屏幕 大小不一,有480x320, 640x360, 800x480.怎样才能让App自动 适应不同的屏幕 呢?
     其实很简单,只需要在res目录下创建不同的layout文件 夹,比如layout-640x360,layout-800x480,所有的layout文件在编译 之后都会写入R.java里,而系统 会根据屏幕 的大小自己选择合适的layout进行使用。

 

二:hdpi、mdpi、ldpi

在之前的版本中,只有一个drawable,而2.1版本中有drawable-mdpi、drawable-ldpi、drawable-hdpi三个,这三个主要是为了支持多分辨率。

  drawable- hdpi、drawable- mdpi、drawable-ldpi的区别:

  (1)drawable-hdpi里面存放高分辨率的图片,如WVGA (480x800),FWVGA (480x854)

  (2)drawable-mdpi里面存放中等分辨率的图片,如HVGA (320x480)

  (3)drawable-ldpi里面存放低分辨率的图片,如QVGA (240x320)

  系统会根据机器的分辨率来分别到这几个文件夹里面去找对应的图片。

  在开发程序 时为了兼容不同平台不同屏幕 ,建议各自文件夹根据需求均存放不同版本图片。

 

 

三、屏幕 方向

横屏竖屏自动切换:
      可以在res目录下建立layout-port和layout-land两个目录,里面分别放置竖屏和横屏两种布局文件,这样在手机屏幕 方向变化的时候系统会自动调用相应的布局文件,避免一种布局文件无法满足两种屏幕 显示的问题。

还有一种办法:只要在androidmanifest.xml中对应的Activity中加入sensor属性即可实现屏幕自动翻转,如:

  Xml代码

  <

  activity android:name=".demo"

  android:label="@string/app_name"

  android:screenOrientation="sensor"

  >

 

横屏竖屏不切换:
还要说明一点:每个activity 都有这个属性screenOrientation,每个activity都需要设置 ,可以设置为竖屏(portrait),也可以设置为无重力感应(nosensor)。

要让程序界面保持一个方向,不随手机方向转动而变化的处理办法:
  
在AndroidManifest.xml里面配置一下就可以了。加入这一行android :screenOrientation="landscape"。
例如(landscape是横向,portrait是纵向):

<?xml version="1.0" encoding="utf-8"?>

<manifest xmlns:android="http://schemas.android.com/apk/res/android"

      package="com.ray.linkit"

      android:versionCode="1"

      android:versionName="1.0">

    <application android:icon="@drawable/icon" android:label="@string/app_name">

        <activity android:name=".Main"

                  android:label="@string/app_name"

                  android:screenOrientation="portrait">

            <intent-filter>

                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />

            </intent-filter>

        </activity>

                <activity android:name=".GamePlay"

                android:screenOrientation="portrait"></activity>

                <activity android:name=".OptionView"

                android:screenOrientation="portrait"></activity>

    </application>

    <uses-sdk android:minSdkVersion="3" />

</manifest>

 

 

四、 另外,android中每次屏幕 的切换动会重启Activity,所以应该在Activity销毁前保存当前活动的状态,在Activity再次Create的时候载入配置,那样,进行中的游戏就不会自动重启了!

但是屏幕自动翻转也伴随着一个问题:当窗体切换或者布局切换时,Activity中OnCreate方法会被重复调用。一般OnCreate中会初始化一些数据,重复调用可能会产生意想不到的后果。解决方法如下:

  在androidmanifest.xml中的activit元素加入configChanges这个属性,比如

  Xml代码

  <

  activity android:name="demo"

  android:configChanges="orientation|keyboardHidden"

  android:label="@string/app_name"

  >

另外,在Activity的Java文件中重载onConfigurationChanged(Configuration newConfig)这个方法,这样就不会在布局切换或窗口切换时重载onCreate等方法。代码如下:

  Java代码

  public void onConfigurationChanged(Configuration newConfig)

  {

  super.onConfigurationChanged(newConfig);

  if (this.getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE)

  {

  //TO-DO

  }

  else if (this.getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT)

  {

  //TO-DO

  }

  }

 

还有界面设计方面的问题,Android手机大部分是HVGA、WVGA的分辨率,屏幕视觉上比较“狭长”。往往竖着看很合适的布局,当屏幕横向翻转以后显示会变得很别扭。当屏幕由竖直方向改变为横向时,我们可以把界面中的控件由本来的垂直线性布局修改为横向线性布局,这样布局会更合理一些。我们可以自己写一个布局类集成LinearLayout布局,通过覆盖onMeasure方法来实现这种自动布局。当屏幕的宽高发生改变时,系统会调用 onMeasure方法。通过这个方法,我们可以获得改变以后的宽高尺寸,从而来实现屏幕翻转的自动布局,主要代码如下:

  Java代码

  

  protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec)

  {

  

  int screenWith = View.MeasureSpec.getSize(widthMeasureSpec);

  

  int screenHeight = View.MeasureSpec.getSize(heightMeasureSpec);

  

  if (screenWith < screenHeight)

  {

  this.setOrientation(VERTICAL);

  for (int i = 0; i < getChildCount(); i++)

  {

  View childView = getChildAt(i);

  if (childView instanceof CakyCanvas)

  {

  

  LayoutParams params = new LayoutParams(screenWith,

  screenHeight * 2/ 5

  updateViewLayout(childView, params);

  }

  else if (childView instanceof CakyExplainCanvas)

  {

  

  LayoutParams params = new LayoutParams(screenWith,

  screenHeight * 3/ 5

updateViewLayout(childView, params);

  }

  }

  }

  

  else

  {

  this.setOrientation(HORIZONTAL);

  for (int i = 0; i < getChildCount(); i++)

  {

  View childView = getChildAt(i);

  if (childView instanceof CakyCanvas)

  {

  LayoutParams params = new LayoutParams(

  screenWith * 2/ 5

  screenHeight);

  updateViewLayout(childView, params);

  }

  else if (childView instanceof CakyExplainCanvas)

  {

  LayoutParams params = new LayoutParams(

  screenWith * 3/ 5

  screenHeight);

  updateViewLayout(childView, params);

  }

  }

  }

  super.onMeasure(widthMeasureSpec, heightMeasureSpec);

  }

 

 

五、有的程序适合从竖屏切换到横屏,或者反过来,这个时候怎么办呢?可以在配置Activity的地方进行如下的配置android:screenOrientation="portrait"。这样就可以保证是竖屏总是竖屏了,或者landscape横向。

 

六、而有的程序是适合横竖屏切换的。如何处理呢?首先要在配置Activity的时候进行如下的配置:android:configChanges="keyboardHidden|orientation",另外需要重写Activity的 onConfigurationChanged方法。实现方式如下,不需要做太多的内容:

 

@Override

        public void onConfigurationChanged(Configuration newConfig) {

                super.onConfigurationChanged(newConfig);

                if (this.getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE) {

                        // land do nothing is ok

                } else if (this.getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT) {

                        // port do nothing is ok

                }

        }

 

七、屏幕分辨率适配

 

屏幕分辨率:1024x600

density:1(160)
文件夹:values-mdpi-1024x600

屏幕分辨率:1024x600
density:1.5(240)
文件夹:values-hdpi-683x400  由1024/1.5  600/1.5得到,需要四舍五入。

屏幕分辨率:800x480
density:1(160)
文件夹:values-mdpi-800x480

屏幕分辨率:800x480
density:1.5(240)
文件夹:values-hdpi-533x320  由800/1.5  480/1.5得到,需要四舍五入。

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

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

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

屏幕分辨率:800x480
density:1.5(240)
文件夹:values-hdpi-800x480

 

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

 

八、关于Android的nodpi,xhdpi,hdpi,mdpi,ldpi

首先是几个基本概念:

1.屏幕尺寸Screen size

即显示屏幕的实际大小,按照屏幕的对角线进行测量。

为简单起见,Android把所有的屏幕大小分为四种尺寸:小,普通,大,超大(分别对应:small, normal, large, and extra large).

应用程序可以为这四种尺寸分别提供不同的自定义屏幕布局-平台将根据屏幕实际尺寸选择对应布局进行渲染,这种选择对于程序侧是透明的。

2.屏幕长宽比Aspect ratio

长宽比是屏幕的物理宽度与物理高度的比例关系。应用程序可以通过使用限定的资源来为指定的长宽比提供屏幕布局资源。

 

3.屏幕分辨率Resolution

在屏幕上显示的物理像素总和。需要注意的是:尽管分辨率通常用宽x高表示,但分辨率并不意味着具体的屏幕长宽比。

在Andorid系统中,应用程序不直接使用分辨率。

4.密度Density

根据像素分辨率,在屏幕指定物理宽高范围内能显示的像素数量。

在同样的宽高区域,低密度的显示屏能显示的像素较少,而高密度的显示屏则能显示更多的像素。

屏幕密度非常重要,因为其它条件不变的情况下,一共宽高固定的UI组件(比如一个按钮)在在低密度的显示屏上显得很大, 而在高密度显示屏上看起来就很小。

为简单起见,Android把所有的屏幕分辨率也分为四种尺寸:小,普通,大,超大(分别对应:small, normal, large, and extra large).

应用程序可以为这四种尺寸分别提供不同的资源-平台将透明的对资源进行缩放以适配指定的屏幕分辨率。

5.设备独立像素Density-independent pixel (dp)

应用程序可以用来定义UI组件的虚拟像素单元,通过密度无关的方式来描述布局尺寸和位置。

一个设备独立像素相当于一个160 dpi屏幕上的物理像素。

在程序运行时,系统根据屏幕的实际密度透明的处理任何需要缩放的设备独立像素单元,设备独立像素转换成屏幕实际像素的换算很简单:pixels = dps * (density / 160).

例如在240 dpi的屏幕上,1个设备独立像素等于1.5物理像素.为确保UI组件在不同的屏幕都能合适的展示,强烈建议使用设备独立像素单元来定义你的应用程序UI。

四种屏幕尺寸分类:: small, normal, large, and xlarge

四种密度分类: ldpi (low), mdpi (medium), hdpi (high), and xhdpi (extra high)

需要注意的是: xhdpi是从  Android   2.2 (API Level 8)才开始增加的分类.

xlarge是从Android 2.3 (API Level 9)才开始增加的分类.

DPI是“dot per inch”的缩写,每英寸像素数。

一般情况下的普通屏幕:ldpi是120,mdpi是160,hdpi是240,xhdpi是320。

参考:http://developer.android.com/images/screens_support/screens-ranges.png

两种获取屏幕分辨率信息的方法:

DisplayMetrics metrics = new DisplayMetrics();

Display display = activity.getWindowManager().getDefaultDisplay();

display.getMetrics(metrics);

//这里得到的像素值是设备独立像素dp

//DisplayMetrics metrics=activity.getResources().getDisplayMetrics(); 这样获得的参数信息不正确,不要使用这种方式。

不能使用android.content.res.Resources.getSystem().getDisplayMetrics()。这个得到的宽和高是空的。

 

如果需要为Android pad定制资源文件,则res目录下的目录可能为:

drawable

drawable-ldpi

drawable-mdpi

drawable-hdpi

drawable-xhdpi

drawable-nodpi

drawable-nodpi-1024×600

drawable-nodpi-1280×800

drawable-nodpi-800×480

values

values-ldpi

values-mdpi

values-hdpi

values-xhdpi

values-nodpi

values-nodpi-1024×600

values-nodpi-1280×800

values-nodpi-800×480

 

 

参考:http://blog.csdn.net/pilou5400/article/details/6018374

分享到:
评论

相关推荐

    labview自适应屏幕分辨率

    4. **响应式设计**:LabVIEW 2017及更高版本引入了响应式设计概念,允许开发者为不同屏幕尺寸和分辨率创建多个布局。通过定义不同的布局策略,可以确保程序在手机、平板、桌面等设备上都有良好的视觉效果。 5. **...

    labview 自适应屏幕分辨率程序

    总之,“labview 自适应屏幕分辨率程序”涉及到的关键知识点包括LabVIEW界面设计的自适应性、屏幕分辨率的理解、测试程序的构建以及对多分辨率和多显示器环境的兼容性处理。通过这些技术,开发者可以创建出能够在...

    自适应屏幕分辨率,labview自适应屏幕分辨率,LabView源码.zip.zip

    在编程领域,特别是图形用户界面(GUI)设计中,自适应屏幕分辨率是一个关键概念,它确保应用程序能在不同尺寸和分辨率的显示器上正常显示。LabVIEW(Laboratory Virtual Instrument Engineering Workbench)是美国...

    android应用自适应多分辨率的解决方法

    本文将深入探讨如何实现Android应用的自适应多分辨率设计,涵盖布局、资源管理和配置文件的优化策略。 ### 一、布局资源目录的合理规划 Android系统支持开发者为不同屏幕尺寸和密度创建特定的布局资源文件。这是...

    LabVIEW自适应屏幕分辨率.rar

    8. **最佳实践**:遵循LabVIEW社区推荐的最佳实践,例如使用布局管理器、避免固定像素尺寸、使用可缩放的图标和字体等,有助于创建更适应各种分辨率的应用。 通过“LabVIEW自适应屏幕分辨率.rar”中的资源,开发者...

    自适应屏幕分辨率,labview自适应屏幕分辨率,LabView源码.zip

    在现代多分辨率显示器环境下,让应用程序自适应不同的屏幕分辨率是至关重要的,尤其是对于LabVIEW这样的桌面应用程序。本资料包提供了一个关于如何在LabVIEW中实现自适应屏幕分辨率的解决方案。 自适应屏幕分辨率在...

    自适应屏幕分辨率,labview自适应屏幕分辨率,LabView源码.rar

    在LabVIEW编程环境中,自适应屏幕分辨率是一项关键的技术,它使得应用程序能够在不同尺寸和分辨率的屏幕上正确显示,提供良好的用户体验。LabVIEW自适应屏幕分辨率主要涉及窗口布局、控件大小调整以及用户界面(UI)...

    自适应屏幕分辨率,labview自适应屏幕分辨率,LabView源码 (1).zip

    在LabVIEW中,自适应屏幕分辨率主要涉及到窗口布局管理,确保程序界面在不同尺寸和分辨率的屏幕上都能正确显示。以下是一些实现自适应屏幕分辨率的关键知识点: 1. **面板和控件的相对位置**:在设计LabVIEW用户...

    LabVIEWlabview论坛-自适应屏幕分辨率.rar

    在现代多设备、多分辨率的环境下,创建能够自动调整大小和布局的用户界面(UI)是至关重要的。下面将详细讲解LabVIEW中实现这一功能的相关知识点。 1. **LabVIEW界面设计**:LabVIEW的用户界面是基于数据流图(GDI...

    自适应屏幕分辨率,labview自适应屏幕分辨率,LabView

    4. **响应式设计**:在LabView中,可以创建多个版本的用户界面,针对不同屏幕尺寸和分辨率进行优化。通过使用条件结构和VI引用,可以动态地加载适合当前屏幕的UI。 5. **屏幕检测**:编写代码来检测当前运行设备的...

    自适应屏幕分辨率.rar

    自适应屏幕分辨率技术的核心在于动态调整UI元素的大小、位置和布局,以便在各种屏幕尺寸下都能提供良好的视觉效果。这通常通过以下几种方式来实现: 1. **百分比布局**:LabVIEW中的控件和面板可以设置为基于父容器...

    自适应屏幕分辨率_labview_

    在“自适应屏幕分辨率”这个主题中,我们主要探讨如何利用LabVIEW来创建用户界面(UI)时,使其能够自动适应不同设备和显示器的分辨率变化。 在LabVIEW中,自适应屏幕分辨率通常涉及到以下几个关键知识点: 1. **...

    labview论坛-自适应屏幕分辨率.rar

    4. **响应式设计**:类似于网页设计中的概念,可以在LabVIEW中采用响应式设计策略,为不同的屏幕尺寸和分辨率定义多个布局,根据实际屏幕情况加载合适的布局。 5. **自定义容器**:创建自定义容器控件可以封装一组...

    窗体自适应屏幕分辨率

    窗体自适应屏幕分辨率 在 C# 中开发 Winform 应用程序时,如何让窗体自适应屏幕分辨率是一个常见的问题。为了解决这个问题,我们可以通过设置 Form 的 AutoSize 属性为 true,并在 Form 上放置一个 ...

    QT 窗体、控件、字体自适应分辨率

    "QT 窗体、控件、字体自适应分辨率"这一主题聚焦于如何使应用程序在不同分辨率的显示器上保持良好的显示效果。 在QT中,窗体(QMainWindow或QWidget)和控件(如QPushButton、QLabel等)的大小调整可以通过多种方式...

    Android自适应不同分辨率总结

    **资源的多屏支持**:为了进一步增强自适应性,可以利用Android的资源目录结构,如使用不同的drawable目录(如hdpi、xhdpi、xxhdpi)存储不同分辨率的图像资源,以及使用values目录下的不同qualifiers(如-sw600dp、...

    cocos2d-x自适应屏幕分辨率 源码

    对于移动设备来说,屏幕分辨率的多样性是一个挑战,因为不同的设备有不同的屏幕尺寸和像素密度。cocos2d-x提供了自适应屏幕分辨率的功能,帮助开发者解决这一问题。本篇文章将深入探讨cocos2d-x如何实现自适应屏幕...

    多分辨率屏幕自适应

    2. 流式布局:传统的固定宽度布局在多分辨率设备上往往无法自适应。流式布局采用百分比单位,而不是像素,使得元素可以随着浏览器窗口的大小变化而自动调整。例如,我们可以使用Flexbox或Grid布局来创建灵活的容器,...

Global site tag (gtag.js) - Google Analytics