您的位置:首页 > 移动开发 > Android开发

Android屏幕适配

2015-12-29 10:15 260 查看
由于android系统的安防行,任何用户、开发者、OEM厂商都可以对Android进行定制,修改成自己需要的样子。随着支持Android系统的设备(手机、平板、电视、手表)的增多,设备碎片化、品牌碎片化、系统碎片化、传感器碎片化的程度也在不断加深。对于开发影响较大的当属屏幕碎片化。

屏幕尺寸这么多,为了让我们开发的程序能够比较美观的显示在不同尺寸、分辨率、像素密度的设备上,就要在开发的过程中进行处理,这就是所谓的屏幕适配。

进入主题之前,再来探讨一件事情,那就是Android设备的屏幕尺寸,从几寸的智能手机到10寸的平板电脑,再到几十寸的数字电视,我们应该适配大写设备呢?

其实,这个问题不应该这么考虑,因为对于具有相同像素密度的设备来书,像素越高,尺寸就越大,所以我们可以换个思路,将问题从单纯的尺寸大小转换到像素大小和像素密度的角度来。我们只要尽量适配几种主流的分辨率,就可以在大部分手机上正常运行了。当然,这只是手机适配,对于平板设备(电视也可以看做是平板)我们还需要一些其他处理。

重要概念

什么是屏幕尺寸、屏幕分辨率、屏幕像素密度?

什么是dp、dip、dpi、sp、px?他们之间的关系是什么?

什么是mdpi、hdpi、xdpi、xxdpi?如何计算和区分?

屏幕尺寸:屏幕对角对角线的长度,单位是英寸,1inch=2.54厘米。常见屏幕尺寸有2.4、2.8、3.5、3.7、4.2、5.0、5.5、6.0

屏幕分辨率:横纵上的像素点数,单位px,1px=1个像素点。一般以纵向像素*横向像素,如1960*1080.

屏幕像素密度:每英寸上的像素点数,单位dpi,即"dot per inch"。屏幕的像素密度与屏幕尺寸和屏幕分辨率有关,单一变化条件下,屏幕尺寸越小、分辨率越高、像素密度越大、反之越小。

px dip sp px

px:像素单位,大多数情况下,比如UI设计、Android原声API都会以px作为统计的计量单位,像是获取屏幕宽高等。

dip和dp:一个意思。Density Independent Pixels的缩写。即密度无关像素(跟密度无关的像素,个人觉着这种表述比较好理解)。dpi是屏幕像素密度,加入一英寸(inch)里面有160个像素(px),这个屏幕的像素密度就是160dpi,在像素密度为160dpi的情况下,dp和px如何换算呢?在Android中,规定以像素密度为160dpi为基准,1dip(or dp)=1px,如果密度为320dpi,则1dip=2px,以此类推。

加入画同样一条320px的线,在180*800分辨率升级上,显示为2/3的屏幕宽度,320*480则占满了全屏,如果以dp为单位,在两种分辨率下,160dp都显示为屏幕一半的长度。(注:这里例子是同样的尺寸下不同分辨率的手机屏幕)这也是为什么Android开发中,写布局的时候尽量使用dp而不是px。sp即scale-independent pixels与dp类似,但是可以根据文字大小首选项进行放缩,用以设置字体大小。

mdpi、hdpi、xdpi、xxdpi

之前还有个ldpi,随着一定设备配置升级,这个像素密度的设备已经罕见了,现在适配时不需要考虑。

mdpi、hdpi、xdpi、xxdpi用来修饰Android中的drawable文件夹及values文件夹,用来区分不同像素密度下的图片和dimen值

如何区分?Google官方指定按照下列标准区分





在进行开发的时候,我们需要把合适大小的图片放在合适的文件夹里面。

在设计图标时,对于五种主流的像素密度(MDPI、HDPI、XHDPI、XXHDPI 和 XXXHDPI)应按照 2:3:4:6:8
的比例进行缩放。例如,一个启动图标的尺寸为48x48 dp,这表示在 MDPI 的屏幕上其实际尺寸应为 48x48 px,在 HDPI 的屏幕上其实际大小是 MDPI 的 1.5 倍 (72x72 px),在 XDPI 的屏幕上其实际大小是 MDPI 的 2 倍 (96x96 px),依此类推。

ldpi: 120px = 160dp * 0.75

mdpi: 160px = 160dp * 1

hdpi: 240px = 160dp * 1.5

xhdpi: 360px = 180dp * 2

解决方案

支持各种屏幕尺寸

使用wrap_content、match_parent、weight

要确保布局的灵活性并适应各种尺寸的屏幕,应使用 “wrap_content” 和 “match_parent” 控制某些视图组件的宽度和高度。

使用 “wrap_content”,系统就会将视图的宽度或高度设置成所需的最小尺寸以适应视图中的内容,而 “match_parent”(在低于 API 级别 8 的级别中称为 “fill_parent”)则会展开组件以匹配其父视图的尺寸。

如果使用 “wrap_content” 和 “match_parent” 尺寸值而不是硬编码的尺寸,视图就会相应地仅使用自身所需的空间或展开以填满可用空间。此方法可让布局正确适应各种屏幕尺寸和屏幕方向。

图片适配:

ldpi < drawable < mdpi < hdpi < xhdpi

图片查找顺序,先找自己对应的文件夹,再往大分辨率找,再找小分辨率

注意:mdpi手机时,ldpi < mdpi < drawable < hdpi < xhdpi

mdpi手机,先找自己文件夹,再找drawable,再往大的找,再往小的找

适配主流分辨率:480*800,1280*720,高清图、大图、背景图,准备两套,小图片只准备480*800

mdpi是基准线,1dp = 1px

密度比 : ldpi 0.75, mdpi 1,hdpi 1.5,xhdpi 2

代码获取密度比:getResources().getDisplayMetrics().density

ldpi: 120px = 160dp * 0.75

mdpi: 160px = 160dp * 1

hdpi: 240px = 160dp * 1.5

xhdpi: 360px = 180dp * 2

根据分辨率创建values文件夹,如:values-1280x720,创建不同的dimens文件

<dimen name="half_width">180dp</dimen>

密度比 : ldpi 0.75, mdpi 1,hdpi 1.5,xhdpi 2

代码获取密度比:getResources().getDisplayMetrics().density

ldpi: 120px = 160dp * 0.75

mdpi: 160px = 160dp * 1

hdpi: 240px = 160dp * 1.5

xhdpi: 360px = 180dp * 2

根据分辨率创建values文件夹,如:values-1280x720,创建不同的dimens文件

<dimen name="half_width">180dp</dimen>

代码适配

Display display = getWindowManager().getDefaultDisplay();

int width = display.getWidth();

int height = display.getHeight();

TextView tv1 = (TextView) findViewById(R.id.tv1);

TextView tv2 = (TextView) findViewById(R.id.tv2);

TextView tv3 = (TextView) findViewById(R.id.tv3);

TextView tv4 = (TextView) findViewById(R.id.tv4);

tv1.setLayoutParams(new LayoutParams((int)(width*0.25), (int)(height*0.1)));

tv2.setLayoutParams(new LayoutParams((int)(width*0.5), (int)(height*0.1)));

tv3.setLayoutParams(new LayoutParams((int)(width*0.75), (int)(height*0.1)));

tv4.setLayoutParams(new LayoutParams((int)(width*1), (int)(height*0.1)));
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: