在开发过程中,用于显示图片大家用的比较多的应该是ImageView,在显示图片时是通常我们会设置scaleType以达到不同的展示效果。然后通常scaleType能设置的属性仅为:

  • CENTER /center 按图片的原来size居中显示,当图片长/宽超过View的长/宽,则截取图片的居中部分显示
  • CENTER_CROP / centerCrop 按比例扩大图片的size居中显示,使得图片长(宽)等于或大于View的长(宽)
  • CENTER_INSIDE / centerInside 将图片的内容完整居中显示,通过按比例缩小或原来的size使得图片长/宽等于或小于View的长/宽
  • FIT_CENTER / fitCenter 把图片按比例扩大/缩小到View的宽度,居中显示
  • FIT_END / fitEnd 把图片按比例扩大/缩小到View的宽度,显示在View的下部分位置
  • FIT_START / fitStart 把图片按比例扩大/缩小到View的宽度,显示在View的上部分位置
  • FIT_XY / fitXY 把图片不按比例扩大/缩小到View的大小显示
  • MATRIX / matrix 用矩阵来绘制,动态缩小放大图片来显示。

但是如果我们想达到scaleType为CENTER_CROP类型的展示图片方式且左对齐时,就感觉很无力了,ImageView并没有提供这个类型。

这时我们通过查看ImageView源码中处理scaleType为CENTER_CROP的逻辑,源码如下:

private void configureBounds() {if (mDrawable == null || !mHaveFrame) {return;}final int dwidth = mDrawableWidth;final int dheight = mDrawableHeight;final int vwidth = getWidth() - mPaddingLeft - mPaddingRight;final int vheight = getHeight() - mPaddingTop - mPaddingBottom;final boolean fits = (dwidth < 0 || vwidth == dwidth)&& (dheight < 0 || vheight == dheight);...if (ScaleType.CENTER_CROP == mScaleType) {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));} ...}}

可知,它的计算公式,那我们就通过外部设置matrix的方式来达到这种效果。

具体步骤如下:

  • 1、设置android:scaleType=“matrix”,它的图片呈现效果前文已做解释
  • 2、设置图片加载加载成功的监听,这里我使用的是Glide,代码如下:
 Glide.with(mContext).load(tempImageUrl).placeholder(R.drawable.a_theme_banner_top_bg).error(R.drawable.a_theme_banner_top_bg).listener(mRequestListener).dontAnimate().into(imageView);

其中mRequestListener的代码为:

