ScaleType的设置方式包括:
1. 在layout的xml中定义android:scaleType="xxx";
2. 在java代码中调用imageView.setScaleType(ImageView.ScaleType.XXX)。

ScaleType的取值包括:
MATRIX、FIT_XY、FIT_START、FIT_CENTER、FIT_END、CENTER、CENTER_CROP、CENTER_INSIDE;

今天和大家聊一个比较基础的话题,Android里ImageView的ScaleType属性,这个属性决定了一张图片如何显示在ImageView上,常用的值有以下几个:

CENTER,CENTER_CROP,CENTER_INSIDE,FIT_CENTER,FIT_END,FIT_START,FIT_XY,MATRIX。

相信ScaleType属性大家都不会陌生。但是,在真实的使用过程中,很多同学总是要实际调试几次才能找到自己的需要的ScaleType值。这说明关于ScaleType,还有些小细节还不是特别清楚。

这篇文章就通过实际的例子,帮你彻底搞懂ScaleType。

总结

下面的表格总结了下各个属性值的特点,注意,表格中为“是”并不是说一定会发生,只是说明有这种可能。

 
属性值对比
 

问题分析:

一般来说,要把一张图片显示在ImageView上,有下面几个问题需要考虑:

1,ImageView会不会被填满?

2,图片会不会完整显示?

3,图片会不会被伸缩,如果是的话,是否按原始比例伸缩?

在真实的产品环境中,一个ImageView的大小往往都是有限制的,至少长或宽有一条边是有限制的,所以,在ImageView上显示图片还需要考虑:

1,真实的图片比ImageView要小,会怎么显示?

2,真实的图片比ImageView要大,会怎么显示?

第二个问题,还可以细化成:

1,真实的图片长宽都比ImageView的长宽要大,会怎么显示?

2,真实的图片长或宽有一条边比ImageView要大,另一条边比ImageView要小,会怎么显示?

怎么样,简单的一个显示图片操作,就有这么多细节需要考虑。下面的章节,我们就抓住上面几点,通过实际的例子帮你理解ScaleType的各个属性值。


FIT_XY

首先看下实际效果:

 
FIT_XY的效果

一句话总结FIT_XY:就是以不按原比例伸缩为代价,强制让图片充满ImageView,同时图片所有的部分也会完整显示出来(虽然可能变形)。但是,因为其不按原比例伸缩的特点,真实的产品中不太常用,因为图片被拉伸变形往往是不可以接受的。(上面例子中的美女已经被拉伸的不成样子了)


CENTER

还是先看下例子:

 
CENTER的效果

这个属性值的名称虽然是CENTER,但是和一般意义上的“居中”有很大不同。这个属性值即不会保证填满ImageView,也不保证图片会完整显示。当实际图片比ImageView小的时候,就是“居中显示”。当图片比ImageView大,就把图片中间的部分显示在ImageView里,其他的裁剪掉不显示。(上面第二组图尤其明显)


FIT_CENTER

先看例子:

 
FIT_CENTER的效果

FIT_CENTER更接近于大家理解的“居中显示”,也是平时用的最多的一个值。首先,这个属性会保证图片完整显示,不管图片和ImageView的大小关系。而且伸缩的时候是按照比例做的,所以图片质量也可以得到保证。唯一的问题是,FIT_CENTER不保证会填满ImageView。对于大多数场景,这个也足够了。

FIT_START,FIT_END和FIT_CENTER差不多,就不详细介绍了。


CENTER_CROP

先看例子:

 
CENTER_CROP的效果

CENTER_CROP,是个非常重要的值,但是很多同学对它并不是很了解。首先,这个属性值的名字很奇怪,很难猜出来其真实的含义;其次,它的官方介绍简直又臭又长,让人一头雾水:

