在Android中加载ImageView一般都不会给ImageView的宽高设置一个确切的值,一般都是直接写成:

<ImageView
android:id="@+id/iv_test_img"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:src="@drawable/ic_scale_type_img"
android:background="@android:color/holo_blue_light"
/>

或者是将width设置成wrap_content, 再结合ImageView的scaleType属性来保证ImageView来正常显示,因为如果把值写死的话,在不同的设备上图片可能会发生变形和扭曲,有时设置了scaleType还好些,要是不设置scaleType,最终显示成什么样子估计连自己都说不清楚。不过设置了scaleType就完美了么?也不尽然,比如要显示的图片是这个样子的:

如果不使用scaleType:

使用scaleType:

SetScaleType(ImageView.ScaleType.CENTER);

又或者:SetScaleType(ImageView.ScaleType.CENTER_CROP);

再比如:setScaleType(ImageView.ScaleType.FIT_XY);

以上的三种scaleType应该是实际使用时应用的比较广泛的三种scaleType了,还有一些ScaleType.FIT_START,FIT_CENTER,FIT_END就不说了,但是就算设置了scaleType,充其量也就是能保证图片不变形,但是该有的问题还是会有,比如上面的几种scaleType,有的图片上下两侧会有留白,有的根本就显示不全,这里说明一下,ImageView默认的scaleType是FIT_CENTER,有留白是因为比如图片的宽大于高,在把图片放入到ImageView中时,会对图片进行等比例缩放,这样空出的部分自然就是留白了,一般在竖屏的情况下,通常图片的宽度会大于高度,这样在以FIT_CENTER显示的时候,上下都会有留白,但图片内容是可以全部显示的,那有没有什么办法既能全部显示图片内容,又可以使上下没有留白呢?

我的想法是,只要让ImageView的高度与ImageView里显示的图片高度一致就可以了,具体说来就是:

     iv_share_img.setImageBitmap(shareBitmap);
iv_share_img.post(new Runnable() {
@Override
public void run() {
/*
* 获取ImageView中image的宽高
* 注意:这里的宽高是Image原始的宽高,不是当前在ImageView中显示的宽高
*/
int img_width = iv_share_img.getDrawable().getBounds().width();
int img_height = iv_share_img.getDrawable().getBounds().height(); // 获取ImageView中Image的变换矩阵
float[] emptyMatrix = new float[9];
iv_share_img.getImageMatrix().getValues(emptyMatrix); // 分别从矩阵中获取X和Y的缩放系数
float scaleX = emptyMatrix[0];
float scaleY = emptyMatrix[4]; // 计算Image在屏幕上实际绘制的宽高
int realWidth = (int) (img_width * scaleX);
int realHeight = (int) (img_height * scaleY); // 将ImageView的高度重新设置为ImageView中实际绘制的Image的高度,这样上下的留白就没有了,图片也可以完整显示了,不必
// 刻意设置scaleType,使用默认的FIT_CENTER就好。
ViewGroup.LayoutParams layoutParams = iv_share_img.getLayoutParams();
layoutParams.height = realHeight;
iv_share_img.setLayoutParams(layoutParams);
}
});

最终显示效果:

这样就基本满足了需求,既能完整显示图片,上下又不会有留白。