private RequestListener mRequestListener=new RequestListener<Object, GlideDrawable>() {@Overridepublic boolean onException(Exception e, Object model, Target<GlideDrawable> target, boolean isFirstResource) {return false;}@Overridepublic boolean onResourceReady(GlideDrawable resource, Object model, Target<GlideDrawable> target, boolean isFromMemoryCache, boolean isFirstResource) {//这块是重点代码,我们单独摘抄出来进行讲解return false;}};
  • 3、代码逻辑处理,这块是重点
//先判断是否为ImageView类型的Targetif (target instanceof ImageViewTarget) {final AppCompatImageView imageView = (AppCompatImageView) ((ImageViewTarget) target).getView();Matrix matrix;//由于我实在ViewPager中做的图片展示,故先从缓存中取matrix,如果没有在做创建,为了防止对象重复的创建,加大内存的开销if (imageView.getTag(R.id.common_data_id) == null) {//这里先获取Drawable原始大小final int dwidth = resource.getIntrinsicWidth();final int dheight = resource.getIntrinsicHeight();//这里获取ImageView的大小,用于后面做比例计算final int vwidth = imageView.getWidth() - imageView.getPaddingLeft() - imageView.getPaddingRight();final int vheight = imageView.getHeight() - imageView.getPaddingTop() - imageView.getPaddingBottom();float scale;//这个公式是从ImageView对CENTER_CROP类型的处理的代码段,if (dwidth * vheight > vwidth * dheight) {scale = (float) vheight / (float) dheight;} else {scale = (float) vwidth / (float) dwidth;}matrix = new Matrix();//设置缩放比例matrix.setScale(scale, scale);//将matrix缓存到View中imageView.setTag(R.id.common_data_id, matrix);} else {matrix = (Matrix) imageView.getTag(R.id.common_data_id);}//将我们设置好的matrix设置给ImageViewimageView.setImageMatrix(matrix);}

至此达到scaleType="centerCrop"展示图片,左对齐效果

Android ImageView中scaleType=centerCrop实现左对齐效果相关推荐

  1. Android ImageView的scaleType(图片比例类型)属性与adjustViewBounds(调整视图边界)属性

    本文转载自[Android ImageView的scaleType(图片比例类型)属性与adjustViewBounds(调整视图边界)属性]并做了排版的修改(http://www.cnblogs.c ...

  2. android scaletype没作用,Android ImageView 的scaleType 属性图解

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

  3. Android ImageView 的scaleType 属性

    Android ImageView 的scaleType 属性 枚举值 ImageView.ScaleType CENTER 使图像在视图中居中,但不执行缩放. ImageView.ScaleType ...

  4. Android ImageView的scaleType详解

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

  5. android 工具栏沉浸 下拉,如何在Android应用中实现一个沉浸式状态栏效果

    如何在Android应用中实现一个沉浸式状态栏效果 发布时间:2020-12-08 17:04:42 来源:亿速云 阅读:151 作者:Leah 这篇文章将为大家详细讲解有关如何在Android应用中 ...

  6. Android ImageView的ScaleType属性

    android中ImageView的ScaleType属性 ScaleType的值分别代表的意义: ImageView是Android中的基础图片显示控件,该控件有个重要的属性是ScaleType,该 ...

  7. android imageview scaletype 按钮状态,Android ImageView 之 ScaleType 详解

    基础储备 在 ImageView 中有一个成员变量mDrawMatrix,这个变量是Matrix(矩阵)类型,我们了解一下这个Matrix类,Matrix 常见的方法有setScale(sx,sy) ...

  8. android scaletype没作用,Android ImageView的ScaleType属性

    参考 ScaleType属性 常量 含义 fitXY 横向.纵向独立缩放,以适应该ImageView fitCenter 保持纵横比缩放图片,缩放完成后将图片放在ImageView的中央 fitSta ...

  9. android:scaletype=quot;fitxyquot;,Android ImageView的ScaleType属性

    参考1.Android--UI之ImageView 2.ImageView的scaleType详解 ScaleType属性常量含义fitXY横向.纵向独立缩放,以适应该ImageView fitCen ...

最新文章

  1. 数据库收缩(sql2008)
  2. C++中基类的析构函数为什么要用virtual虚析构函数
  3. [高级软件工程教学]团队Beta阶段成绩汇总
  4. hdu1597(二分)
  5. [XXSY] 构树(prufer序列,树上连通块DP)
  6. shell 字典_腾讯T4周末不陪对象,就为了手打这份shell编程笔记
  7. j2se--Socket沟通
  8. Python的发展前景在哪?怎么样让Python程序员持续发展?
  9. js中 json对象与json字符串相互转换的几种方式
  10. 即席查询之Presto
  11. 基于地图开发控件GMap.Net 使用 (六) 中文显示详细街道数据信息
  12. Process terminated
  13. (2022)安卓和苹果应用注册上架概述
  14. 使用高德地图api在页面中展示地图
  15. badboy录制脚本错误问题解决
  16. Window 重置所有网络驱动器的命令
  17. Android APP跳转微信小程序和APP跳转支付宝小程序传参
  18. 网络安全系统教程+渗透测试+学习路线(自学笔记)
  19. CFileDialog 和 CFileDialog构造函数
  20. JAVA XML转对象 对象转XML

热门文章

  1. 龙芯软件开发(5)--北桥南桥芯片的作用
  2. python语言的开题报告怎么写_论文开题报告怎么写?
  3. internal/modules/cjs/loader.js:883 throw err; ^ Error: Cannot find module ‘destr‘
  4. 扩展jQuery函数功能
  5. 博客园如何设置好看的主题
  6. java response 远程 乱码_java-response-乱码解决
  7. 多智能体强化学习-MADDPG
  8. 新闻文本分类(课程设计)
  9. ​嘉沃资产 | 量化多岗位招聘(全职+实习)
  10. [转载] 为研究网络游戏成瘾 我陪儿子玩王者荣耀