Scale the image uniformly (maintain the image's aspect ratio) so that both dimensions (width and height) of the image will be equal to or larger than the corresponding dimension of the view (minus padding).

其实,CENTER_CROP的特点总结起来很简单:以可能裁切掉部分图片为代价,让图片充满ImageView。

可以和FIT_XY做下对比,CENTER_CROP和FIT_XY是唯二的可以保证填满ImageView的值。所不同的是,FIT_XY是以不保持原始比例伸缩为代价(但是保证原图全部显示出来);而CENTER_CROP是以不能显示完整原图为代价(但是保证原图的原始比例)。


CENTER_CROP和FIT_CENTER的对比

二者都会按原始比例伸缩图片,所不同的是,CENTER_CROP将图片伸缩到填满ImageView为止,FIT_CENTER伸缩到图片完整并居中显示为止。

下面两个动图可以让你看得更清楚:

 
CENTER_CROP的拉伸方式
 
FIT_CENTER的拉伸方式

CENTER_INSIDE

先看例子:

 
CENTER_INSIDE的效果

CENTER_INSIDE又是一个奇怪的值,原文的解释也是让人看不懂:

Scale the image uniformly (maintain the image's aspect ratio) so that both dimensions (width and height) of the image will be equal to or less than the corresponding dimension of the view (minus padding).

其实总结起来很简单:当原图大于ImageView的时候,相当于FIT_CENTER。当原图小于等于ImageView的时候,相当于CENTER。


MATRIX

看下例子

 
MATRIX的效果

MATRIX的效果比较简单:不改变原图的大小,从ImageView的左上角开始绘制,超出部分做剪切处理。不保证填满ImageView,也不保证图片完全显示。和CENTER有点类似。反正我在项目中是没有用过这个值。


 

思考题

最后再给大家出一道思考题,看看大家的掌握情况:

要实现微信朋友圈九宫格的照片效果,应该使用ScaleType的哪个值?

相信通过学习本文章,聪明的你很快就能找到答案。

图文讲解Android ImageView的ScaleType的更多相关文章

  1. [转]Android ImageView的scaleType属性与adjustViewBounds属性

    Android ImageView的scaleType属性与adjustViewBounds属性   ImageView的scaleType的属性有好几种,分别是matrix(默认).center.c ...

  2. Android ImageView的scaleType属性与adjustViewBounds属性(转)

    ImageView的scaleType的属性有好几种,分别是matrix(默认).center.centerCrop.centerInside.fitCenter.fitEnd.fitStart.fi ...

  3. Android课程---Android ImageView的scaleType属性与adjustViewBounds属性(转)

    ImageView的scaleType的属性有好几种,分别是matrix(默认).center.centerCrop.centerInside.fitCenter.fitEnd.fitStart.fi ...

  4. Android ImageView的scaleType属性与adjustViewBounds属性

    ImageView的scaleType的属性有好几种,分别是matrix(默认).center.centerCrop.centerInside.fitCenter.fitEnd.fitStart.fi ...

  5. Android ImageView的scaleType属性与adjustViewBounds属性(转载)

    ImageView的scaleType的属性有好几种,分别是matrix(默认).center.centerCrop.centerInside.fitCenter.fitEnd.fitStart.fi ...

  6. Android——ImageView的scaleType属性与adjustViewBounds属性 (转)一

    ImageView的scaleType的属性有好几种,分别是matrix(默认).center.centerCrop.centerInside.fitCenter.fitEnd.fitStart.fi ...

  7. 【转】Android ImageView的scaleType属性与adjustViewBounds属性

    ImageView的scaleType的属性有好几种,分别是matrix(默认).center.centerCrop.centerInside.fitCenter.fitEnd.fitStart.fi ...

  8. Android ImageView 的scaleType 属性图解

    ImageView 是 Android 中最常用的控件之一,而在使用ImageView时,必不可少的会使用到它的scaleType属性.该属性指定了你想让ImageView如何显示图片,包括是否进行缩 ...

  9. Android ImageView的scaletype属性

    ImageView的属性android:scaleType,即 ImageView.setScaleType(ImageView.ScaleType).android:scaleType是控制图片如何 ...

随机推荐

  1. git 学习笔记 —— 获取远端分支并修改后提交至远端仓库

    笔者最近进行开发过程中,所有参与者的代码需要通过 git 上传到远端仓库中,不同的模块对应不同的 git 分支,不同模块的数据需要从远端仓库中获取.这里记录下笔者从远端仓库中获取分支数据,进行修改,最 ...

  2. 浏览器渲染详细过程:重绘、重排和 composite 只是冰山一角

    https://juejin.im/entry/590801780ce46300617c89b8 渲染 这张很经典的图许多人都看过,其中的概念大家应该都很熟悉,也就是这么几个步骤:js修改dom结构或 ...

  3. python3.7 win10配置opencv和扩展库

  4. Traefik 2.0 tcp 路由试用

    对于tcp 的路由是基于sni (需要tls)但是可以通过统配(*) 解决不试用tls的,当然也可以让Traefik 自动生成tls 证书 以下是测试http 以及mysql 的tcp 路由配置(de ...

  5. A1102 | 反转二叉树

    #include <stdio.h> #include <memory.h> #include <math.h> #include <string> # ...

  6. P3386 【模板】二分图匹配(匈牙利算法)

    题目背景 二分图 题目描述 给定一个二分图,结点个数分别为n,m,边数为e,求二分图最大匹配数 输入输出格式 输入格式: 第一行,n,m,e 第二至e+1行,每行两个正整数u,v,表示u,v有一条连边 ...

  7. Java接口、lambda的学习

    接口的实现  :  使用interface定义:形式如下 interface Printable{ final int MAX = 100; void add(); float sum(float x ...

  8. ffmpeg结合SDL编写播放器

    创建播放窗口 SDL_Surface *screen = NULL; screen = SDL_SetVideoMode(pCodecCtx->width, pCodecCtx->heig ...

  9. 「HNOI2015」亚瑟王

    传送门 Description 小 K 不慎被 LL 邪教洗脑了,洗脑程度深到他甚至想要从亚瑟王邪教中脱坑. 他决定,在脱坑之前,最后再来打一盘亚瑟王.既然是最后一战,就一定要打得漂亮.众所周知,亚瑟 ...

  10. jvm(三)指令重排 & 内存屏障 & 可见性 & volatile & happen before

    参考文档: https://tech.meituan.com/java-memory-reordering.html http://0xffffff.org/2017/02/21/40-atomic- ...