Android 屏幕适配(下)

接上一篇

图片适配

1、切多套图,正确的图片放入正确的文件夹下面

图片适配什么意思?为什么要有图片适配?
首先看一张图

这里写图片描述

在默认的res文件夹下面,发现有这么多mipmap文件夹,现在看到里面只是放了一个ic_launcher图片,就是应用的启动图标,为什么要有这么多张?

点开之后发现每张图片的分辨率和所占用的大小都不一致

mipmap-mdpi           48x48            2.21k
mipmap-hdpi           72x72            3.42k
mipmap-xhdpi          96x96            4.84k
mipmap-xxhdpi        144x144           7.72k
mipmap-xxxhdpi       192x192           10.49k

这是因为每个手机的屏幕密度都不一样,当程序运行到手机上时,系统会根据当前手机所对应的屏幕密度去找相应文件夹下面的图片。比如当我们启动一个屏幕密度为mdpi的手机时,加载的其实就是分辨率48x48大小为2.21k的ic_launcher图片,其他以此类推。我们需要按照规则将不同的图片放到相对应的文件夹下面,这样做的好处就是节省内存。下面做一个实验来验证这一结论。

首先去找一张1080x1920分辨率的图片,该图片信息如下:

这里写图片描述

可以看到,这是一张1080x1920分辨率、1.3MB的图片,我们把它放到mipmap-xxhdpi的文件夹下面,接下来启动一个1920x1080分辨率的模拟器。

然后xml布局里将其设置为背景,然后运行。
打开Android Studio的内存检测,检查耗费的内存,如图

这里写图片描述

可以看到,这个1.3MB的图片运行到这个手机上所消耗的内存是9.53MB。

接下来,咱们把这个图片移动到mipmap-hdpi文件夹下面,等于说还是原来的图片,只是换个文件夹,这样在运行的时候手机会加载mipmap-hdpi这个文件夹下面的图片。运行后,监测内存情况如下:

这里写图片描述

可以看到,这个1.3MB的图片运行到这个手机上所消耗的内存是32.97MB。
当我们把它放进mipmap-mdpi文件夹下面时,情况如下:

这里写图片描述

可以看到,这个1.3MB的图片运行到这个手机上所消耗的内存是72.48MB。

为什么都是同一张图片,什么都没改,只是换了个文件夹而已,它就有这么大的区别呢?
这张图片是1.3Mb,我们启动的模拟器参数如下:

屏幕尺寸:4.95英寸
分辨率  :1920x1080

根据前面所讲的屏幕像素密度计算公式可以得出该模拟器的屏幕像素密度是445,这就意味着它对应的xxhdpi,它会优先去加载此文件夹下面的图片。

因此当我们把图片放到xxhdpi文件夹下面时,系统第一优先找的是这个文件夹,这是有好处的,好处就是节省内存,从上图也可以看出,的确如此。这就是为什么我们要在对应的文件夹下面放对应分辨率图片的好处,就是占用内存小。这就是好处,至于为什么会出现这么大的差别,我们这样来分析。

还记得前面讲过,mdpi、hdpi、xhdpi、xxhdpi、xxxhdpi的比例是2:3:4:6:8的概念吗?
当前图片1.3Mb,放到相应文件夹下面时占用内存不同

xxhdpi : 9.53Mb
xhdpi   :19.08Mb
hdpi     :32.97Mb
mdpi    :72.48Mb

首先这张图片理应消耗的内存是9.53Mb-1.3Mb=8.23Mb (在手机里占用的内存-图片自身的大小)

得出该图片大约为8Mb,分析其他几种情况:

当放到mdpi下时,按照2:3:4:6:8的比例,mdpi跟xxhdpi的比例是2:6,我们的模拟器是xxhdpi的,在去mdpi文件夹里找图片时会自动转换,转换的比例就是2:6。也就是1:3的关系,既然如此,宽是3倍,高是3倍,自然一张图就变成了9倍。

再分析hdpi的情况,跟xxhdpi的比例是3:6,也就是1:2,2 x 2=4,也就是扩大了4倍。
所以8Mb x 4=32Mb,也符合上面的情况。

xhdpi是4:6,也就是1.5x1.5=2.25
所以8Mb x 2.25 = 18Mb左右,差不多也跟上面一样。

