适应不同的屏幕

来源:互联网 发布:sopcast网络电视 apk 编辑:程序博客网 时间:2024/05/16 04:51

本文来自Android Developer,自行翻译Supporting Different Screens

安卓通过两种基础性能对设备进行分类:size(大小)和density(密度)。为了使APP可以在不同size和density的设备上安装,我们应该提供可选择的源文件以使APP可以适配不同size和density的设备

  • sizes有四种:small, normal, large, xlarge
  • densities有四种: low (ldpi), medium (mdpi), high (hdpi), extra high (xhdpi)

为了声明用于不同的的屏幕的布局和位图,我们需要吧这些可选择的资源分别放在不同的目录下。

同时注意屏幕的方向(landscape or portrait)也被认为是不同的屏幕大小。

创建不同的布局

为了优化APP在不同大小屏幕上的用户体验,我们应该为我们所支持的每种大小的屏幕创建不同的布局XML文件。每个布局应被保存在适当的资源目录下,以-为后缀命名。比如,对大屏幕(large screens)的布局文件应该被保存在res/layout-large/目录下。

注意:安卓会自动测量我们的布局去匹配屏幕。因此不同屏幕的布局不需要担心UI元素的绝对大小,而应该关注会影响用户体验的布局结构(比如重要的view相对于其他view的位置与大小)。

举个例子,这个工程包含一个默认的布局和一个供大屏选择的布局:
MyProject/
res/
layout/
main.xml
layout-large/
main.xml
文件名必须一致,但是其中的内容不同。这样可以想对应的屏幕size提供合适的UI 。

像平时一样引用布局文件:

@Override protected void onCreate(Bundle savedInstanceState) {     super.onCreate(savedInstanceState);     setContentView(R.layout.main);}

系统基于APP运行的设备屏幕的大小从恰当的目录加载合适的布局文件。关于安卓怎么选择合适的资源,可以到 Providing Resources看一看。

再举一个例子,这个工程包括了适用于横屏的布局:

MyProject/    res/        layout/            main.xml        layout-land/            main.xml

layout/main.xml文件默认用于竖屏模式。

如果想要提供横屏的布局,包括在大屏模式下的横屏布局,这时需要同时使用large和land:

MyProject/    res/        layout/              # default (portrait)            main.xml        layout-land/         # landscape            main.xml        layout-large/        # large (portrait)            main.xml        layout-large-land/   # large landscape            main.xml

**注意:**Android 3.2及更高版本支持高级的方法定义屏幕size,这种方法允许给基于最小宽高的屏幕size指定资源,最小宽高由密度独立像素决定。可以到 Designing for Multiple Screens了这里写链接内容解。

创建不同的位图

我们应该总是提供位图资源以适应不同的密度:low, medium, high and extra-high,以此来获得好的图片质量和不同密度的屏幕上的表现。

为了产生些图片,我们应该从向量格式的原始资源开始并产生适用于不同密度的图片:

  • xhdpi: 2.0
  • hdpi: 1.5
  • mdpi: 1.0 (baseline)
  • ldpi: 0.75

这意味着如果我们提供200*200的图片给xhdpi的设备,那么我们应该提供150*150的资源给hdpi,100*100给mdpi,75*75给ldpi。
并把资源放在对应的目录下:
MyProject/
res/
drawable-xhdpi/
awesomeimage.png
drawable-hdpi/
awesomeimage.png
drawable-mdpi/
awesomeimage.png
drawable-ldpi/
awesomeimage.png
每当我们引用@drawable/awesomeimage,系统都会基于屏幕密度选择合适的位图。

注意:低密度(ldpi)资源并不总是必需的。当我们提供了hdpi的资源,系统可以缩小1.5倍去适配屏幕。

最后附上适配横屏模式的代码,其中使用了fragment。

0 0