美文网首页精选案例Android知识程序员
听说你想控制网络图片显示的尺寸

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

作者: 代码咖啡 | 来源:发表于2016-09-19 18:38 被阅读344次

    问题背景

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

    从网络加载图片,放入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方法

    相关文章

      网友评论

        本文标题:听说你想控制网络图片显示的尺寸

        本文链接:https://www.haomeiwen.com/subject/lidnettx.html