在新建一个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
相关推荐
1. 获取资源:首先,你需要找到名为"android-studio-ide-193.6514223-windows.exe"的压缩包文件,这是Android Studio的安装程序。确保你从官方渠道或可信的来源获取此文件,以保证安全。 2. 解压资源:下载完成后,...
5. **图片质量控制**:可以根据需求调整加载的图片质量,平衡性能和资源消耗。 6. **多种显示选项**:可以设置图片的显示效果,如圆角、模糊等。 7. **强大的API**:提供了丰富的API供开发者自定义加载和显示逻辑。 ...
总的来说,"wechat-sdk-android-without-mta-5.3.1.jar.zip"提供了无MTA模块的微信SDK,为开发者提供了在Android应用中无缝集成微信功能的可能。开发者需要理解SDK的核心功能、集成流程以及如何在实际项目中有效利用...
为了解决这一问题,开发者们常常会使用第三方库,如"Android-Universal-Image-Loader",这是一个强大且灵活的图片加载、缓存库,旨在优化Android应用的图片处理机制。 Android-Universal-Image-Loader库的核心功能...
导入`android-support-v7-appcompat`库的方法通常是通过Android Studio的Gradle依赖机制。在`build.gradle`文件中添加如下依赖: ```groovy dependencies { implementation 'com.android.support:support-v7:版本号...
总之,Android图片裁剪涉及多个方面,包括图像处理、手势识别和UI交互。通过掌握这些技术,开发者能够创建功能丰富的图片编辑应用,提升用户体验。在实际开发中,还需要考虑性能优化和兼容性问题,以确保应用在不同...
本资源为"android-studio-bundle-141.1903250-windows",确保了纯净无干扰的下载体验,旨在帮助开发者快速获取并安装Android Studio。 一、Android Studio 的主要特点 1. **集成开发环境(IDE)**:Android Studio ...
在Android开发中,数组资源是十分重要的组成部分,用于存储和管理数据。本篇文章将深入探讨`string-array`和`integer-array`的用法,以及如何在XML中定义和使用它们。 首先,`string-array`是Android中用于存储字符...
在Android开发中,用户界面与用户体验是至关重要的部分,特别是在涉及到多媒体内容如图片和视频时。"android-图片-视频-选择器" 是一个专为Android应用设计的库,它允许用户方便地从设备的媒体库中选择图片和视频,...
"Android Smart Image View" 是一个专为Android平台设计的开源图片查看框架,旨在提供高效、流畅的图片浏览体验。这个框架在GitHub上被广泛分享和使用,为开发者提供了丰富的功能和自定义选项,以满足不同项目的图像...
【Android-android-image-picker:一个强大的Android图片选择器】 在Android应用开发中,用户往往需要有选择、浏览和处理图片的功能,比如在社交应用中上传个人照片或者在电商应用中查看商品图片。`android-image-...
"Android-auto-merge-language"工具正是为了解决这一问题而设计的,它是一个自动化工具,能够有效地管理和合并项目的多语言资源,尤其是strings.xml文件中的文案。 这个工具名为"auto-merge-language",它的主要...
通过这个项目,开发者可以学习到如何使用Android Studio构建用户界面,处理图片资源,以及实现与服务器的交互(如果有的话)来获取菜品数据。此外,还可以了解Android的布局设计、事件监听、数据绑定、网络请求等...
在Android应用开发中,高效地处理图像资源是至关重要的,特别是在用户界面中显示大量图片时。"Android-Universal-Image-Loader"库就是一个强大的解决方案,它专为Android平台设计,用于实现图片的异步加载、缓存和...
implementation 'org.springframework.android:spring-android-rest-template:1.0.1.RELEASE' } ``` 2. 创建REST Template实例:在需要使用的地方初始化REST Template对象。 ```java RestTemplate restTemplate = ...
本资源“Android-Awesome-kotlin-android”汇集了众多优秀的Kotlin在Android平台上的应用实例、库、工具和教程,旨在帮助开发者提升开发效率和代码质量。 首先,这个列表中的项目展示了Kotlin在Android开发中的最佳...
针对Android平台,"usb-serial-for-android"是一个至关重要的库,它允许Android设备通过USB接口与各种串口设备进行通信。该库源于https://github.com/mik3y/usb-serial-for-android,由开发者mik3y维护,为开发者...
《Android备份提取器:深入解析与应用》 在Android生态系统中,数据备份是至关重要的,尤其是在设备丢失或系统升级前确保个人数据安全的关键步骤。"android-backup-extractor"是一个专为Android用户设计的开源工具...
### 二、Android应用资源 - **Storage**:应用可以访问的存储空间,包括内部存储和外部存储(SD卡)。 - **Network**:网络功能,允许应用通过互联网进行通信。 - **Multimedia**:多媒体支持,包括音频、视频和...