在新建一个Android项目时,在res目录下会自动生成几个drawable文件夹,drawable-ldpi,drawable-mdpi,drawable-hdpi,一直以来都对此不太清楚,图片应该放到哪个文件夹下面,有什么不同的影响?以前一直都是干脆再新建一个不带后缀的drawable文件夹,图片都丢进去,现在决定彻底搞清楚这个事儿。
1、基础知识
density(密度):简单的说就是一个比例系数,用来将Dip(设备独立像素)转换成实际像素px。具体公式是:
px = dip*density+0.5f;
densityDpi:The screen density expressed asdots-per-inch.简单的说就是densityDpi = density*160
drawable文件夹除了这些密度类的后缀,还有例如-en表示英语环境,-port表示用于竖屏等,这里不做讨论,可以参考http://developer.android.com/guide/topics/resources/providing-resources.html
另附一张官方的屏幕大小与密度的对应表:
2、为什么要缩放
为了适应这么多乱七八糟的设备,Android官方就建议大家针对不同密度的设备制作不同的图片:
36x36 (0.75x) for low-density
48x48 (1.0xbaseline) for medium-density
72x72 (1.5x) for high-density
96x96 (2.0x) for extra-high-density
180x180 (3.0x) for extra-extra-high-density
192x192 (4.0x) for extra-extra-extra-high-density(launcher icon only; see note above)
问题就来了,如果你不听建议,就整了一种密度的图片呢?那么当遇到不同密度的手机时,系统就会好(无)心(情)的对你的图进行缩放了,按文档的说法,这是为了你的应用更好看。
缩放公式:缩放后大小= 图片实际大小 × (手机密度/图片密度)
其中图片密度由图片所在drawable文件夹的后缀决定
比如一张100X100的图放在mdpi文件夹里,在hdpi的手机上,缩放后大小= 100 * (1.5/1) = 150
就成了一张150*150的图片。
3、android:anyDensity
(网上有些博客对这个属性的解释是错的,这里特意提一下)
在AndroidManifest.XML文件里可以设置这么一个属性:<supports-screens android:anyDensity="true"/>
不设置的话默认为true。
按文档的说法(http://developer.android.com/guide/practices/screens_support.html),这个值如果为true,缩放机制为预缩放(pre-scaling),如果为false,缩放机制为自动缩放(auto-scaling),区别是预缩放是在读取时缩放,自动缩放时在绘制的时候缩放,从速度来说预缩放要快一些。另外还有一个很重要的区别,就是如果<supports-screensandroid:anyDensity="false"/>,应用在请求屏幕参数时,系统会欺骗应用,告诉它你现在跑在一个density为1的手机上,而不管手机实际density是多少,比如实际手机是hdpi,尺寸480*800,系统会告诉应用屏幕尺寸是320(400/1.5)*533(800/1.5),然后当应用将图片绘制到(10,10)到(100,100)的区域时,系统会将其转换到(15,15)到(150,150),这时如果你去直接操作这些缩放后的图,就会出些不可预期的问题。总之就是建议不要把这个属性设为false。
按我的个人理解,这个false就是告诉系统这个应用不支持多分辨率,于是系统就认为你只支持默认分辨率(mdpi),系统就会给你虚拟一个mdpi的设备,让你显示在上面,系统再从这上面拉伸或者缩小到实际设备上。这样既速度慢又效果不好,所以就不推荐。
4、各目录读取优先级
假设项目内有如下drawable目录:
drawable
drawable-nodpi
drawable-ldpi
drawable-mdpi
drawable-hdpi
drawable-xhdpi.
(如果不想系统对图片进行缩放,可以把图片放到drawable-nodpi目录下,从该目录读的图片系统不会进行任何缩放。)
(由下文可知,不带后缀的drawable目录下的图片按照drawable-mdpi处理.)
如果这些目录下都可能有一张同名图片,那系统该读哪一张呢?
毋庸置疑,如果手机密度相同的相应的密度目录下有该图片,那就是它了,如果没有呢?
跟踪源码看看系统是如何选择图片的(基于android4.4.2):
ImageView.java:
setImageResource()
resolveUri()
Resources.java:
getDrawable()
getValue()
AssetManager.java:
getResourceValue()
native loadResourceValue()
frameworks/base/core/jni/android_util_AssetManager.cpp:
android_content_AssetManager_loadResourceValue()
frameworks/base/libs/androidfw/AssetManager.cpp:
AssetManager::getResources()
AssetManager::getResTable()
frameworks/base/libs/androidfw/ResourceTypes.cpp:
ResTable::getResource()
ResTable::getEntry()
文章出处:http://blog.csdn.net/yellowcath/article/details/39641445
相关推荐
这个"wechat-sdk-android-without-mta-5.5.8.zip"压缩包包含了版本号为5.5.8的SDK,主要用于实现如分享网页、分享音乐、发送好友消息以及用户授权登录等功能。值得注意的是,此版本的SDK没有包含MTA(Mobile ...
3. `res`目录:包含了应用的资源文件,如布局文件、图片、字符串等。 4. `build.gradle`文件:定义了项目的构建配置,包括依赖项、版本信息等。 二、核心技术 1. **蓝牙低功耗(BLE)通信**:应用的核心功能之一是...
导入`android-support-v7-appcompat`库的方法通常是通过Android Studio的Gradle依赖机制。在`build.gradle`文件中添加如下依赖: ```groovy dependencies { implementation 'com.android.support:support-v7:版本号...
总之,Android图片裁剪涉及多个方面,包括图像处理、手势识别和UI交互。通过掌握这些技术,开发者能够创建功能丰富的图片编辑应用,提升用户体验。在实际开发中,还需要考虑性能优化和兼容性问题,以确保应用在不同...
《深入解析Android Camera2Basic-master源码》 在Android应用开发中,相机功能是一个不可或缺的部分。随着技术的发展,Android系统提供了Camera2 API,为开发者提供了更高级、更灵活的相机控制。本文将深入剖析...
在Android开发中,用户界面与用户体验是至关重要的部分,特别是在涉及到多媒体内容如图片和视频时。"android-图片-视频-选择器" 是一个专为Android应用设计的库,它允许用户方便地从设备的媒体库中选择图片和视频,...
综上所述,TakePhoto是一个强大的Android图片处理库,它简化了图片选择、裁剪和预览的流程,提高了开发效率。通过合理的配置和使用,开发者可以为用户提供更加流畅、便捷的图片操作体验。而TakePhotoDemo-master作为...
针对Android平台,"usb-serial-for-android"是一个至关重要的库,它允许Android设备通过USB接口与各种串口设备进行通信。该库源于https://github.com/mik3y/usb-serial-for-android,由开发者mik3y维护,为开发者...
AhMyth是一个功能强大的Android恶意软件,允许远程管理员执行多种操作,如监听通话、获取GPS位置、读取短信、控制摄像头、记录键盘输入等。这个工具的主要目标是帮助安全专家理解恶意软件的工作原理,并提供了一个...
"Android Smart Image View" 是一个专为Android平台设计的开源图片查看框架,旨在提供高效、流畅的图片浏览体验。这个框架在GitHub上被广泛分享和使用,为开发者提供了丰富的功能和自定义选项,以满足不同项目的图像...
在Android开发中,异步加载图片并进行缓存是一个常见的需求,特别是在...在实际开发中,结合`UniversalImageLoader`的源代码学习,可以深入理解Android的多线程处理和图片加载机制,对提升Android开发技能大有裨益。
"Android-auto-merge-language"工具正是为了解决这一问题而设计的,它是一个自动化工具,能够有效地管理和合并项目的多语言资源,尤其是strings.xml文件中的文案。 这个工具名为"auto-merge-language",它的主要...
在Android应用开发中,高效地处理图像资源是至关重要的,特别是在用户界面中显示大量图片时。"Android-Universal-Image-Loader"库就是一个强大的解决方案,它专为Android平台设计,用于实现图片的异步加载、缓存和...
在SDK的使用过程中,开发者还需要了解SDK Manager,这是一个用于下载和管理Android平台、工具、模拟器镜像和其他开发资源的工具。通过SDK Manager,你可以方便地获取到API Level 21的相关文件,包括系统图像、开发者...
总之,"android Tif Tiff格式的图片转换成bitmap 读取TIFF传真格式图片DEMO下载"这个资源提供了一个实用的方法,帮助开发者在Android应用中处理TIF/TIFF格式的图像,通过SeeTiff库实现图片的读取和转换,让Android...
它支持从网络、SD卡、本地资源或应用资源等多种来源加载图片,并且具备图片的缓存机制,包括内存缓存和磁盘缓存,有效减少了网络请求,提高了用户体验。此外,UIL还提供了图片的显示策略,如根据网络状态选择加载...
它是一个开源的UI组件,专为Android应用设计,用于异步加载网络或本地资源的图片,同时支持图片缓存,极大地提升了用户体验。 一、项目概述 Android-Universal-Image-Loader是一个高度可定制的库,旨在简化Android...
6. **权限管理改进**:在Android 21中,部分敏感权限可以在运行时动态请求,而不是在安装时一次性获取,增强了用户对隐私的控制。 7. **OpenGL ES 3.1支持**:这一版本增加了对OpenGL ES 3.1图形库的支持,为游戏和...
1. **传感器数据处理**:在"android-motion-detection-master"项目中,开发者可能使用了Android的Sensor API来获取加速度计和陀螺仪的数据,这些传感器可以帮助确定设备在三维空间中的运动状态。通过对连续传感器...
本教程将详细讲解如何在Android应用中读取和解析KML文件,并将其内容显示在高德地图上。 首先,我们需要在项目中引入高德地图SDK。在build.gradle文件中添加高德地图的依赖库,例如: ```groovy dependencies { ...