Matrix: 利用Matrix来设置ImageView的宽高,使图片能正常显示
在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的宽高,使图片能正常显示的更多相关文章
- ie6下内容会撑开父级设置好的宽高
在ie6下,内容的宽高会撑开父级设置好的宽高,在其他浏览器下不会. 会出现的问题是:如果内容宽度大于父级设置好的宽度,内容的最后一个元素会换行显示. 注意:在计算时,务必做到精准,不然可能会产生不必要 ...
- video设置视频的宽高
一般情况下<video loop="loop" style="width: 100%;height:300px;" controls="cont ...
- js进阶 11-6 jquery如何获取和设置元素的宽高(jquery多方法)
js进阶 11-6 jquery如何获取和设置元素的宽高(jquery多方法) 一.总结 一句话总结:jquery里面多是方法啊,比如jquery对象的宽高.所以取值是方法,赋值就是方法里面带参数. ...
- android屏幕适配的全攻略3-动态获取手机屏幕宽高及动态设置控件宽高
1.获取手机屏幕宽高: DisplayMetrics dm = new DisplayMetrics(); getWindowManager().getDefaultDisplay().getMetr ...
- 关于actionscript中新建一个sprite,设置大小(宽高)的问题。
有一定as3开发经验的童鞋应该知道,新建一个sprite,是无法设置大小的,即时设置了,也不会生效,宽高还是为0,据说反而有副作用(http://www.cnblogs.com/yjmyzz/arch ...
- iframe跨域动态设置主窗口宽高
Q:在A项目的a页面嵌入一个iframe,src是B项目的b页面,怎样让a页面的高度跟b页面的高度一样? A:解决跨域方案:增加一个A项目的c页面. 操作步骤: 一,a页面的iframe设置: 获取到 ...
- Vue动态设置Dom元素宽高
需求: slider侧边栏是宽度是动态的,使用jquery可以操作dom元素,设置宽高,但vue是避免操作dom的 <template> <div class="slide ...
- 【Android疑难杂症】GridView动态设置Item的宽高导致第一个Item不响应或显示不正常的问题
前言 这个问题在之前做一个盒子项目时遇到过,最近又遇到了,使用GridView遇到的非常奇葩的问题,这里记录分享一下. 声明 欢迎转载,但请保留文章原始出处:) 博客园:http://www.cnb ...
- ImageView获取宽高
在Android里放置一个ImageView im1,宽和高都是200.以下代码都是直接在OnCreate里使用. 1.在Android OnCreate里如果直接使用iv.GetWidth()返回值 ...
随机推荐
- Interval 用法总结
语法:INTERVAL 'integer [- integer]' {YEAR | MONTH} [(precision)][TO {YEAR | MONTH}] 该数据类型常用来表示一段时间差, 注 ...
- Nginx虚拟主机配置--配置Nginx的主配置文件
单台Nginx WEB服务器同时会配置N个网站,也可称之为配置N个虚拟域名的主机,即多个域名对应同一个80端 口. 每个虚拟主机可以是一个独立网站.可以具有独立域名,同一台物理机上面的虚拟主机相互之间 ...
- 脚本shell
vim删除以#,空格开头的行 1,删除以#号开头的行: :g/^#/d :%s/^#.*\n 2,删除以空格开头的行: :g/^\s/d “\s代表空格” :%s/^ ...
- 让你弄懂 call、apply、bind的应用和区别
call.apply.bind使用和区别 // 有只猫叫小黑,小黑会吃鱼 const cat = { name: '小黑', eatFish(...args) { console.log('this指 ...
- Springboot与ActiveMQ、Solr、Redis中分布式事物的初步探索
Springboot与ActiveMQ.Solr.Redis中分布式事物的初步探索 解决的场景:事物中的异步问题,当要求数据库与solr服务器的最终一致时. 程序条件: 利用消息队列,当数据库添加成功 ...
- 安装pytest
1.安装pytest 2.执行一个用例 进入测试用例目录下,运行以test开头的一个用例. 执行成功. 备注:1.其实测试函数或方法只要以test开头就可以被运行的2.测试文件的名字,其实可以是任意的 ...
- python_面向对象——编程步骤
校园管理系统: 设计一个学校机构管理系统,有总部.分校.有学院.老师.员工,实现具体如下需求: 1.有多个课程,课程要有定价 2.有多个班级,班级跟课程有关联 3.有多个学生,学生报名班级,交这个班级 ...
- 1. let与const
1.ES6 新增了let命令,用来声明变量.它的用法类似于var,但是所声明的变量,只在let命令所在的代码块内有效. var a = []; for (var i = 0;i<10;i++) ...
- 数位DP【模板】
经典题型 数位 DP 问题往往都是这样的题型,给定一个闭区间 $[l, r]$,让你求这个区间中满足 某种条件 的数的总数. 强烈推荐 OI Wiki——数位DP 例题 BZOJ 1026 题目:wi ...
- 安装部署mongodb
准备 groupadd mongodb useradd -g mongodb mongodb echo password |passwd --stdin mongodb mkdir -pv /data ...