android drawable 资源文件

摘要:
我已经在Android上工作了一段时间,但我仍然没有深入了解很多细节。我对Android中可绘制文件夹的使用没有深入了解。例如,在低分辨率手机上,Android会选择ldpi文件夹下的图片。但是,如果在ldpi文件夹下找不到相关的资源文件,安卓系统将首先从hdpi文件夹中选择文件,然后缩放图像资源并在屏幕上显示;如果没有hdpi文件夹,则会在默认的可绘制文件夹中找到它。

做Android有段时间了,但是好多细节还没有深入理解,关于Android中drawable文件夹的使用理解的就不是很深入。

Android为开发者提供了两种解决适配问题的方法,第一种方式是使用dip的单位,另一种方法是使用不同的drawable文件夹,今天就详细说下不同文件夹的区别

Android中提供了三个存放图片的文件夹,分别为hdpi,mdpi,ldpi,google文档上说,Andriod系统会根据手机屏幕的大小及屏幕密度去选择不同文件夹下的图片资源,以此来实现在不同大小不同屏幕分辨率下适配的问题。

比如在一个低分辨率的手机上,Android就会选择ldpi文件夹下的图片,但是如果没有在ldpi的文件夹下找见相关的资源文件,Android系统会首先从hdpi文件夹中选择文件,然后对图片资源进行缩放处理,显示在屏幕上;如果hdpi文件夹下也没有的话,会在默认的drawable文件夹中寻找。

明白以上内容,就很好解释图片放错文件夹,显示大小不同的问题了。如图

图1

android drawable 资源文件第1张

图2

android drawable 资源文件第2张

出现图二的原因是将放在hdpi下的图片放到了默认的文件夹下

本身图片是同一张图片,由于没有在hdpi文件夹中找到对应图片,系统在默认文件夹下找见了图片资源,但是这时系统会认为改图适用于中等分辨率的屏幕上,如果直接放到高分辨率的手机上不能适配,所以系统会自动的将图片放大,所以虽然是同一张图片,但是现实出来就一个正常效果,一个放大效果。

同理,如果同一张图片,放置在ldpi的文件夹下,在低分辨率的手机上显示正常,但是如果放在hdpi文件夹中,系统认为该图是为高分辨率显示的,要将图片缩小处理,所以显示出来的效果就是图变小了。

所以我们在平时要注意,明明都是一张图片,只是放在不同的文件夹中,显示出来的效果就很不同,原因就是我们对Android还不够了解。

1.drawable-(hdpi,mdpi,ldpi)的区别
dpi是“dot per inch”的缩写,每英寸像素数。
四种密度分类: ldpi (low), mdpi (medium), hdpi (high), and xhdpi (extra high)
一般情况下的普通屏幕:ldpi是120,mdpi是160,hdpi是240,xhdpi是320。
3.drawable-(hdpi,mdpi,ldpi)和WVGA,HVGA,QVGA的联系
hdpi里面主要放高分辨率的图片,如WVGA (480x800),FWVGA (480x854)
mdpi里面主要放中等分辨率的图片,如HVGA (320x480)
ldpi里面主要放低分辨率的图片,如QVGA (240x320)

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

DisplayMetrics metrics = new DisplayMetrics();

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

display.getMetrics(metrics);

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

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

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

  private voidinitResolutionStr(Context context) {
        if (ApiConfig.getResolutionStr() == null || ApiConfig.getResolutionStr().equals("")) {
            WindowManager winMgr =(WindowManager) context.getApplicationContext().getSystemService(Context.WINDOW_SERVICE);
            Display display =winMgr.getDefaultDisplay();
            int height =display.getHeight();
            int width =display.getWidth();
            String resolution = height > width ? height + "x" + width : width + "x" +height;
            ApiConfig.setResolutionStr(resolution);
            //densityDpi = 120dpi is ldpi, densityDpi = 160dpi is mdpi,
            //densityDpi = 240dpi is hdpi, densityDpi = 320dpi is xhdpi
            DisplayMetrics dm = newDisplayMetrics();
            getWindowManager().getDefaultDisplay().getMetrics(dm);
            int densityDpi =dm.densityDpi;
            ApiConfig.setDensityDpi(densityDpi);
        }
    }

如果需要为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

Android上常见度量单位:
px(像素):屏幕上的点,绝对长度,与硬件相关。
in(英寸):长度单位。
mm(毫米):长度单位。
pt(磅):1/72英寸,point。
dp(与密度无关的像素):一种基于屏幕密度的抽象单位。在每英寸160点的显示器上,1dp = 1px。
dip:Density-independent pixel,同dp相同。
sp:在dp的基础上,还与比例无关,个人理解为是一个矢量图形单位。

