Android屏幕适配专题

来源:互联网 发布:微信红包牛牛源码教程 编辑:程序博客网 时间:2024/06/11 04:03

如何确定对哪些屏幕尺寸进行适配

在一些第三方网站进行查看,比如友盟等推送集成网站或者其他第三方。对市面上主流的手机屏幕尺寸进行适配。

重要概念

屏幕尺寸

屏幕尺寸的计量单位为inch(英寸),1inch约等于2.54cm。手机屏幕尺寸说的是手机屏幕对角线的长度。

计算单位

  • px(像素):屏幕显示的最小计量单位
  • dpi(像素密度)
    计算方式:
    dpi=x2+y2inch

    x是屏幕宽的像素,y是屏幕长的像素,inch是屏幕尺寸
  • dip的计算方式:
    1dp=dpi160px

    dpi是像素密度,在像素密度为160的时候,1dp=1px
  • sp是文本大小的单位,官方推荐的大小为12sp、14sp、18sp、22sp四个尺寸;
  • 像素区分:不同文件夹存放的dpi大小范围
名称 像素密度范围 icon大小 mdpi 120dp-160dp 48x48px hdpi 160dp-240dp 72x72px xhdpi 240dp-320dp 96x96px xxhdpi 320dp-480dp 144x144px xxxhdpi 480dp-640dp 192x192px

在Google官方开发文档中,说明了 mdpi:hdpi:xhdpi:xxhdpi:xxxhdpi=2:3:4:6:8 的尺寸比例进行缩放。例如,一个图标的大小为48×48dp,表示在mdpi上,实际大小为48×48px,在hdpi像素密度上,实际尺寸为mdpi上的1.5倍,即72×72px,以此类推。
Android主要分辨率对应的文件名称:
1280*720—xhdpi
1920*1080—xxhdpi
854*480–hdpi
960*540–hdpi
一般情况下,2k分辨率对应xxxhdpi,1080对应xxhdpi,720对应xhdpi

支持各种屏幕尺寸的解决方案

wrap_content的使用

wrap_content是包含组件大小大小不固定;

weight的使用

weight只有在LinearLayout中才可以使用,weight的含义是占剩余控件的比例。match_parent的意思是一个全屏的长度;

尺寸限定符

新建layout-large文件夹,新建布局文件放在给文件夹中,文件名必须与layout文件夹中的文件名对应,这种写法在android3.2之前使用,应用与平板上,在之后版本不起作用。Android3.2之后使用最小宽度限定符新建layout-sw600dp文件夹,sw=small width该文件夹中的布局代表着在宽度为600dp以上的设备上使用。

限定符

在加入限定符以后,在不同的情况下,斯通股将会在不同的文件夹下面找寻定义的文件

屏幕方向限定符

在文件夹名后添加-port(竖直方向)-land(水平方向)

尺寸大小限定符

在文件夹名后添加-sw[判定的最小尺寸],例如
-sw600dp意思就是当屏幕的宽度大于600dp的时候在这个文件夹中进行查询。

最小版本限定符

在文件夹后面加-V[api版本号],例如-v11表示在api11以上的系统里使用该文件夹下的文件代替默认文件夹中的文件。

使用布局别名

在res下建立
res/layout/main.xml:单面板布局,布局文件
res/layout/man_twopanes.xml:双面板布局,布局文件
res/values/layout.xml默认布局赋值别名文件
res/values-sw600dp/layout.xml宽度大于600dp后的布局赋值别名文件
res/values-sw800dp/layout.xml宽度大于800dp后的布局赋值别名文件

res/valuse/layout.xml默认布局

<resources>  <item name="main" type="layout">@layout/main</item></resources>

res/valuse-sw600dp/layout.xml宽度大于600dp的布局

<resources>  <item name="main" type="layout">@layout/main_twopanes</item/></resources>

res/valuse-sw800dp/layot.xml宽度大于800dp 的布局

<resources>  <item name="main" type="layout">@layout/main_twopanes</item/></resources>

这样就有了main为别名的布局,在activity中使用setContentView(R.layout.main)即可。

0 0