我改drawable ldpi-hdpi里面图片的名字, 为什么drawable ldpi-ldpi,-mdpi,-xhdpi里面图片的名字也会跟着改啊

1)">1)">1" ng-class="{current:{{currentPage==page}}}" ng-repeat="page in pages"><li class='page' ng-if="(endIndex<li class='page next' ng-if="(currentPage
相关文章阅读您所在的位置: &
android开发图片分辨率问题解决方案
android开发图片分辨率问题解决方案
eoe Android开发者社区
一直受到android开发图片分辨率问题困扰.drawable-(xdpi,hdpi,mdpi,ldpi,nodpi)这几个文件夹到底怎么放图片呢?
dpi是什么呢?
dpi是&dot per inch&的缩写,每英寸像素数。
四种密度分类: ldpi (low), mdpi (medium), hdpi
(high), and xhdpi (extra
一般情况下的普通屏幕:ldpi是120,mdpi是160,hdpi是240,xhdpi是320。
dpi计算公式
DPI=对角线的像素值/尺寸
手机屏幕分辨率和屏幕密度是两码事!并不是800*480的分辨率手机图片就应该放在hdpi文件夹中。5.0英寸 800*480属于mdpi
也可以通过代码获取:
DisplayMetrics&metric&=&new&DisplayMetrics();&&&&&&&&getWindowManager().getDefaultDisplay().getMetrics(metric);&&&&&&&&int&width&=&metric.widthP&&&&&&&&&&int&height&=&metric.heightP&&&&&&&&&&float&density&=&metric.&&&&&&&&&&int&densityDpi&=&metric.densityD&&&
android会根据屏幕本身的尺寸与密度特性,自动载入对应的资源,并把它们从逻辑像素(DIP,用于定义界面布局)转换成屏幕上的物理像素。
首先看看 系统是如何通过Resources的getDrawable(int id)方法找图片的
public&Drawable&getDrawable(int&id)&throws&NotFoundException&{&&&&&&&&&TypedValue&&&&&&&&&&synchronized&(mAccessLock)&{&&&&&&&&&&&&&value&=&mTmpV&&&&&&&&&&&&&if&(value&==&null)&{&&&&&&&&&&&&&&&&&value&=&new&TypedValue();&&&&&&&&&&&&&}&else&{&&&&&&&&&&&&&&&&&mTmpValue&=&null;&&&&&&&&&&&&&}&&&&&&&&&&&&&getValue(id,&value,&true);&&&&&&&&&}&&&&&&&&&Drawable&res&=&loadDrawable(value,&id);&&&&&&&&&synchronized&(mAccessLock)&{&&&&&&&&&&&&&if&(mTmpValue&==&null)&{&&&&&&&&&&&&&&&&&mTmpValue&=&&&&&&&&&&&&&&}&&&&&&&&&}&&&&&&&&&return&&&&&&}&&&
TypedValue
我们可以理解为存储数据的类型,主要被Resouces使用于持有的资源值
通过getValue(id,value,true)方法去得到该id的资源的属性
public&void&getValue(int&id,&TypedValue&outValue,&boolean&resolveRefs)&&&&&&&&&&&&&throws&NotFoundException&{&&&&&&&&&boolean&found&=&mAssets.getResourceValue(id,&0,&outValue,&resolveRefs);&&&&&&&&&if&(found)&{&&&&&&&&&&&&&return;&&&&&&&&&}&&&&&&&&&throw&new&NotFoundException(&Resource&ID&#0x&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&+&Integer.toHexString(id));&&&&&}&&&
最后通过loadDrawable(value,
id)得到drawable,该方法到了底层的C代码,大致意思就是通过TypedValue中的方法和属性就可以获得我们想要的属性值,然后加载图片
OK,下面来做个实验.
试验一: 手机是.3英寸 属于xdpi 图片分辨率为960*640 (按正常图片不缩放 图片放在手机里面
应该不会充满 整个手机) 我把图片放在不
文件夹 加载时间(ms) 图片显示 说明
drawable 311 充满屏幕 图片有拉伸
drawable-nodpi 130 未充满屏幕
图片显示正常
drawable-ldpi 442 充满屏幕 图片有拉伸
drawable-mdpi 383 充满屏幕
图片有拉伸
drawable-hdpi 226 充满屏幕 图片有拉伸
drawable-xhdpi 109 未充满屏幕 图片显示正常
试验二: 手机是800*480 4.3英寸 属于hdpi 图片分辨率为960*640 (按正常图片不缩放 图片放在手机里面 应该充满 整个手机)
我把图片放在不同drawable文件夹中
文件夹 加载时间(ms)
图片显示 说明
drawable 290 充满屏幕 图片拉伸
drawable-nodpi 127 充满屏幕
图片显示正常
drawable-ldpi 369 充满屏幕 图片拉伸
drawable-mdpi 346 充满屏幕
drawable-hdpi 124 充满屏幕 图片显示正常
drawable-xhdpi 241 未充满屏幕 图片缩放
drawable-nodpi 中
图片不会被拉伸
系统在得到图片时候,会先到设备对应的dpi的文件夹下去去找资源文件,找到后应该不会做缩放直接返回图片。
如果没有在对应的dpi文件夹中找到,回去其他文件夹中查找,找到后会做相应的缩放。
在高dpi找到的图片会缩放,在低dpi的会拉伸
还有就是 源码中可以看出 loadDrawable的过程实在C层做的。通过系统资源id加载会比java层直接加载图片更便捷。【编辑推荐】【责任编辑: TEL:(010)】
关于&&的更多文章
Android Studio是一套面世不久的IDE(即集成开发环境),免费向
讲师: 98人学习过讲师: 122人学习过讲师: 32人学习过
既然强大的Android Studio来了,有什么理由不去用呢?
你心爱的那些移动游戏为什么会如此吸引你?就是那些你
本专题意在帮助想要了解Android的人能快速上手Android
今天,圣诞的到来,相信大家都收到礼物了吧,如果没收
本书从一个网站制作过程入手,详细介绍基于ASP技术建设网站的全过程。全书共10章。第1章,网站制作规划与流程;第2章,IIS安装与
Windows Phone专家
Android开发专家
51CTO旗下网站查看: 4968|回复: 6
准备多分辨率图片drawable(hdpi,ldpi,mdpi)却根本没用???
主题帖子e币
没有eoe的账号,级别还太低,出门如何吹牛逼?
才可以下载或查看,没有帐号?
我的程序打算照顾多分辨率的手机,我发现如果是2.0或更高系统的话,我只需要准备hdpi的图片就可以了。在分辨率低的机器上,系统会自己转换图片为相应比例的低分辨率版本,比如我的图片是386*386,运行在800*480的模拟器里就原始大小显示,运行在320*240的模拟器里,图片尺寸就变为193*193,这样很不错。
但是当我使用1.6版本系统的模拟器,以320*240分辨率现实时,图片就不会自动缩小了,还保持原来的尺寸,以至于超出屏幕。
于是我就尝试自己缩小图片,然后将缩小后的图片放置在drawable-ldpi目录中,然后再运行,但运行结果仍然是使用了原来尺寸的大图!也就是说我放置在ldpi目录里的图根本没被用到= =!
这是为啥呢?是不是1.6版还不支持ldpi、mdpi目录??
主题帖子e币
经过测试,1.6版 QVGA分辨率读取的竟然是mdpi目录里的图啊,这和网上说的不一致啊,那么ldpi得什么分辨率读取呢?HVGA又该读哪个目录的图呢??
主题帖子e币
dpi和分辨率没有必然的联系,见上图
关于多分辨率的支持请参见SDK-& Dev Guide-& Best practices-& Supporting Multiple Screens
本帖子中包含更多资源
才可以下载或查看,没有帐号?
主题帖子e币
另,Android从1.6开始支持多分辨率。1.5及以下不支持。
主题帖子e币
dpi和分辨率没有必然的联系,见上图
关于多分辨率的支持请参见SDK-& Dev Guide-& Best practices-& Supp ...
kearnel 发表于
& & 呃,那通常是和屏幕物理尺寸相关的?
有什么办法能针对分辨率而非dpi供图吗?
主题帖子e币
dpi和分辨率没有必然的联系,见上图
关于多分辨率的支持请参见SDK-& Dev Guide-& Best practices-& Supp ...
kearnel 发表于
& & 找到方法了:
谢谢你的帮助。
主题帖子e币
我现在用的是320*240模拟器,已经确定了dpi为120,也就是低dpi,但是为什么还是用的mdpi里面的图片呢?
推荐阅读热门话题
62423179517392156166416581546150614101077692579563553715
15&分钟前16&分钟前17&分钟前17&分钟前19&分钟前28&分钟前29&分钟前半小时前半小时前半小时前半小时前
特别关注 /3
从基础入门到熟练精通,9个阶段知识体系图指引你逐步提升~还有技术问答+讲师互动,每天给你新惊喜!
专为零基础定制,从基础到精通,只需3个月轻松搞定!将iOS开发学到极致,月薪过万不是梦!马上开始学习吧!
本期eoe特邀张老师为大家讲解Android Studio技术问题,大家有什么Android疑问尽快提出来吧!
活动时间:1月12日——1月18日
Powered by
扫一扫 关注eoe官方微信Android杂谈--关于Android的nodpi,xhdpi,hdpi,mdpi,ldpi-Android-第七城市
Android杂谈--关于Android的nodpi,xhdpi,hdpi,mdpi,ldpi
关于Android的nodpi,xhdpi,hdpi,mdpi,ldpi首先是几个基本概念:1.屏幕尺寸Screen size即显示屏幕的实际大小,按照屏幕的对角线进行测量。为简单起见,Android把所有的屏幕大小分为四种尺寸:小,普通,大,超大(分别对应:small, normal, large, and extra large).应用程序可以为这四种尺寸分别提供不同的自定义屏幕布局-平台将根据屏幕实际尺寸选择对应布局进行渲染,这种选择对于程序侧是透明的。2.屏幕长宽比Aspect ratio长宽比是屏幕的物理宽度与物理高度的比例关系。应用程序可以通过使用限定的资源来为指定的长宽比提供屏幕布局资源。3.屏幕分辨率Resolution在屏幕上显示的物理像素总和。需要注意的是:尽管分辨率通常用宽x高表示,但分辨率并不意味着具体的屏幕长宽比。在Andorid系统中,应用程序不直接使用分辨率。4.密度Density根据像素分辨率,在屏幕指定物理宽高范围内能显示的像素数量。在同样的宽高区域,低密度的显示屏能显示的像素较少,而高密度的显示屏则能显示更多的像素。屏幕密度非常重要,因为其它条件不变的情况下,一共宽高固定的UI组件(比如一个按钮)在在低密度的显示屏上显得很大, 而在高密度显示屏上看起来就很小。为简单起见,Android把所有的屏幕分辨率也分为四种尺寸:小,普通,大,超大(分别对应:small, normal, large, and extra large).应用程序可以为这四种尺寸分别提供不同的资源-平台将透明的对资源进行缩放以适配指定的屏幕分辨率。5.设备独立像素Density-independent pixel (dp)应用程序可以用来定义UI组件的虚拟像素单元,通过密度无关的方式来描述布局尺寸和位置。一个设备独立像素相当于一个160 dpi屏幕上的物理像素。在程序运行时,系统根据屏幕的实际密度透明的处理任何需要缩放的设备独立像素单元,设备独立像素转换成屏幕实际像素的换算很简单:pixels = dps * (density / 160).例如在240 dpi的屏幕上,1个设备独立像素等于1.5物理像素.为确保UI组件在不同的屏幕都能合适的展示,强烈建议使用设备独立像素单元来定义你的应用程序UI。drawable- hdpi、drawable- mdpi、drawable-ldpi的区别:  (1)drawable-hdpi里面存放高分辨率的图片,如WVGA (480x800),FWVGA (480x854)  (2)drawable-mdpi里面存放中等分辨率的图片,如HVGA (320x480)  (3)drawable-ldpi里面存放低分辨率的图片,如QVGA (240x320)  系统会根据机器的分辨率来分别到这几个文件夹里面去找对应的图片。四种屏幕尺寸分类:: small, normal, large, and xlarge四种密度分类: ldpi (low), mdpi (medium), hdpi (high), and xhdpi (extra high)需要注意的是: xhdpi是从&Android&2.2 (API Level 8)才开始增加的分类.xlarge是从Android 2.3 (API Level 9)才开始增加的分类.DPI是&dot per inch&的缩写,每英寸像素数。一般情况下的普通屏幕:ldpi是120,mdpi是160,hdpi是240,xhdpi是320。参考:/images/screens_support/screens-ranges.png两种获取屏幕分辨率信息的方法:DisplayMetrics metrics = new DisplayMetrics();Display display = activity.getWindowManager().getDefaultDisplay();display.getMetrics(metrics);//这里得到的像素值是设备独立像素dp//DisplayMetrics metrics=activity.getResources().getDisplayMetrics(); 这样获得的参数信息不正确,不要使用这种方式。不能使用android.content.res.Resources.getSystem().getDisplayMetrics()。这个得到的宽和高是空的。如果需要为Android pad定制资源文件,则res目录下的目录可能为:drawabledrawable-ldpidrawable-mdpidrawable-hdpidrawable-xhdpidrawable-nodpidrawable-nodpi-drawable-nodpi-drawable-nodpi-800&480valuesvalues-ldpivalues-mdpivalues-hdpivalues-xhdpivalues-nodpivalues-nodpi-values-nodpi-values-nodpi-800&480参考:/guide/practices/screens_support.html转自:/archives//205.htmlAndroid上常见度量单位:  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)更高的新显示器上运行该程序,则用户界面会显得很小。在有些情况下,用户界面可能会小到难以看清 内容。与分辨率无关的度量单位可以解决这一问题。如何计算密度(请参照原帖:/thread-.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).posts - 8,&
comments - 0,&
trackbacks - 0
转发:http://blog.csdn.net/singwhatiwanna/article/details/
Android中支持许多资源,包括图片(Bitmap),对应于bitmap的文件夹是drawable,除了drawable,还有drawable-ldpi、drawable-mdpi、drawable-hdpi、drawable-xhdpi、drawable-xxhdpi等,同一张图片放到上面不同的文件夹中是有区别的,比如一张100 * 100像素大小的图片,分别放在上述各个文件夹中,然后将其设置为ImageView(假设宽高都是wrap_content)的图片,那么这个ImageView的大小是多少呢,或者说图片的大小是多少呢?本文主要和大家阐述这个问题。当然,还有一个问题,如果在上述各个文件夹中都放置一张相同的图片(内容相同,尺寸不同),那么系统会选择加载哪一张图片呢?这个问题,系统有内部的选择机制,简单来说:系统会选择最接近手机屏幕密度的图片,由于这个问题和本文主题关系不是很大,所以暂时不讨论此类问题。
先介绍一些概念:
屏幕密度:单位英寸面积上的像素点数
ldpi: & 屏幕密度为120的手机设备
mdpi: 屏幕密度为160的手机设备(此为baseline,其他均以此为基准,在此设备上,1dp = 1px)
hdpi: &屏幕密度为240的手机设备
xhdpi: 屏幕密度为320的手机设备
xxhdpi:屏幕密度为480的手机设备
图片大小以及dp和px关系一览表
说明:根据上表,我们应该很容易算出一张图片在不同手机上的宽和高是多少。
从上表可以得出如下结论
1. 图片放在drawable中,等同于放在drawable-mdpi中,原因为:drawable目录不具有屏幕密度特性,所以采用基准值,即mdpi
2. 图片放在某个特定drawable中,比如drawable-hdpi,如果设备的屏幕密度高于当前drawable目录所代表的密度,则图片会被放大,否则会被缩小
  放大或缩小比例 = 设备屏幕密度 / drawable目录所代表的屏幕密度
3. 为了更全面的适配所有设备,我们应该提供一套针对主流屏幕密度的图片(目前为hdpi或xhdpi),其他密度通过系统自动缩放得到图片
阅读(...) 评论()

我要回帖

更多关于 res drawable hdpi 的文章

 

随机推荐