得到ImageView中drawable显示的区域的计算方法
我们都知道Imageview中有不同的拉伸比率,比如fitStart,centCrop这样的,所以imageview中的drawable不一定和imageview占有相同的位置和大小,那么怎么计算呢?
思路:
1.得到imageview现在的宽高
2.得到imageview现在显示的区域(Rect)
3.得到drawable本身图片的宽高
4.得到drawable显示时的缩放比例
5.计算得到drawable现在显示的宽高
6.通过drawable显示的宽高和imageview显示的宽高来计算出imageview距离内部drawable的内边距
7.通过imageview的显示区域和內边距计算出drawable的显示区域
// view的实际宽高
float vWidth = v.getWidth();
float vHeight = v.getHeight(); // 得到imageview中的矩阵,准备得到drawable的拉伸比率
Matrix m = v.getImageMatrix();
float[] values = new float[10];
m.getValues(values); // drawable的本身宽高
float dOriginalWidth = drawable.getIntrinsicWidth();
float dOriginalHeight = drawable.getIntrinsicHeight();
float dRatio = dOriginalWidth / dOriginalHeight;//如果大于1,表示drawable宽>高
drawable = null; //Image在绘制过程中的变换矩阵,从中获得x和y方向的缩放系数 value[0],[4]
//得到drawable的实际显示时的宽高
int dWidth = (int)(dOriginalWidth * values[0]);
int dHeight = (int)(dOriginalHeight * values[4]); //得到imageview的宽高和drawable的宽高的差值
float w = vWidth - dWidth;
float h = vHeight - dHeight; Rect startBounds = new Rect();
v.getGlobalVisibleRect(startBounds);
之后通过对startBounds进行修改,就可以求出drawable实际显示的范围了。因为拉伸模式不同,所以计算方式也不同,下面给出几种模式的计算方式
if (originalType == ScaleType.CENTER_INSIDE) {
//finalBounds = getCentInside_originalPic_finalBounds(v, dRatio, startBounds);
finalBounds.left = (int) (startBounds.left + (w / 2) + 0.5f);
finalBounds.top = (int) (startBounds.top + (h / 2) +0.5f);
finalBounds.right = (int) (startBounds.right - (w / 2) + 0.5f);
finalBounds.bottom = (int) (startBounds.bottom - (h / 2) + 0.5f);
}
else if (originalType == ScaleType.FIT_START) {
//finalBounds = getFitStart_originalPic_finalBounds(dRatio, startBounds);
finalBounds.right = (int) (startBounds.right - w + 0.5f);
finalBounds.top = startBounds.top;
finalBounds.left = startBounds.left;
finalBounds.bottom = (int) (startBounds.bottom - h + 0.5f);
}
else if (originalType == ScaleType.FIT_CENTER) {
//finalBounds = getFitCenter_originalPic_finalBounds(dRatio, startBounds);
finalBounds.left = (int) (startBounds.left + (w / 2) + 0.5f);
finalBounds.top = (int) (startBounds.top + (h / 2) +0.5f);
finalBounds.right = (int) (startBounds.right - (w / 2) + 0.5f);
finalBounds.bottom = (int) (startBounds.bottom - (h / 2) + 0.5f);
}
else if (originalType == ScaleType.FIT_END) {
//finalBounds = getFitEnd_originalPic_finalBounds(dRatio, startBounds);
finalBounds.left = (int) (startBounds.left + w + 0.5f);
finalBounds.top = (int) (startBounds.top + h + 0.5f);
finalBounds.right = startBounds.right;
finalBounds.bottom = startBounds.bottom;
}
参考自:http://blog.csdn.net/liu_zhen_wei/article/details/8349400
得到ImageView中drawable显示的区域的计算方法的更多相关文章
- Glide加载图片到自定义的圆形ImageView中不显示
当使用自定义的圆形ImageView时,发现使用Glide加载并设置默认初始图片时,自定义的ImageView一直显示默认图片,无法更新到加载的图片. 使用下面代码可以解决这个问题 Glide.wit ...
- Android中EditText显示明文与密文的两种方式
版权声明:本文为HaiyuKing原创文章,转载请注明出处! 前言 记录输入框显示.隐藏密码的简单布局以及实现方式. 效果图 代码分析 方式一 /**方式一:*/ private void sh ...
- [转]android中drawable资源的解释及例子
原文链接: http://blog.csdn.net/wode_dream/article/details/38584693 文章中的内容参考Dev Guide中的Drawable R ...
- Android中Drawable知识总结
本文是学习<Android开发艺术探索>中Drawable章节之后的一个总结. 一.常见的Drawable种类介绍 Drawable类 xml标签 描述 BitmapDrawable 表示 ...
- Android ListView滑动过程中图片显示重复错乱闪烁问题解决
最新内容建议直接访问原文:Android ListView滑动过程中图片显示重复错乱闪烁问题解决 主要分析Android ListView滚动过程中图片显示重复.错乱.闪烁的原因及解决方法,顺带提及L ...
- Android中Drawable分类汇总(上)
Android把可绘制的对象抽象为Drawable,不同的图形图像资源就代表着不同的drawable类型.Android FrameWork提供了一些具体的Drawable实现,通常在代码中都不会直接 ...
- Android:ImageView控件显示图片
1)android显示图片可以使用imageView来呈现,而且也可以通过ImageButton来实现给button添加图片. 2)在创建一个ImageView后,显示图片绑定元素是:android: ...
- CSS---解决内容过多就会出文本溢出(显示在区域外面,不换行的情况)
当我们设置我的的div,或者其它文本框固定宽度之后,文本内容过多就会出文本溢出(显示在区域外面,不换行的情况). 这时我们可以使用Css中的几个属于来解.有以下的三个属于可以解决问题: 1,word- ...
- 如何获取imageView中当前内容的相关信息并比较?
public class MainActivity extends Activity implements OnClickListener{ private Button button; privat ...
随机推荐
- 解决 Delphi XE5 写Android程序的No resource identifier found for attribute... 错误【转】
原文:http://www.hxhlb.cn/article/32142aaeb67bbc05379369c3.html 那一天,我装上了RAD Studio XE5. 当天晚上,我就写了一个小小的A ...
- Yeoman generator
使用Yeoman generator来规范工程的初始化 前言 随着开发团队不断发展壮大,在人员增加的同时也带来了协作成本的增加:业务项目越来越多,类型也各不相同.常见的类型有基础组件.业务组件.基于R ...
- Linux 安装操作系统标准
一.注意事项. 1.虚拟机安装不做过多介绍. 2.若为主机(非服务器)安装需要按照如下步骤: a.首先需要将u盘刻录pe系统然后设置开机引导为u盘启动后进入,将以前的硬盘分区全部删除. b.若主机bi ...
- open-falcon v0.2 监控部署记录
前言 好吧,不知道为什么要写,其实,官方文档已经很详细.但是,总是想写点什么,怕自己忘记了.那就简单说说吧,在部署过程中,发现官方文档和我想的不一样,可能是我按照顺序习惯了,所以想从新跟着顺写来记录一 ...
- 针对LDAP安装web接口,进行管理
1. 通过SSH连接LDAP服务器 2. 安装phpLDAPadmin运行以下命令. $ sudo apt-get install phpldapadmin 3. 配置phpLDAPadmin. $ ...
- 010.Zabbix的zatree插件安装
一 zatree简介 zatree 是来自国内58公司开发的监控软件zabbix的一个插件,主要功能是提供host group的树形展示和在item里指定关键字查询及数据排序. 二 安装前准备 2.1 ...
- ES8之async/await学习随笔
详细学习参考文档: 阮一峰老师的博客,覆盖知识点ES6/7/8/9,本篇学习笔记对阮老师的关于async/await文档中的知识点进行分点总结 在ES8中加入async/await新特性后,很明显带来 ...
- OSNIT信息收集分析框架OSRFramework
OSNIT信息收集分析框架OSRFramework OSNIT是一种从公开的信息资源搜集信息的有效方式.Kali Linux集成了一款专用分析工具集OSRFramework.该工具集包含多个常用工具 ...
- U盘制作Win7安装盘的方法
Windows 7 USB/DVD download tool 微软官方说明:http://www.microsoftstore.com/st ... Win7_usbdvd_dwnTool 下载地址 ...
- 【BZOJ 3620】 3620: 似乎在梦中见过的样子 (KMP)
3620: 似乎在梦中见过的样子 Time Limit: 15 Sec Memory Limit: 128 MBSubmit: 755 Solved: 445 Description “Madok ...