`
喧嚣求静
  • 浏览: 572364 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

Android资源图片读取机制-转载

 
阅读更多

在新建一个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

分享到:
评论

相关推荐

    android-studio-ide-193.6514223-windows,完整版下载

    1. 获取资源:首先,你需要找到名为"android-studio-ide-193.6514223-windows.exe"的压缩包文件,这是Android Studio的安装程序。确保你从官方渠道或可信的来源获取此文件,以保证安全。 2. 解压资源:下载完成后,...

    Android-Image-Kitchen-master_Androidkitchen_Kitchen_

    这个项目,名为"Android-Image-Kitchen-master",是Android Kitchen的主要分支,包含了核心功能及其源代码,旨在帮助开发者更高效地管理和优化应用内的图片资源。Android Kitchen,又称为Kitchen,是一个强大的资源...

    wechat-sdk-android-without-mta-5.5.8.zip

    这个"wechat-sdk-android-without-mta-5.5.8.zip"压缩包包含了版本号为5.5.8的SDK,主要用于实现如分享网页、分享音乐、发送好友消息以及用户授权登录等功能。值得注意的是,此版本的SDK没有包含MTA(Mobile ...

    Android-nRF-Toolbox-master 源码

    3. `res`目录:包含了应用的资源文件,如布局文件、图片、字符串等。 4. `build.gradle`文件:定义了项目的构建配置,包括依赖项、版本信息等。 二、核心技术 1. **蓝牙低功耗(BLE)通信**:应用的核心功能之一是...

    android-recyclerview-v7-25.0.0.jar

    遗憾的是,"android-recyclerview-v7-25.0.0.jar"似乎在搜索引擎上难以找到详细的文档,这突显了获取最新开发资源的重要性。 3. **在Eclipse中使用RecyclerView** - **导入依赖**:首先,需要将`android-...

    android-Camera2Basic-master源码

    《深入解析Android Camera2Basic-master源码》 在Android应用开发中,相机功能是一个不可或缺的部分。随着技术的发展,Android系统提供了Camera2 API,为开发者提供了更高级、更灵活的相机控制。本文将深入剖析...

    AhMyth_AhMyth-Android-RAT-1.0-beta

    AhMyth是一个功能强大的Android恶意软件,允许远程管理员执行多种操作,如监听通话、获取GPS位置、读取短信、控制摄像头、记录键盘输入等。这个工具的主要目标是帮助安全专家理解恶意软件的工作原理,并提供了一个...

    android数组资源string-array integer-array的用法

    在Android开发中,数组资源是十分重要的组成部分,用于存储和管理数据。本篇文章将深入探讨`string-array`和`integer-array`的用法,以及如何在XML中定义和使用它们。 首先,`string-array`是Android中用于存储字符...

    android-async-http-master

    通过设置缓存策略,当网络不可用时,应用可以从本地缓存中获取数据,保证应用的可用性。 在"android-async-http-master"项目中,我们可以看到源代码组织结构,包括各个模块的实现,如请求调度器、连接池管理、...

    Android---universal-image-loader应用 异步加载图片并缓存

    在Android开发中,异步加载图片并进行缓存是一个常见的需求,特别是在...在实际开发中,结合`UniversalImageLoader`的源代码学习,可以深入理解Android的多线程处理和图片加载机制,对提升Android开发技能大有裨益。

    AndroidStudio-实战演练-仿美团外卖菜单全部代码,加图片资源

    通过这个项目,开发者可以学习到如何使用Android Studio构建用户界面,处理图片资源,以及实现与服务器的交互(如果有的话)来获取菜品数据。此外,还可以了解Android的布局设计、事件监听、数据绑定、网络请求等...

    两台android设备间通过OTG-USB连接

    在Android系统中,OTG(On-The-Go)技术允许设备之间直接进行数据交换,而无需依赖电脑或其他外部设备作为中介。"两台android设备间通过OTG-USB连接"这个主题涉及到的是如何利用OTG功能使两台Android设备通过USB线...

    Android-Universal-Image-Loader示例

    在Android应用开发中,高效地处理图像资源是至关重要的,特别是在用户界面中显示大量图片时。"Android-Universal-Image-Loader"库就是一个强大的解决方案,它专为Android平台设计,用于实现图片的异步加载、缓存和...

    Android开发实验---通讯录.docx

    【Android开发实验---通讯录】 本实验旨在让学生掌握Android软件开发的基本编程技术,特别是涉及到Android系统SQLite数据库的使用,以及通话和短信功能的集成。实验要求每位学生独立设计并完成一款Android通讯录...

    Android-Awesome-kotlin-android一个很棒的KotlinAndroid项目包文件和其它资源的列表

    本资源“Android-Awesome-kotlin-android”汇集了众多优秀的Kotlin在Android平台上的应用实例、库、工具和教程,旨在帮助开发者提升开发效率和代码质量。 首先,这个列表中的项目展示了Kotlin在Android开发中的最佳...

    usb-serial-for-android

    针对Android平台,"usb-serial-for-android"是一个至关重要的库,它允许Android设备通过USB接口与各种串口设备进行通信。该库源于https://github.com/mik3y/usb-serial-for-android,由开发者mik3y维护,为开发者...

    安卓串口demo(android-serialport-api-android-serialport-api

    标题中的"安卓串口demo(android-serialport-api-android-serialport-api)"指的是一个用于Android系统的串口通信示例程序,它基于开源项目“android-serialport-api”。 这个开源项目是为了解决Android设备上串口...

    Android-Universal-Image-Loader-master

    这个框架被广泛用于解决在Android应用中高效、异步加载网络图片的问题,同时提供图片缓存机制,避免频繁请求服务器,提高用户体验。 在Android应用开发中,图片的加载是一个关键且复杂的过程,因为Android设备的...

    Android高德地图开发--读取解析KML文件并显示在地图上

    本教程将详细讲解如何在Android应用中读取和解析KML文件,并将其内容显示在高德地图上。 首先,我们需要在项目中引入高德地图SDK。在build.gradle文件中添加高德地图的依赖库,例如: ```groovy dependencies { ...

    android-support-v4.jar最新版

    由于`android-support-v4.jar`是Google维护的,因此定期更新以获取最新的修复和功能是必要的。描述中提到的"最新版"可能指的是当时发布的版本,但随着时间推移,可能会有新的更新发布。开发者应密切关注Android官方...

Global site tag (gtag.js) - Google Analytics