专栏首页程序员叨叨叨听说你想控制网络图片显示的尺寸

听说你想控制网络图片显示的尺寸

问题背景

在最近项目中,有这么一种情况要实现:

从网络加载图片,放入GridView的ImageView里面,要求ImageView宽高保持一致。

这个很简单嘛!自定义控件继承ImageView,重写onMeasure方法,让高度和宽度保持一致就可以了!

public class SqureImageView extends ImageView {

    public SquareImageView(Context context) {
        super(context);
    }

    public SquareImageView(Context context, AttributeSet attrs) {
        super(context, attr, defStyleAttr);
    }

    public SquareImageView(Context context, AttributeSet attrs, int defStyleAttr) {
         super(context, attrs, defStyleAttr);
    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        if (getDrawable() == null) {
            super.onMeasure(widthMeasureSpec, heightMeasureSpec);
        }
        // 计算ImageView的宽度
        int viewWidth = View.MeasureSpec.getSize(widthMeasureSpec);
        // 高度等于宽度
        int viewHeight = viewWidth;
        // 将计算出的宽度和高度设置为图片显示的大小
        setMeasureDimension(viewWidth, viewHeight);
     }
}

写好代码跑了一下,傻眼了:

效果图1

图片竟然不是正方形的,和说好的不一样啊T.T

那么问题来了:如何将网络获取的图片铺满整个控件呢?

解决方法

其实想要的效果是这样的:

想要的效果

如何让图片高度占满控件,宽度自己裁剪呢?本来我的想法是,将网络图片下载到本地,然后用BitmapFactory实现裁剪,但是后来阻止了这个愚蠢的想法,从时间复杂度空间复杂度来说,处理N个这样的图片有点吃不消,后来我想起了之前用过的一个ImageView属性scaleType,scaleType有如下几个值:

fitCenter(默认):
图片居中,效果如同图【效果1】
fitXY:
图片的宽高和ImageView的宽高相同,图片变形
fitStart:
图【效果1】基础上,图片在ImageView顶部或左侧
fitEnd:
图【效果1】基础上,图片在ImageView底部或右侧
centerCrop:
图片会占满ImageView,超出的部分不显示

fitXY效果

通过设置scaleType为centerScrop,我将图片占满屏幕,实现了想要的效果。

补充

  1. 如果有小伙伴想要实现更加复杂的效果,比如:图片占满控件且居中。大家可以用之前说的那个笨方法,但是容易出现内存溢出。
  2. ImageView的setImageUri方法无法直接加载网络图片,可以使用ImageLoader的displayImg方法

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 私人订制Android本地图片选择器

    史上最强的安卓图片选择器——GalleryFinal; 简书博客地址——http://www.jianshu.com/p/48ddd6756b7a

    代码咖啡
  • 8.2 函数重载

    Cg 语言支持函数重载(Functon Overlaoding),其方式和 C++基本一致,通过形参列表的个数和类型来进行函数区分。例如:

    代码咖啡
  • 【7】版本管理神器——Git指令

    在前面几篇中,笔者曾多次和大家提到过Github网站,作为全球最大的同性交友网站,想必,各位小伙伴们也是迫不及待地在这个网站上找到自己的知己。如同在百合网相亲一...

    代码咖啡
  • WebAssembly详解及其使用案例

    ? 刘艳 高级前端开发工程师 多端融合平台组成员 JDReact平台Web转换框架的架构设计,及核心组件开发 简介 JS于1995年问世,设计的初衷不是为了执...

    京东技术
  • TensorFlow从1到2(十一)变分自动编码器和图片自动生成

    “变分自动编码器”(Variational Autoencoders,缩写:VAE)的概念来自Diederik P Kingma和Max Welling的论文《...

    俺踏月色而来
  • CAN滤波器

    CAN总线在的帧数据在总线上传送时,其它的CAN控制器是通过验收滤波来决定总线上的数据帧的ID是否和本节点相吻合,如果与本节点吻合,那么总线上的数据就被存入总线...

    心跳包
  • Taro 小程序开发大型实战(八):尝鲜 LeanCloud Serverless 云服务

    在上两篇文章中,我们讲解了使用微信小程序云作为我们的小程序后台,然后我们跑通了我们的注册登录、创建帖子、获取帖子列表、获取帖子详情的全栈流程,如果只想了解微信小...

    一只图雀
  • WPF 点击按钮时更改按钮样式界面效果的 XAML 实现方法

    在 WPF 中按钮 Button 将会吃掉路由事件,此时的 EventTrigger 如果通过 RoutedEvent 是 MouseLeftButtonDow...

    林德熙
  • SAS数据集中一行与多行的比较

    前几天看到一个群友提的一个问题:求上图中X小于等于所有Y值的个数。比如,第一个Y为0,则5个X中小于等于0的个数为0。实现这一目的的方法有多种,最易懂的方法应该...

    专业余码农
  • 不就是装个系统吗?其实我也会的!

    前几天有些粉丝留言说 出一遍教装系统的文章,今天特地写一遍,希望能给大家带来帮助!

    Rookie

扫码关注云+社区

领取腾讯云代金券