前言

由于android系统的开放性,以及IOS的相对封闭。第三方设备想要使用苹果的OS,目前来说是不可能。所以,各厂商纷纷的投入了android的怀抱,

android阵营也越来越强大,如今移动操作系统也就是android和ios的天下。也正是因为android的开放性,可定制度高,导致了各种屏幕尺寸、各种分辨率的android设备

铺满了手机、平板、智能电视、手表、盒子、智能硬件...等各种应用场景。

作为一名有逼格的程序猿,在面对如此众多的尺寸和分辨率设备上,想要打造一款通吃的app,势必是要花费一番功夫的。

drawable-xxx资源文件夹

还好google已经为我们想好了对策,为不同的分辨率提供不同的drawable资源。

先来看看微信的android客户端,在图片资源的使用

在res目录下,以drawable开头的文件夹占了一大半,后面以-hdpi、-land、-mdpi、-xhdpi...等文件夹以适配不同分辨率的机型。

可能有人会说,开发应用只用适配hdpi或者xhdpi就可以了,同样可以显示出来嘛!干嘛搞这么多版本,浪费空间,还麻烦!

如果是这样的想法,那只能说你的应用受众群体还没达到一定程度,或者不追求细节的完美。对于高逼格的应用来说,哪怕一个像素的缺失,都是不完美。

废话了这么多,先来看卡google官方对dp的定义

Density-independent pixel (dip)

A virtual pixel unit that you should use when defining UI layout, to express layout dimensions or position in a density-independent way.The density-independent pixel is equivalent to one physical pixel on a 160 dpi screen, which is the baseline density assumed by the system for a "medium" density screen. At runtime, the system transparently handles any scaling of the dp units, as necessary, based on the actual density of the screen in use. The conversion of dp units to screen pixels is simple: px = dp * (dpi / 160). For example, on a 240 dpi screen, 1 dp equals 1.5 physical pixels. You should always use dp units when defining your application's UI, to ensure proper display of your UI on screens with different densities.

