巧用Android图片资源,打造更精致的APP

   2016-11-03 0
核心提示:前言由于android系统的开放性,以及IOS的相对封闭。第三方设备想要使用苹果的OS,目前来说是不可能。所以,各厂商纷纷的投入了android的怀抱, android阵营也越来越强大,如今移动操作系统也就是android和ios的天下。也正是因为android的开放性,可定制度高,

前言

由于android系统的开放性,以及IOS的相对封闭。第三方设备想要使用苹果的OS,目前来说是不可能。所以,各厂商纷纷的投入了android的怀抱, android阵营也越来越强大,如今移动操作系统也就是android和ios的天下。也正是因为android的开放性,可定制度高,导致了各种屏幕尺寸、各种分辨率的android设备 铺满了手机、平板、智能电视、手表、盒子、智能硬件…等各种应用场景。

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

drawable-xxx资源文件夹

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

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

巧用Android图片资源,打造更精致的APP

在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屏幕兼容性更好

巧用Android图片资源,打造更精致的APP

为了更直观的感受,他们之间的区别,在1920x1080的手机屏幕上:
  • 将同一张96×96像素的png图片,分别放到hdpi、xhdpi、xxhdpi文件夹中,宽高均以wrap_content显示

    巧用Android图片资源,打造更精致的APP

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

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

    巧用Android图片资源,打造更精致的APP

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

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

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

巧用Android图片资源,打造更精致的APP

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

使用wrap_content代替dp

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

            <ImageView
                android:layout_width="45dp"
                android:layout_height="45dp"
                android:src=http://www.tuicool.com/articles/"@drawable/icon_hdpi"/>

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

            <ImageView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:src=http://www.tuicool.com/articles/"@drawable/voip_camerachat_xhdpi"/>

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

  • 图1

巧用Android图片资源,打造更精致的APP

  • 图2

巧用Android图片资源,打造更精致的APP

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

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

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

巧用Android图片资源,打造更精致的APP

SVG

Scalable Vector Graphics

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

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

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

巧用Android图片资源,打造更精致的APP

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

巧用Android图片资源,打造更精致的APP

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

巧用Android图片资源,打造更精致的APP

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

<vectorxmlns:android="http://schemas.android.com/apk/res/android"
    android:width="24dp"
    android:height="24dp"
    android:viewportHeight="22.0"
    android:viewportWidth="22.0">
    <path
        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"/>
</vector>

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

            <ImageView
                android:layout_width="40dp"
                android:layout_height="40dp"
                android:src=http://www.tuicool.com/articles/"@drawable/moon"/>

界面显示效果:

巧用Android图片资源,打造更精致的APP

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

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

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

作者信息

原文作者系力谱宿云 LeapCloud 团队 Android SDK成员:徐盼盼 【原创】
– 力谱宿云 LeapCloud 首发 – 

 
反对 0举报 0 评论 0
 

免责声明:本文仅代表作者个人观点,与乐学笔记(本网)无关。其原创性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容、文字的真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
    本网站有部分内容均转载自其它媒体,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责,若因作品内容、知识产权、版权和其他问题,请及时提供相关证明等材料并与我们留言联系,本网站将在规定时间内给予删除等相关处理.

  • Android开发入门十大疑问解答
    1、Q:什么是Android?A:Android一词的本义指“机器人”,同时也是Google于2007年11月5日宣布的基于Linux平台的开源手机操作系统的名称,该平台由操作系统、中间件、用户界面和应用软件组成,号称是首个为移动终端打造的真正开放和完整的移动软件。简单来说是
  • Cyanogen OS 走到尽头,未来将转向模块化的发展方向
    Cyanogen OS 走到尽头,未来将转向模块化的发展
    Cyanogen 曾豪言要靠 Cyanogen OS 成为第三大移动平台的野望,最终还是只能以壮志未酬的结果收场。早些时候,他们宣布未来将转向软件模块化的发展方向,全新的 Cyanogen Modular OS 计划会把「Cyanogen OS 的不同部分以模块、MOD 的形式」提供给硬件厂商,便
  • 如何正确地统计函数执行时间
    如何正确地统计函数执行时间
    1923年,美国福特公司一台大型电机发生故障,来“会诊”的专家一连数月一筹莫展。后来,移居美国的德国科学家斯坦敏茨经过反复摸索比对在电机旁用粉笔画了一道线,并指导工程师们打开电机,将画线的地方的线圈减少16匝后,电机果然恢复正常运转。斯坦敏茨因此
  • Android操作系统获取Root权限原理详细解析
    Android操作系统获取Root权限原理详细解析
    许多机友新购来的Android机器没有破解过Root权限,无法使用一些需要高权限的软件,以及进行一些高权限的操作,其实破解手机Root权限是比较简单及安全的,破解Root权限的原理就是在手机的/system/bin/或/system/xbin/目录下放置一个可执行文件“su”
  • Android操作系统的架构设计分析
    Android操作系统的架构设计分析
    这篇文章主要介绍了Android操作系统的架构设计分析,Android系统架构分为Linux内核驱动、C/C ++框架、Java框架、Java应用程序,本文分别讲解了它的作用,需要的朋友可以参考下
点击排行