android的scaleType有center,centerCrop,centerInside,fit,fitCenter,fitStart,fitEnd,Matrix。文章分别分析这接种模式的含义与实现算法。
Center
center不放缩,超出dst显示图片中间的元素,代码中是将canvas的坐标平移到能够将图片显示到屏幕中的位置
mDrawMatrix = mMatrix;
mDrawMatrix.setTranslate(Math.round((vwidth - dwidth) * 0.5f),
                         Math.round((vheight - dheight) * 0.5f));
centerCrop
等比例放大图片,保证图片宽高大于等于dst的宽高,一条边等于,一条边大于或者等于。
代码中实际上是对canvas进行缩放,平移。
缩放的比率: 思路就是选择view/drawable的宽或者高占比大的一边的比例进行缩放,这样该边的drawable就会与view一样大,另外一边按照这个比例压缩,值就比view大。
平移的距离: 相等的边不用平移,大的边,需要平移,保证中间显示。
mDrawMatrix = mMatrix;

float scale;
float dx = 0, dy = 0;

if (dwidth * vheight > vwidth * dheight) {scale = (float) vheight / (float) dheight;
    dx = (vwidth - dwidth * scale) * 0.5f;
} else {scale = (float) vwidth / (float) dwidth;
    dy = (vheight - dheight * scale) * 0.5f;
}mDrawMatrix.setScale(scale, scale);
mDrawMatrix.postTranslate(Math.round(dx), Math.round(dy));
centerInside
等比例缩小图片,保证图片宽高小于等于dst的宽高
代码中实际上是对canvas进行缩放,平移
缩放的比率: 思路就是如果都小,那么不压缩,否则按照view/drawable的宽或者高小的缩放到view一样大,另外一边由于按照小值进行压缩,值就比view的小
平移的距离: 如果drawable的某个边小与view,平移多出来的长度/2 ,保证居中, 相等的边不用平移
mDrawMatrix = mMatrix;
float scale;
float dx;
float dy;

if (dwidth <= vwidth && dheight <= vheight) {scale = 1.0f;
} else {scale = Math.min((float) vwidth / (float) dwidth,
            (float) vheight / (float) dheight);
}dx = Math.round((vwidth - dwidth * scale) * 0.5f);
dy = Math.round((vheight - dheight * scale) * 0.5f);

mDrawMatrix.setScale(scale, scale);
mDrawMatrix.postTranslate(dx, dy);
Fit
实际上对drawable进行缩放

fitcenter
等比例放缩图片,保证图片全部显示在view中且至少有一边等于dst,居中显示
fitStart
等比例放缩图片,保证图片全部显示在view中且至少有一边等于dst,start显示
fitEnd
等比例放缩图片,保证图片全部显示在view中且至少有一边等于dst,end显示
代码中实际上是调用native的方法
缩放的比率:等比例放缩,用小比例值放缩,类似于下面的代码
缩放比例 scale = Math.min((float) vWidth / (float) dwidth,
            (float) vheight / (float) dheight);

 fitXY
不等比例放缩,保证图片宽高等于dst 
代码中实际上就是设置drawable的bound,保证充满区域
缩放的比率:不等比例放缩,分开计算比值
    /* If the drawable has no intrinsic size, or we're told to
        scaletofit, then we just fill our entire view.
    */
    mDrawable.setBounds(0, 0, vwidth, vheight);
    mDrawMatrix = null;
Matrix
Scale using the image matrix when drawing
反思:
1.图片组件的缩放实际上是图片已经加载到内存中,通过控制canvas的matrics实现不同的缩放效果,没有改变图片的内存
2.如果不进行放缩,只进行居中平移,那么就是center的效果
3.如果不等比例,就是fitxy,保证宽高相等
4.平移保证位置
总结:
center: 不放缩,居中
centerInsider:等比例小值,居中,都小于就不缩放
centerCrop:等比例大值,居中
fitCenter:等比例小值,居中
fitXY:不等比例