由此可见,一张图片放到正确的文件夹里面是多么的重要,由此你是否明白Google为什么造了那么多套ic_launcher的图片了呢?

2、使用.9图,自动拉伸位图

Android里有9patch图的概念,也就是.9图,能够自动拉伸你指定的地方,这其实是一种格式特殊的png文件,能指明可以拉伸以及不可拉伸的区域,同时还可以把显示内容区域的位置标示清楚。

举个最简单的例子,比如看QQ的聊天框

这里写图片描述

其实咱们发的文字是内容区域,后面的其实就是个背景图片。
在我们的代码里,比如我们找一张聊天背景的图片,如下

这里写图片描述

接下来放到我们的xml布局里面,当我给TextView设置了文字,可以看到如下效果:

这里写图片描述

文字内容不在正中间,即使我们调整文字内容在中间以求得显示正常,如下:

这里写图片描述

那也要考虑另一个问题,当文字内容特别多的时候的一个显示效果,如图:

这里写图片描述

这样图片完全变形了,比如内容区域变形了,而且“尖儿”不应该被变大的,那该怎么办呢?

首先这个背景图片要能根据文字内容的排版改变自己的大小,这个毋庸置疑,但是每个聊天框都有一个“尖儿”,这个是要对准发信息的人,我们怎么能保证这个“尖儿”不被拉伸呢?
如果只是一张单纯的图片,在文字内容为一行的时候不会发生什么改变,但是当文字内容超过2行或者更多时,图片肯定就会变形。

那问题是,我们怎么保证图片不会随着文本内容的改变而变形呢?或者说如何让内容区域限定在一个区域范围内呢?

这就要引入了.9图的概念了。

先看一张图:

这里写图片描述

这是.9图制作的一个入门,首先你要明白这个图片四周的四条黑边的作用。
左边和上边的两条黑线代表的就是拉伸区域,就是我们控制这张图片哪些区域可以缩放,缩放的区域就是两条黑边的交集,即第一张图的紫色区域。
右边和下边代表的是padding,就是间隔区域,通俗来讲就是文本内容的区域,下面给出示例。

如果我们能让内容定死,那就万事大吉,下面介绍.9图的制作。

首先第一步,选中你家UI妹子给的图,右键点击,选中create9-patch file

这里写图片描述

然后点击ok

这里写图片描述

然后点开创建好的.9图进入编辑模式

这里写图片描述

这张图我就不做过多解释了,必要的文字信息都在图上面标注了。可以看到当拉伸的时候图片变形了,尤其是那个“尖儿”。

下面讲讲怎么制作这张图片,或者说怎么设置拉伸区域。
如上面所讲,我先在左边画一条黑线,如图

这里写图片描述

发现右边的三种视图变化了,由于我画的黑边横向穿过的区域没有涉及到“尖儿”,所以无论怎么拉伸,“尖儿”都不会变形,下面我再在上面画一条。

这里写图片描述

其实跟上面的没什么太大区别,但是.9图的有两条线必须画,就是左边和上边,否则会报错。
上图的红色区域就是图片会被拉伸的区域,其他地方不会发生任何变化,这个时候,一个简单的.9图就制作完成了。

这个时候再看xml布局的显示效果。

这里写图片描述

当然,你也可以把剩下的两条边给画上,那是设置内容区域的padding的,我就简明扼要的说一下,这个不是重点。

这里写图片描述

设置好之后,我们去掉该TextView的padding属性和gravity属性运行到手机上,效果图如下:

这里写图片描述

多套切图的解决办法

我们需要提供备用位图(符合屏幕尺寸的图片资源)
由于 Android 可在各种屏幕密度的设备上运行,因此我们提供的位图资源应该始终可以满足各类密度的要求:

密度类型                  代表的分辨率(px)   系统密度(dpi)
低密度(ldpi)               240x320             120
中密度(mdpi)               320x480             160
高密度(hdpi)               480x800             240
超高密度(xhdpi)            720x1280            320
超超高密度(xxhdpi)         1080x1920           480

根据以下尺寸范围针对各密度生成相应的图片。

比如说,如果我们为 xhdpi 设备生成了 200x200 px尺寸的图片,就应该按照相应比例地为 hdpi、mdpi 和 ldpi 设备分别生成 150x150、100x100 和 75x75 尺寸的图片

即一套分辨率=一套位图资源