独立像素单位(Density-independent pixel (dp)

一个虚拟的单位,用来决定UI布局的。用来表述布局的尺寸或者位置。

dp是一个与屏幕密度有关系的单位,dp与像素的换算关系为 px = dp * (dpi / 160)。例如在240密度(dpi)的屏幕上一个dp等于1.5个像素。以后我们应该尽量使用dp单位布局,不要使用像素单位。这样会使你的app屏幕兼容性更好

将同一张96x96像素的png图片,分别放到hdpi、xhdpi、xxhdpi文件夹中,宽高均以wrap_content显示

![](https://cscdn.maxleap.cn/2.0/download/NTgwZWMzNjA3ZWYyMGIwMDA3N2ViOGEx/zcf-b929ae8b-ace3-4e8d-ad2d-5cb311738b04.jpg)

可以看到,适配较低drawable-dpi的资源图片,显示尺寸相对较大,但是清晰度差。而适配高dpi的图片,显示尺寸相对较小,但是锐度高,比较清晰!

将像素分别为72x72、96x96、144x144像素的图片,分别放置于hdpi xhdpi xxhdpi文件夹中,宽高以wrap_content显示效果。

![](https://cscdn.maxleap.cn/2.0/download/NTgwZWMzNjA3ZWYyMGIwMDA3N2ViOGEx/zcf-bd311903-f4f9-4a40-baf5-0e8eaaf03e9d.jpg)

可以看到,不同大小的图片,放到不同的资源文件夹下,最终在屏幕上显示的大小居然一致!但是144x144像素对应的图片显示的最精致和清晰。

到这里,应该能看出图片资源与drawable文件夹对应的关系了。即使不使用高质量的图片,仍然可在高分辨率的屏幕上进行对应的显示,但是牺牲了控件显示的精细度,屏幕dpi越高显示越不清楚。如果一张高清晰度的照片,被放置在不恰当的drawable下也不能准确的还原应有的尺寸和清晰度。

对比IOS对图片的定义,2倍图即-xhdpi密度,3倍图即-xxhdpi密度。

所以,想要让应用中的icon显示的更加精致,那就需要对应的配置不同像素的图片。

使用wrap_content代替dp

很多人在处理带图片的icon的时候,会指定其大小,如:

android:layout_width="45dp"

android:layout_height="45dp"

android:src="@drawable/icon_hdpi"/>

wrap_content可理解为包裹内容,当控件被设置为wrap_content将会根据实际大小进行显示。相比直接设置dip的方式,在图片的显示上或多或少的会存在缩放。也就会导致图标会显示的不够精致。

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:src="@drawable/voip_camerachat_xhdpi"/>

下面以应用中常用的tabbar,作为对比:(以1920x1080屏幕像素截图)

图1

图2

图1中的icon统一被设置了固定的大小24dp,同时只在drawable-xhdpi中进行图片的适配。可以看出图片被不同程度的拉伸,icon显示较模糊。

图2将icon的宽高均设置为wrap_content,同时在drawable-xxhdpi中进行了适配。图2的icon锐度有所提高,因为wrap_content属性的设置,本身icon图片大小不同,导致icon显示的大小不一致。所以完美的方案就是,需要UI提供尺寸均一的大图片,适配到drawable-xxhdpi下.

相比微信的高清图片资源,展现的精致效果:

SVG

Scalable Vector Graphics

在 Android 5.0(API 级别 21)及更高版本中,可定义矢量图片,而且图片可在不损失清晰度的情况下缩放。 只需一个资产文件即可创建一个矢量图像,而位图图像则需要为每个屏幕密度提供一个资产文件。 如果要创建一个矢量图像,在 XML 元素中定义形状的详情。

下列示例以定义一个矢量图像:

在drawable文件夹下-->new-->vector Asset

可以选择Material Icon,使用studio内置的icon资源。这里选择了Local SVG file,使用自己定义的svg文件。

确定保存文件的位置。svg文件会导出为xml文件:

生成的moon.xml内容如下,path节点下的fillColor属性,可以自定义颜色值。

android:width="24dp"

android:height="24dp"

android:viewportHeight="22.0"

android:viewportWidth="22.0">

android:fillColor="#FF000000"

android:pathData="M16,10l0.8,-3.2L20,6l-3.2,-0.8L16,2l-0.8,3.2L12,6l3.2,0.8L16,10zM6,8c0,-2.17 0.867,-4.134 2.269,-5.575C4.634,3.581 2,6.982 2,11c0,4.971 4.029,9 9,9c4.018,0 7.419,-2.634 8.575,-6.269C18.134,15.133 16.17,16 14,16C9.582,16 6,12.418 6,8z"/>

layout中使用和普通图片使用相同

android:layout_width="40dp"

android:layout_height="40dp"

android:src="@drawable/moon"/>

界面显示效果:

控件的宽高可以任意以dp的方式设置,而清晰度并未受影响。

SVG除了可以用在矢量图片上,也可以在android上用来显示精美的动画效果。

有时间再对svg的生成,以及使用做更详细的介绍。

【编辑推荐】

【责任编辑:枯木 TEL:(010)68476606】

点赞 0

android app 图片资源,巧用Android图片资源,打造更精致的APP相关推荐

  1. android m壁纸驱动之家,微软打造的良心壁纸App,仅4.2M

    上次小编介绍了一系列的电脑壁纸自动换软件,收到了不少好评. 不过有不少网友问有没有手机上的壁纸自动换APP呢?手机上的壁纸软件还真不少,这不必应壁纸也出了个手机版的,一起来看看吧. 和电脑版一样,必应 ...

  2. Android中具有动画效果的图片资源

    Android动画和Transition系列文章 初识属性动画--使用Animator创建动画 再谈属性动画--介绍以及自定义Interpolator插值器 三谈属性动画--Keyframe以及Vie ...

  3. Android Studio打造一个小说阅读App

    应用目录 一.基本信息 二.功能介绍 1. 主界面 2. 排行榜界面 3. 分类界面 4. 搜索界面 5. 书籍详情界面 6. 阅读界面 7. 相关书籍界面 三.类图/时序图/架构图 四.采用技术及原 ...

  4. 我的Android进阶之旅------gt;Android APP终极瘦身指南

    首先声明,下面文字转载于: APK瘦身实践 http://www.jayfeng.com/2015/12/29/APK%E7%98%A6%E8%BA%AB%E5%AE%9E%E8%B7%B5/ APP ...

  5. 工业App能否成为继Android和iOS后下一个App开发者的春天?

    为什么需要工业互联网平台? 只要会Java或者C或者HTML5就可以开发手机上的App,但是工业App跟手机App不一样,需要跟设备打交道,需要听懂设备.读懂设备. 传统工业应用软件往往开发难度大.开 ...

  6. Android中的缓存策略,实战打造ImageLoader

    图片加载器在Android的App中可谓是重中之重,几乎任何一款APP都缺少不了图片,而图片可以使一个APP具有更丰富的内容,同时反应一个APP具有更加友好的用户体验.一般使用的图片都需要到网络上拉去 ...

  7. 视频教程-FFmpeg打造Android万能音频播放器-Android

    FFmpeg打造Android万能音频播放器 从事Android移动端开发多年.主导开发过直播.电商.聊天等各种类型APP和游戏SDK:熟悉Android音视频开发.底层NDK开发等:有开源项目:ht ...

  8. android腾讯视频包名,腾讯视频修改版app

    腾讯视频修改版app是一款致力于打造中国领先的手机在线视频媒体平台,以丰富的内容.极致的观看体验.便捷的登录方式.24小时多平台无缝应用体验以及快捷分享的产品特性,主要满足用户在线观看. 功能特色: ...

  9. 新手app开发android idea,IntelliJ IDEA开发Android程序新手教程

    类型:编程工具大小:177M语言:中文 评分:8.0 标签: 立即下载 IntelliJ IDEA支持开发运行在移动手机上的应用程序,所以也能在Android操作系统下运行.IDEA包含一个免费的Co ...

最新文章

  1. ORA-25155: NATURAL 联接中使用的列不能有限定词
  2. Arduino LiquidCrystal库函数中文对照
  3. python(numpy,pandas1)——numpy(ndim,shape,size,zero, empty, arange, linspace)
  4. TMS320 C6000系列 DSP之 CCS5.5 仿真调试
  5. Java黑皮书课后题第8章:**8.14(探讨矩阵)编写程序,提示用户输入一个方阵的长度,随机地在矩阵中填入0和1,打印这个矩阵,然后找出整行、整列或者对角线都是1或0的行、列和对角线
  6. 7-172 抓老鼠啊~亏了还是赚了? (20 分)
  7. 专访uPlane陈宏强:手机遥控固定翼飞机还是蓝海
  8. JavaScript-面试 表单验证
  9. 软件测试必问必背面试题
  10. 进程ld-linux-x86-64是什么,解决挖矿病毒占用cpu以及误删 ld-linux-x86-64.so.2 文件的问题...
  11. 基于Nginx的图片预览或下载
  12. 新版电脑版微信终于可以用上小程序了
  13. ADC噪声全面分析 -01- ADC噪声的类型以及ADC特性
  14. 操作系统——PV操作
  15. python使用pillow生成纯透明png图片
  16. suse12中pip install xxx报错gcc: error: unrecognized command line option ‘-fstack-clash-protection’
  17. oracle数据库按中文拼音排序
  18. (java)使用createNewFile提示系统找不到指定路径
  19. can和could的用法_中学生的难题can和could有什么关系,只需三分钟让你轻松记
  20. 删除u盘插拔记录linux,电脑u盘插拔记录_电脑u盘插拔时间记录

热门文章

  1. 基于人脸识别技术实战开发人证比对访客系统
  2. 应用程序图标_如何制作完美的应用程序图标
  3. C++打印n行n列星号
  4. Basic Block
  5. 什么是CVE?常见漏洞和暴露列表概述
  6. 水晶报表设置纸张大小
  7. hdu 1207 汉诺塔II (四柱汉诺塔)
  8. [开发浏览器实战]关于Firefox火狐浏览器的说明一二(国内版 国际版区别 账号切换 插件-恢复关闭的标签页 插件-tempermonkey油猴)
  9. 笑话--老外与山东妞(爆笑)
  10. 键盘录入(身高和体重)