scaleType分析相关推荐

  1. android:scaletype没作用,ImageView的属性android:scaleType的作用分析

    在网上查了好多资料,大致都雷同,大家都是互相抄袭的,看着很费劲,不好理解,自己总结一下,留着需要看的话来查找. 代码中的例子如下: android:id="@+id/iv_bit_1&quo ...

  2. ImageView.ScaleType属性分析

    ImageView的Scaletype决定了图片在View上显示时的样子,包括是否进行缩放.等比缩放.缩放后展示位置及显示图片的整体还是部分等.Android 提供了八种scaleType的属性值. ...

  3. Fresco源码分析之Hierarchy

    上篇文章我们分析了Fresco中的DraweeView,对其中的一些原理以及方法进行了解析.在这过程中我们了解到,DraweeView中是通过DraweeHolder来统一管理的.而DraweeHol ...

  4. PullToRefreshScrollView下拉刷新开源组件分析

    该库被使用较多,而其manual又较为简单.所以决定分析一下,先从几个问题入手: icon怎么做到随着下拉的进行而联动旋转的? 通过关系图发现我们所有用到的组件都继承自PullToRefreshBas ...

  5. 20189208 2018-2019-2 《移动平台开发实践》分析小组项目代码

    20189208 2018-2019-2 <移动平台开发实践>分析小组项目代码 一.代码的组成部分 app: manifests AndroidManifest.xml java com. ...

  6. Android多线程分析之一:使用Thread异步下载图像

    打算整理一下对 Android Framework 中多线程相关知识的理解,主要集中在 Framework 层的 Thread, Handler, Looper, MessageQueue, Mess ...

  7. Android ListView异步加载图片乱序问题,原因分析及解决方案

    转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/45586553 在Android所有系统自带的控件当中,ListView这个控件算是 ...

  8. Android仿QQ5.0侧滑菜单ResideMenu的使用和源码分析

    本文出自Cym的博客(http://blog.csdn.net/cym492224103) ResideMenu github:https://github.com/SpecialCyCi/Andro ...

  9. Android\OPhone动画分析之翻转效果

    看到很多人在问如何实现三维的翻转效果,所以今天在这里简单的给大家分析一下,其实在APIDemo中就有这样一个例子,那么我们就以其为例来学习Android中的翻转动画效果的实现,首先看一下运行效果如下图 ...

最新文章

  1. 近期活动盘点:清华严飞大数据探寻中国文脉讲座、2019前沿信息科技创新论坛...
  2. Resolving Problems installing the Java JCE Unlimited Strength Jurisdiction Policy Files package--转
  3. 干货下载 | 高效金融客户分析体系如何搭建?
  4. 1313 质因数分解 2012年NOIP全国联赛普及组
  5. 23. which命令
  6. cs硕士妹子找工作经历【阿里人搜等互联网】
  7. unity用coroutine并发实现暂停执行程序
  8. arima模型怎么拟合_7个统计测试,用于验证和帮助拟合ARIMA模型
  9. 美女面试官问我Python如何优雅的创建临时文件,我的回答....
  10. Linux如何统计进程的CPU利用率
  11. Java讲课笔记08:数组
  12. linux模拟cpu过载,linux下模拟CPU占用100%小程序
  13. 关于Windows 2019 antimalware 进程占用CPU 过多的处理方法 关闭windows 病毒防护的方法...
  14. Java最全思维导图知识汇总
  15. imindmap思维导图免费下载
  16. JVM垃圾收集器-Parallel Scavenge收集器
  17. 【线刷大师】纯净root线刷包,线刷教程及工具
  18. velocity模板引擎帮助
  19. 洛谷10月月赛II题解
  20. java-net-php-python-06白茶销售系统计算机毕业设计程序

热门文章

  1. 小程序使用echarts-条形统计图
  2. Teamcenter13限制工作版本的数量
  3. 如何拍出来好看的Vlog,必备小技能(四)?
  4. 煽情的儿子462=随笔
  5. 语录系统php,杨泽业:给你的php网站添加经典语录功能
  6. [转]各种主板不用NLITE、DPS等最简单的集成SATA驱动的办法适用SP1/SP2/SP3
  7. 【读书笔记】被讨厌的勇气之权利之争
  8. nhibernate mysql配置_NHibernate 连接多数据库怎么配置
  9. 程序员技术社区有哪些
  10. 计算机不断开机,电脑开机不停自检,没完没了,好心人帮忙!