接下来将生成的图片文件放在 res/ 下的相应子目录中(mdpi、hdpi、xhdpi、xxhdpi),系统就会根据运行您应用的设备的屏幕密度自动选择合适的图片
最后通过引用 @mipmap/id,系统都能根据相应屏幕的 屏幕密度(dpi)自动选取合适的位图。

注意:

如果是.9图或者是不需要多个分辨率的图片,放在drawable文件夹即可
对应分辨率的图片要正确的放在合适的文件夹,否则会造成图片拉伸等问题。
更好地方案解决“图片资源”适配问题

上述方案是常见的一种方案,这固然是一种解决办法,但缺点很明显:

1.每套分辨率出一套图,为美工或者设计增加了许多工作量
2.对Android工程文件的apk包变的很大

那么,有没有一种方法:

保证屏幕密度适配
可以最小占用设计资源
使得apk包不变大(只使用一套分辨率的图片资源)

下面我们就来介绍这个方法:

只需选择唯一一套分辨率规格的图片资源
Google官方给出的高清设计图尺寸有两种方案,一种是以mdpi设计,然后对应放大得到更高分辨率的图片,另外一种则是以高分辨率作为设计大小,然后按照倍数对应缩小到小分辨率的图片。
推荐使用第二种方法,因为小分辨率在生成高分辨率图片的时候,会出现像素丢失。
而分辨率可以以1280*720或者是1960*1080作为主要分辨率进行设计。

首先来理解下Android 加载资源过程

Android SDK会根据屏幕密度自动选择对应的资源文件进行渲染加载(自动渲染)
比如说,SDK检测到你手机的分辨率是320x480(dpi=160),会优先到mipmap-mdpi文件夹下找对应的图片资源;
但假设你只在xhdpi文件夹下有对应的图片资源文件(mdpi文件夹是空的),那么SDK会去xhdpi文件夹找到相应的图片资源文件,然后将原有大像素的图片自动缩放成小像素的图片,于是大像素的图片照样可以在小像素分辨率的手机上正常显示。

所以理论上来说只需要提供一种分辨率规格的图片资源就可以了。

那么应该提供哪种分辨率规格呢?

如果只提供ldpi规格的图片,对于大分辨率(xdpi、xxdpi)的手机如果把图片放大就会不清晰

所以需要提供一套你需要支持的最大dpi分辨率规格的图片资源,这样即使用户的手机分辨率很小,这样图片缩小依然很清晰。

xhdpi应该是首选

原因如下:

xhdpi分辨率以内的手机需求量最旺盛

目前市面上最普遍的手机的分辨率还多集中在720X1080范围内(xhdpi),所以目前来看xhdpi规格的图片资源成为了首选。

而且很多公司为了保持App不同版本的体验交互一致,可能会以iPhone手机为基础进行设计,包括后期的切图之类的。

iPhone主流的屏幕dpi约等于320, 刚好属于xhdpi,所以选择xhdpi作为唯一一套dpi图片资源,可以让设计师不用专门为Android端切图,直接把iPhone的那一套切好的图片资源放入mipmap-xhdpi文件夹里就好,这样大大减少的设计师的工作量!

dp 适配

我们总是在xml布局里写dp,dp到底是什么意思呢?

这是Android开发中特有的一种度量,称作屏幕无关像素,它不表示任何具体的长度或者像素点,这个值只有在具体屏幕密度的手机上,才会被转换为具体的像素值。

它跟px不一样,咱们在xml里面写上px,那无论运行到任何设备上,就是固定的px,不会发生什么变化,但是dp就不一样了。

比如拿以下几种来说明一下。

  分辨率(px)      系统密度(dpi)
  240x320             120
  320x480             160
  480x800             240
  720x1280            320
  1080x1920           480

1dp转换的px是多少呢?

其实就跟dpi有关,而基准线是160dpi,这就意味着1dp在320x480这款手机上就是1px,在480x800是1.5px,720x1280上是2px,1080x1920上是3px。

这就是dp。

比如现在有这么个需求,要求一个控件的宽度占屏幕的一半,我们用dp怎么来实现呢?

