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()返回值 ...
 
随机推荐
- 支付宝手机网站支付(基于Java实现支付宝手机网站支付)
			
支付宝支付核心需要的参数是(APPID,PRIVATE_KEY,ALIPAY_PUBLIC_KEY) APPID:创建应用后就有的APPID. PRIVATE_KEY:应用私钥 ALIPAY_PUBL ...
 - Python标准库3.4.3-urllib.request-21.6
			
21.6. urllib.request — Extensible library for opening URLs 翻译:Z.F. The urllib.request module defines ...
 - 【DevOps】在CentOS中安装Rancher2,并配置kubernetes集群
			
准备 一台CentOS主机,安装DockerCE,用于安装Rancher2 一台CentOS主机,安装DockerCE,用于安装kubernetes集群管理主机 多台CentOS主机,安装Docker ...
 - DotnetCore下Grpc的简单使用(基于3.0版本)
			
目录: 一.简单介绍DotnetCore3.0如何将.proto文件生成对应的服务端和客户端类 二.介绍如何在服务端使用Grpc,以及Grpc需要的条件(HTTP2.TLS) 三.介绍如何创建Grpc ...
 - 拦截器(Interceptor)和过滤器(Filter)的执行顺序和区别
			
一.引言 本来想记录一下关于用户登陆和登陆之后的权限管理.菜单管理的问题,想到解决这个问题用到Interceptor,但想到了Interceptor,就想到了Filter,于是就想说一下它们的执行顺序 ...
 - python多线程实现ping多个ip
			
#!/usr/bin/env python # -*- coding:utf-8 -*- import subprocess import logging import datetime import ...
 - hive表的DDL
			
查看表 hive> show tables;创建表 hive> create table t1(id int);查看表结构 ...
 - Linux 查看实时网卡流量的几种方式
			
在工作中,我们经常需要查看服务器的实时网卡流量.通常,我们会通过这几种方式查看Linux服务器的实时网卡流量. 1. sar -n DEV 1 2 sar命令包含在sysstat工具包中,提供系统的众 ...
 - Oracle ORA-00600[2662] 解决
			
一.问题描述 1.数据库情况 1)数据库版本:11.2.0.4: 2)未开启归档: 3)没有备份:无RMAN备份.无DUMP备份: 4)数据库redo log 日志组,每组只有一个成员: 2.问题出现 ...
 - Greenplum 调优--数据分布法则 - 分布列与分区的选择
			
分布列选择黄金法则 由于Greenplum是一个分布式的数据库,数据是分散存储在各个数据节点的,所以需要告诉Greenplum数据应该如何分布. 短板效应 当用户请求QUERY时,Greenplum会 ...