Matrix: 利用Matrix来设置ImageView的宽高,使图片能正常显示的更多相关文章

  1. ie6下内容会撑开父级设置好的宽高

    在ie6下,内容的宽高会撑开父级设置好的宽高,在其他浏览器下不会. 会出现的问题是:如果内容宽度大于父级设置好的宽度,内容的最后一个元素会换行显示. 注意:在计算时,务必做到精准,不然可能会产生不必要 ...

  2. video设置视频的宽高

    一般情况下<video loop="loop" style="width: 100%;height:300px;" controls="cont ...

  3. js进阶 11-6 jquery如何获取和设置元素的宽高(jquery多方法)

    js进阶 11-6  jquery如何获取和设置元素的宽高(jquery多方法) 一.总结 一句话总结:jquery里面多是方法啊,比如jquery对象的宽高.所以取值是方法,赋值就是方法里面带参数. ...

  4. android屏幕适配的全攻略3-动态获取手机屏幕宽高及动态设置控件宽高

    1.获取手机屏幕宽高: DisplayMetrics dm = new DisplayMetrics(); getWindowManager().getDefaultDisplay().getMetr ...

  5. 关于actionscript中新建一个sprite,设置大小(宽高)的问题。

    有一定as3开发经验的童鞋应该知道,新建一个sprite,是无法设置大小的,即时设置了,也不会生效,宽高还是为0,据说反而有副作用(http://www.cnblogs.com/yjmyzz/arch ...

  6. iframe跨域动态设置主窗口宽高

    Q:在A项目的a页面嵌入一个iframe,src是B项目的b页面,怎样让a页面的高度跟b页面的高度一样? A:解决跨域方案:增加一个A项目的c页面. 操作步骤: 一,a页面的iframe设置: 获取到 ...

  7. Vue动态设置Dom元素宽高

    需求: slider侧边栏是宽度是动态的,使用jquery可以操作dom元素,设置宽高,但vue是避免操作dom的 <template> <div class="slide ...

  8. 【Android疑难杂症】GridView动态设置Item的宽高导致第一个Item不响应或显示不正常的问题

    前言 这个问题在之前做一个盒子项目时遇到过,最近又遇到了,使用GridView遇到的非常奇葩的问题,这里记录分享一下. 声明 欢迎转载,但请保留文章原始出处:)  博客园:http://www.cnb ...

  9. ImageView获取宽高

    在Android里放置一个ImageView im1,宽和高都是200.以下代码都是直接在OnCreate里使用. 1.在Android OnCreate里如果直接使用iv.GetWidth()返回值 ...

随机推荐

  1. javascript_06-控制流程

    流程控制 程序的三种基本结构 顺序结构 选择结构 循环结构 判断语句 if 语法: if(condition){ //todo }else if{ //todo }else{ //todo } var ...

  2. pycharm连接数据库

    今天说说如何使用pycharm连接oracle数据库 1.首先你需要安装oracle数据库 2.在pycharm中安装cx_Oracle.在file->settings->Project- ...

  3. windows RabbitMQ Server 环境配置中的一些坑

    原文:https://blog.csdn.net/lindonglian/article/details/55805637 RabbitMQ的服务端基于Erlang语言编写,要在机器上安装Rabbit ...

  4. NXP LPC系列学习笔记汇总(持续更新中)

    1. LPC11E68循环冗余校验CRC学习笔记 文章主要介绍了如何使用LPC11E68的CRC外设功能,并介绍了与CRC引擎相关的寄存器,然后以生成CRC-CCITT多项式校验为例进行了介绍. 2. ...

  5. 链表实现队列(python)

    # -*- coding: utf-8 -*- from collections import deque class Node(object): def __init__(self, value=N ...

  6. 云计算(2)-Cloud是什么

    Cloud是什么 compute cycles应建立在data center的附近而不是data center围绕着compute cycles Two kinds of clouds Example ...

  7. Python Scrapy 爬虫框架实例

    之前有介绍 scrapy 的相关知识,但是没有介绍相关实例,在这里做个小例,供大家参考学习. 注:后续不强调python 版本,默认即为python3.x. 爬取目标 这里简单找一个图片网站,获取图片 ...

  8. 发布一个npm package

    1. 创建一个package.json文件 发布到npm registry的包必须包含一个packge.json文件. 1. 必需name字段 要求: 1. 只能是一个单词,但是可以包含-或_ 2. ...

  9. icpc 银川 I. Base62 任意进制的转换 短除法

    Problem Description As we already know, base64 is a common binary-to-text encoding scheme. Here we d ...

  10. mysql更新数据,条件为实时查询出来的数据

    --将更新条件保存到临时表里 CREATE TABLE tmp3 AS (SELECT username FROM oa_user WHERE username NOT IN (SELECT user ...