首先进行计算,比如320x480,它的宽是320个px,那我们就要写160px,用dp来表示就是160dp。所以我们可以在xml布局里写160dp就可以了,同样的方式试一试其他的手机:

  比如240x320,你写160dp在这种手机上转换的px就是 160dp*120/160 = 120px,所以在这种手机上160dp代表的就是120px,刚好是240的一半,也能适配。
  再来试一试480x800,想在这种手机上也占一半,必须是240px,而咱们写的是160dp,它转换的px就是 160dp*240/160=240px,刚好也能符合需求。

其实Google出dp这个东西本身就能达到适配的概念,你看,咱们写了一个160dp,跑到这几种手机上都能达到需求,这不就是适配了吗?

但是我之所以提出来了,就说明dp并不能保证完美适配,比如咱们试试720x1280。
720的一半是360px,而咱们写的160dp,转换的px是160dp*320/160=320px,明显就不是一半,差了40px。也就是说咱们的代码运行到这种手机上的时候就没有适配好,没有达到需求。

再试试1080x1920的,同样的计算,160dp*480/160=480,而1080的一半是540,480跟540差了60px,也不行,没有达到需求。

由此可见,当在240x320,320x480,480x800上面的时候写160dp是正常的,可以满足需求。而在720x1280,1080x1920上面却不能完美适配。

问题抛出来了,该怎么解决这个问题呢?

比如720p和1080p,我们通过计算,720/2=360,而根据dpi的比例320/160=2,所以我们要想再720p的手机上占宽度的一半,dp值应该是360px/2=180dp。

反过来算一下,如果我们写180dp,那在720p上转换的像素是180dp*320/160=360px,是720的一半,换到1080p上,180dp*480/160=540px,刚好是1080的一半,那也就是说,咱们写 180dp就可以实现了需求,那咱们就可以在xml布局里这么写:

<TextView
     android:layout_width="180dp"
     android:layout_height="wrap_content" />

可是,这么一写又有问题出现了,在240x320,320x480,480x800上面又坏了,这可怎么办呢?

千呼万唤始出来,dimens+dp

我的天,说了这么多废话终于到正题了。

Android 的values文件夹下面可以创建一个dimens的文件。这个dimens的作用就跟mipmap和drawable的引用方式一样,可以通过@dimens/xxx的方式来引用。我们的思路就是创建多套dimens,然后xml布局引用dimens,当运行到不同的手机上时,系统会自动去寻找相应的dimens,去加载我们提前准备好的dp值,图文教程:

首先,系统默认的values下面就有个dimens文件

这里写图片描述

我们先不管这个,仿照系统这个自己创建一个values
选中res文件夹,然后点击右键,选中Androidresource directory

这里写图片描述

然后在这里给Directory name命名为values-1280x720,这个意思是说,当检测当手机是1280x720的时候,系统会去找此文件夹下面的dimens,而不是默认的values文件夹。

这里写图片描述

创建好了之后新建一个dimens文件,结果是这个样子的,如图:

这里写图片描述

我们仿照刚才的过程再创建一个values-1920x1080的文件夹。

这里写图片描述

做好这几个步骤之后,点击values下面的dimens,然后创建一个dimen,如下图所示,我在此创建了一个名为activity_horizontal_width的dimen,值为160dp,如图:

这里写图片描述

同时再打开values-1280x720文件夹下面的dimens,创建一个相同的名为activity_horizontal_width,但是值为180dp,如图:

这里写图片描述

同样的步骤,在values-1920x1080文件夹下面的dimens里也创建一个同样的180dp的dimen

这里写图片描述

做好了这些之后,接下来我们需要在xml布局里引用,还记得之前的TextView的width写的多少吧?

之前写的是160dp,是一个固定值,而现在就不能这么写了,我们需要写成“@dimen/activity_horizontal_width”,这个什么意思呢?其实这里只是一个引用,当我们点击想看看具体是多少的值的时候,会发现这样的情况,如图:

这里写图片描述

这个意思就是,当前我们写的“@dimen/activity_horizontal_width”引用了三个地方,问我们想去查看哪一个文件夹下面的dimens。

做好了这一切之后,这个TextView的值就是一个变的,下次再运行到手机上的时候,720p手机上运行时TextView的宽度就是180dp,1080p手机上也是180dp,其他的手机就是160dp(因为我们没有创建其他分辨率的文件夹,所以会走默认的values)。
这就达到了指定机型的屏幕适配。

百分比适配

