我们都知道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显示的区域的计算方法的更多相关文章

  1. Glide加载图片到自定义的圆形ImageView中不显示

    当使用自定义的圆形ImageView时,发现使用Glide加载并设置默认初始图片时,自定义的ImageView一直显示默认图片,无法更新到加载的图片. 使用下面代码可以解决这个问题 Glide.wit ...

  2. Android中EditText显示明文与密文的两种方式

    版权声明:本文为HaiyuKing原创文章,转载请注明出处! 前言 记录输入框显示.隐藏密码的简单布局以及实现方式. 效果图    代码分析 方式一 /**方式一:*/ private void sh ...

  3. [转]android中drawable资源的解释及例子

    原文链接:         http://blog.csdn.net/wode_dream/article/details/38584693 文章中的内容参考Dev Guide中的Drawable R ...

  4. Android中Drawable知识总结

    本文是学习<Android开发艺术探索>中Drawable章节之后的一个总结. 一.常见的Drawable种类介绍 Drawable类 xml标签 描述 BitmapDrawable 表示 ...

  5. Android ListView滑动过程中图片显示重复错乱闪烁问题解决

    最新内容建议直接访问原文:Android ListView滑动过程中图片显示重复错乱闪烁问题解决 主要分析Android ListView滚动过程中图片显示重复.错乱.闪烁的原因及解决方法,顺带提及L ...

  6. Android中Drawable分类汇总(上)

    Android把可绘制的对象抽象为Drawable,不同的图形图像资源就代表着不同的drawable类型.Android FrameWork提供了一些具体的Drawable实现,通常在代码中都不会直接 ...

  7. Android:ImageView控件显示图片

    1)android显示图片可以使用imageView来呈现,而且也可以通过ImageButton来实现给button添加图片. 2)在创建一个ImageView后,显示图片绑定元素是:android: ...

  8. CSS---解决内容过多就会出文本溢出(显示在区域外面,不换行的情况)

    当我们设置我的的div,或者其它文本框固定宽度之后,文本内容过多就会出文本溢出(显示在区域外面,不换行的情况). 这时我们可以使用Css中的几个属于来解.有以下的三个属于可以解决问题: 1,word- ...

  9. 如何获取imageView中当前内容的相关信息并比较?

    public class MainActivity extends Activity implements OnClickListener{ private Button button; privat ...

随机推荐

  1. 《MySQL技术内幕 InnoDB存储引擎 》学习笔记

    第1章  MySQL体系结构和存储引擎 1.3 MySQL存储引擎 数据库和文件系统最大的区别在于:数据库是支持事务的 InnoDB存储引擎: MySQL5.5.8之后默认的存储引擎,主要面向OLTP ...

  2. 【redis】3.Spring 集成注解 redis 项目配置使用

    spring-data-redis  项目,配合 spring 特性并集成 Jedis 的一些命令和方法. 配置redis继承到spring管理项目,使用注解实现redis缓存功能. 参考:http: ...

  3. 关于set

    set 这是一个十分神奇的东西 他的基本原理是平衡树 而且这个set的运用其实方便了一些在计算时间上的优化(STL大法好) 其实是因为我不会写平衡树 这个set的基本用法如下: iterator 指针 ...

  4. 循序渐进学.Net Core Web Api开发系列【5】:文件上传

    系列目录 循序渐进学.Net Core Web Api开发系列目录 本系列涉及到的源码下载地址:https://github.com/seabluescn/Blog_WebApi 一.概述 本篇介绍通 ...

  5. activiti初学

    公司现有的工作流是比较老的JBPM,用起来不太方便,经常性的流程跑一半就停止不前了.闲暇之余学习下activiti的使用,基本配置如下: 1.创建pom.xml文件所依赖的jar包 <proje ...

  6. 八. Pandas的轴

    axis=0代表跨行(down),而axis=1代表跨列(across) 使用0值表示沿着每一列或行标签\索引值向下执行方法 使用1值表示沿着每一行或者列标签模向执行对应的方法 下图代表在DataFr ...

  7. dsu on tree题表

    dsu on tree,又名树上启发式合并.重链剖分,是一类十分实用的trick,它常常可以作为一些正解的替代算法: 1.DFS序+线段树/主席树/线段树合并 2.对DFS序分块的树上莫队 3.长链剖 ...

  8. zoj 3640 概率dp

    题意:一只吸血鬼,有n条路给他走,每次他随机走一条路,每条路有个限制,如果当时这个吸血鬼的攻击力大于等于某个值,那么就会花费t天逃出去,否则,花费1天的时间,并且攻击力增加,问他逃出去的期望 用记忆化 ...

  9. 【BZOJ-4180】字符串计数 后缀自动机 + 矩阵乘法

    4180: 字符串计数 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 146  Solved: 66[Submit][Status][Discuss] ...

  10. JDK版本的特性

    1. 2.JDK1.5增加的是: (1) 泛型与枚举类型(枚举类型是静态,常量.里面也可以包含构造方法,成员方法,但是构造方法一定是私有的. 适合枚举的是 有限数据,封装特定的数据,), (2)注解( ...