引入dp/dip的原因:
过去,程序员通常以像素为单位设计计算机用户界面。例如,定义一个宽度为300像素的表单字段,列之间的间距为5个像素,图标大小为16×16像素 等。这样处理的问题在于,如果在一个每英寸点数(dpi)更高的新显示器上运行该程序,则用户界面会显得很小。在有些情况下,用户界面可能会小到难以看清 内容。与分辨率无关的度量单位可以解决这一问题。
如何计算密度(请参照原帖:http://www.devdiv.com/thread-28610-1-1.html);
1.标准是240*320画在1.5*2平方inch上。那么像每平方英寸有240*320/(1.5*2)=25600点,也就是一平方英寸的像素点为25600,所以dpi取为它的平方根160;如果你的dpi是120,那么它的密度就是0.75.
2.密度不只是与width有关,还与height有关,所以不管width是1.8还是1.3,它的密度都有可能是1;比如width是1.8,只要它 的height是3/1.8的话,如果pixel为240*320的话,它的密度仍旧是1;同样如果width为1.3,只要它的 height为3/1.3的话,像素点为240*320,则密度也是1.
3.320*480/(1.5*2)得到单位平方英寸的点为51200,所以单位平方英寸是240*320画在1.5*2屏幕的2倍。但是这是平方英寸啊,算密度的时候要开平方的啊,所以应该是2开平方,是1.414吧,大致密度为1.5。
如何做到与密度无关:
如果屏幕密度为160,这时dp和sp和px是一样的。1dp=1sp=1px,但如果使用px作单位,如果屏幕大小不变(假设还是3.2寸),而屏 幕密度变成了320。那么原来TextView的宽度设成160px,在密度为320的3.2 寸屏幕里看要比在密度为160的3.2寸屏幕上看短了一半。但如果设置成160dp或160sp的话。系统会自动将width属性值设置成320px的。 也就是160 * 320 / 160。其中320 / 160可称为密度比例因子。也就是说,如果使用dp和sp,系统会根据屏幕密度的变化自动进行转换。官方文档总结的计算公式为:pixels = dps * (density /160).

免责声明:文章转载自《android drawable 资源文件》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Qt QSplitter任意拆分窗口十一.Java中的集合(set,map,list)下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

如何使用华为机器学习服务和Kotlin实现语音合成

1. 引言   你曾遇到过这种情况吗?一本小说太长,要花很长时间阅读,但如果有app能自动为你阅读,就会省时很多。因此,将文本转换成语音的工具应运而生。华为机器学习服务(HUAWEI ML Kit)具备语音合成(Text To Speech, TTS)功能,能让app快速实现从文本到语音的转换。TTS可以将文本转换成人声。这也可以通过默认方法实现,但这些方...

ISD9160学习笔记04_ISD9160音频编码代码分析

前言 录音例程涉及了录音和播放两大块内容,上篇笔记说了播放,这篇就来说说录音这块,也就是音频编码这部分功能。 上篇笔记中的这段话太装逼了,我决定再复制下,嘿嘿。 “我的锤子便签中有上个月记下的一句话,“斯蒂芬·平克说,写作之难,在于把网状思考,用树状结构,体现在线性展开的语句里。”这篇代码解析也有类似的困难,代码的网状结构,如何用文章这种线性载体来体现。”...

Android中app卡顿原因分析示例

在知乎回答了一个“为什么微博的app在iPhone比Android上流畅”的问题。后面部分是一个典型的动画卡顿的性能分析过程,因此帖在这里。有编程问题可以在这里交流。知乎链接。 ========================================================= 我来说下我所知道的事情。我不知道iOS为什么流畅,但我知道一些A...

iOS App 重签名

http://blog.csdn.net/u010545480/article/details/71598459 iOS重签名两种形式: 个人开发者账号的重签名:需要发布证书(.cer文件)和adhoc文件(.mobileprovision后缀的描述文件) 个人账户发布到appStore的重签名:需要发布上线发布证书(.cer文件)和上线发布的描述文件(....

Nodejs Express笔记

Express做服务器,主要考虑到可能存在的高并发,js写起来也并不麻烦,环境搭建也异常简单。开车~ 由于主要目的就是用于生产环境,所以肯定不能用高版本的Nodejs,选LTS,没错的。 一.安装 这里我的示例工程名称为:expressDemo 1.打开你的cmd,创建你的工程文件夹: mkdir expressDemo &&cd expr...

DevOps开发运维与持续集成相关知识

https://blog.csdn.net/boonya/article/details/74932050?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522158976841719725256735968%2522%252C%2522scm%2522%253A%252220140713.130...