虽然上述的dimens+dp能达到适配的目的,但是项目中如果要适配市场上常见的机型时,我们只能一个个的去计算,然后写上我们计算好的dp值,而且ui妹子在效果图上标记的都是px,我们还要根据这个再计算转换,很麻烦,有没有那种一劳永逸的?

  参考了hongyang的博客之后,有这么一套适配方案,如下:
  思路:把任何设备的手机宽度像素均分为320份,高度像素均分为480份,使用我们写好的程序自动生成资源values-***×***文件夹,里面包含lay_x.xml和lay_y.xml,分别对应宽度和高度的像素。

现在我们以320x480的分辨率为基准:

  将屏幕的宽度分为320份,取值为x1~x320
  将屏幕的高度分为480份,取值为y1~y480
  然后生成该分辨率对应像素数的列表,如下:

lay_x.xml(宽):

<?xml version="1.0" encoding="utf-8"?>
<resources><dimen name="x1">1.0px</dimen>
<dimen name="x2">2.0px</dimen>
<dimen name="x3">3.0px</dimen>
<dimen name="x4">4.0px</dimen>
<dimen name="x5">5.0px</dimen>
<dimen name="x6">6.0px</dimen>
<dimen name="x7">7.0px</dimen>
<dimen name="x8">8.0px</dimen>
<dimen name="x9">9.0px</dimen>
<dimen name="x10">10.0px</dimen>
...
<dimen name="x300">300.0px</dimen>
<dimen name="x301">301.0px</dimen>
<dimen name="x302">302.0px</dimen>
<dimen name="x303">303.0px</dimen>
<dimen name="x304">304.0px</dimen>
<dimen name="x305">305.0px</dimen>
<dimen name="x306">306.0px</dimen>
<dimen name="x307">307.0px</dimen>
<dimen name="x308">308.0px</dimen>
<dimen name="x309">309.0px</dimen>
<dimen name="x310">310.0px</dimen>
<dimen name="x311">311.0px</dimen>
<dimen name="x312">312.0px</dimen>
<dimen name="x313">313.0px</dimen>
<dimen name="x314">314.0px</dimen>
<dimen name="x315">315.0px</dimen>
<dimen name="x316">316.0px</dimen>
<dimen name="x317">317.0px</dimen>
<dimen name="x318">318.0px</dimen>
<dimen name="x319">319.0px</dimen>
<dimen name="x320">320px</dimen>
</resources>

然后lay_y.xml(高):

<?xml version="1.0" encoding="utf-8"?>
<resources><dimen name="y1">1.0px</dimen>
<dimen name="y2">2.0px</dimen>
<dimen name="y3">3.0px</dimen>
<dimen name="y4">4.0px</dimen>
...
<dimen name="y480">480px</dimen>
</resources>

我们直接在dimens里面写上具体的px值,而不是dp值,这样给定一个写死的值,在手机上运行的时候就是我们所写上的px值。可能到这里各位又有疑问了,这样的话怎么做到适配的呢?别着急,我们假设手机屏幕的宽度都是320某单位,那么我们将一个屏幕宽度的总像素数平均分成320份,每一份对应具体的像素就可以了。

我们可以创建多个values文件夹,多到覆盖市面上绝大多数流行的手机机型,并且用相应的比例计算好px值,由于现在是以320x480为基准的,所以如果我们要编写其他的values,要进行如下计算,比如我们以1920x1080为例:

由于基准是320x480,所以1080/320=3.375px,1920/480=4px,所以相应文件应该是这样的

lay_x.xml


<?xml version="1.0" encoding="utf-8"?>
<resources><dimen name="x1">3.375px</dimen>
<dimen name="x2">6.65px</dimen>
<dimen name="x3">10.125px</dimen>
...
<dimen name="x320">1080px</dimen>
</resources>

lay_y.xml

<?xml version="1.0" encoding="utf-8"?>
<resources><dimen name="y1">4px</dimen>
<dimen name="y2">8px</dimen>
<dimen name="y3">12px</dimen>
<dimen name="y4">16px</dimen>
...
<dimen name="y480">1920px</dimen>
</resources>

我们可以按照这种计算的方式补全当今市面上流行的机型。
但是我们怎么可能会去做这么蠢的事呢?肯定有工具类之类的东西!在此,再次感谢hongyang提供的工具类,工具类代码如下:


import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.PrintWriter;

public class MakeXml {

private final static String rootPath = "C:\\Users\\Administrator\\Desktop\\layoutroot\\values-{0}x{1}\\";

private final static float dw = 320f;
private final static float dh = 480f;

private final static String WTemplate = "[dimen name=\"x{0}\"]{1}px[/dimen]\n";
private final static String HTemplate = "[dimen name=\"y{0}\"]{1}px[/dimen]\n";

public static void main(String[] args) {
makeString(320, 480);
makeString(480,800);
makeString(480, 854);
makeString(540, 960);
makeString(600, 1024);
makeString(720, 1184);
makeString(720, 1196);
makeString(720, 1280);
makeString(768, 1024);
makeString(800, 1280);
makeString(1080, 1812);
makeString(1080, 1920);
makeString(1440, 2560);
}

public static void makeString(int w, int h) {

StringBuffer sb = new StringBuffer();
sb.append("[?xml version=\"1.0\" encoding=\"utf-8\"?]\n");
sb.append("[resources]");
float cellw = w / dw;
for (int i = 1; i < 320; i++) {
sb.append(WTemplate.replace("{0}", i + "").replace("{1}",
change(cellw * i) + ""));
}
sb.append(WTemplate.replace("{0}", "320").replace("{1}", w + ""));
sb.append("[/resources]");

StringBuffer sb2 = new StringBuffer();
sb2.append("[?xml version=\"1.0\" encoding=\"utf-8\"?]\n");
sb2.append("[resources]");
float cellh = h / dh;
for (int i = 1; i < 480; i++) {
sb2.append(HTemplate.replace("{0}", i + "").replace("{1}",
change(cellh * i) + ""));
}
sb2.append(HTemplate.replace("{0}", "480").replace("{1}", h + ""));
sb2.append("[/resources]");

String path = rootPath.replace("{0}", h + "").replace("{1}", w + "");
File rootFile = new File(path);
if (!rootFile.exists()) {
rootFile.mkdirs();
}
File layxFile = new File(path + "lay_x.xml");
File layyFile = new File(path + "lay_y.xml");
try {
PrintWriter pw = new PrintWriter(new FileOutputStream(layxFile));
pw.print(sb.toString());
pw.close();
pw = new PrintWriter(new FileOutputStream(layyFile));
pw.print(sb2.toString());
pw.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
}

}

public static float change(float a) {
int temp = (int) (a * 100);
return temp / 100f;
}
}

代码应该很好懂,我们将一个屏幕宽度分为320份,高度480份,然后按照实际像素对每一个单位进行复制,放在对应values-widthxheight文件夹下面的lax.xml和lay.xml里面,这样就可以统一所有你想要的分辨率的单位了,无论在什么分辨率下,x320都是代表屏幕宽度,y480都是代表屏幕高度。
当执行了上述代码之后,会在本地生成很多个values文件夹,我们把这些values拷贝到项目的res下面,如下所示:

这里写图片描述

注:

  分辨率为480x320的资源文件应放在res/values-480x320文件夹中;同理分辨率为1920x1080的资源文件应放在res/values-1920x1080文件夹中。(其中values-480x320是分辨率限定符)

必须在默认values里面也创建对应默认lay_x.xml和lay_y.xml文件,如下

lay_x.xml

<?xml version="1.0" encoding="utf-8">
<resources>
<dimen name="x1">1.0dp</dimen>
<dimen name="x2">2.0dp</dimen>
...
</resources>

因为对于没有生成对应分辨率文件的手机,会使用默认values文件夹,如果默认values文件夹没有(即没有对应的分辨率、没有对应dimen)就会报错,从而无法进行屏幕适配。
(注意对应单位改为dp,而不同于上面的px。因为不知道机型的分辨率,所以默认分辨率文件只好默认为x1=1dp以保证尽量兼容(又回到dp老方法了),这也是这个解决方案的一个弊端)

而我们怎么用呢?
工作中只需要根据UI妹子给出的某一个分辨率设计图的尺寸,然后找到对应像素数的单位,然后设置给控件就可以了,如下

<TextView
     android:text="@string/hello_world"
     android:layout_width="@dimen/x160"
     android:layout_height="@dimen/y160"/>

关于这种适配方案的详情,请查看hongyang的博客 Android 百分比适配。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值