我们都知道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的显示区域

  1. // view的实际宽高
  2. float vWidth = v.getWidth();
  3. float vHeight = v.getHeight();
  4.  
  5. // 得到imageview中的矩阵,准备得到drawable的拉伸比率
  6. Matrix m = v.getImageMatrix();
  7. float[] values = new float[10];
  8. m.getValues(values);
  9.  
  10. // drawable的本身宽高
  11. float dOriginalWidth = drawable.getIntrinsicWidth();
  12. float dOriginalHeight = drawable.getIntrinsicHeight();
  13. float dRatio = dOriginalWidth / dOriginalHeight;//如果大于1,表示drawable宽>高
  14. drawable = null;
  15.  
  16. //Image在绘制过程中的变换矩阵,从中获得x和y方向的缩放系数 value[0],[4]
  17. //得到drawable的实际显示时的宽高
  18. int dWidth = (int)(dOriginalWidth * values[0]);
  19. int dHeight = (int)(dOriginalHeight * values[4]);
  20.  
  21. //得到imageview的宽高和drawable的宽高的差值
  22. float w = vWidth - dWidth;
  23. float h = vHeight - dHeight;
  24.  
  25. Rect startBounds = new Rect();
  26. v.getGlobalVisibleRect(startBounds);

之后通过对startBounds进行修改,就可以求出drawable实际显示的范围了。因为拉伸模式不同,所以计算方式也不同,下面给出几种模式的计算方式

  1. if (originalType == ScaleType.CENTER_INSIDE) {
  2. //finalBounds = getCentInside_originalPic_finalBounds(v, dRatio, startBounds);
  3. finalBounds.left = (int) (startBounds.left + (w / 2) + 0.5f);
  4. finalBounds.top = (int) (startBounds.top + (h / 2) +0.5f);
  5. finalBounds.right = (int) (startBounds.right - (w / 2) + 0.5f);
  6. finalBounds.bottom = (int) (startBounds.bottom - (h / 2) + 0.5f);
  7. }
  8. else if (originalType == ScaleType.FIT_START) {
  9. //finalBounds = getFitStart_originalPic_finalBounds(dRatio, startBounds);
  10. finalBounds.right = (int) (startBounds.right - w + 0.5f);
  11. finalBounds.top = startBounds.top;
  12. finalBounds.left = startBounds.left;
  13. finalBounds.bottom = (int) (startBounds.bottom - h + 0.5f);
  14. }
  15. else if (originalType == ScaleType.FIT_CENTER) {
  16. //finalBounds = getFitCenter_originalPic_finalBounds(dRatio, startBounds);
  17. finalBounds.left = (int) (startBounds.left + (w / 2) + 0.5f);
  18. finalBounds.top = (int) (startBounds.top + (h / 2) +0.5f);
  19. finalBounds.right = (int) (startBounds.right - (w / 2) + 0.5f);
  20. finalBounds.bottom = (int) (startBounds.bottom - (h / 2) + 0.5f);
  21. }
  22. else if (originalType == ScaleType.FIT_END) {
  23. //finalBounds = getFitEnd_originalPic_finalBounds(dRatio, startBounds);
  24. finalBounds.left = (int) (startBounds.left + w + 0.5f);
  25. finalBounds.top = (int) (startBounds.top + h + 0.5f);
  26. finalBounds.right = startBounds.right;
  27. finalBounds.bottom = startBounds.bottom;
  28. }

参考自: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. 【转】HTML5 API——无刷新更新地址 history.pushState/replaceState 方法

    (window.location)在通过JavaScript更改以后,浏览器都会通过刷新来到达你更改后的URL(location的意思就是位 置..) 而在JavaScript MVC开始流行之后,通 ...

  2. MySQL查询语句执行过程及性能优化-查询过程及优化方法(JOIN/ORDER BY)

    在上一篇文章MySQL查询语句执行过程及性能优化-基本概念和EXPLAIN语句简介中介绍了EXPLAIN语句,并举了一个慢查询例子:

  3. conda设置Python虚拟环境

    conda设置Python虚拟环境     版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/Co_zy/article/details/7741261 ...

  4. SpringBoot详细研究-04部署测试与监控

    这部分的内容实际就是devops的主要工作内容,当然一名合格的程序要也需要掌握这部分的知识. 热部署 简单来说,在开发时,修改了任何的代码,IDE将自动编译运行及发布:在发布时,当前发布不影响线上服务 ...

  5. Django的URL别名

      项目的urls.py配置文件   from message.views import getform       urlpatterns = [   url(r'^admin/', admin.s ...

  6. [CQOI2007]涂色

    [CQOI2007]涂色 题目大意: 假设你有一条长度为\(n\)的木版,初始时没有涂过任何颜色.每次你可以把一段连续的木版涂成一个给定的颜色,后涂的颜色覆盖先涂的颜色.问达到给定的目标至少要多少次操 ...

  7. MyBatis3与Spring3无缝集成-从iBatis平滑过渡

    从2010开始接触iBatis到现在,一直到现在把iBatis作为数据访问层ORM.为了演示一个Web应用,今天又搭了个SpringMVC应用,由于应用比较简单,Spring版本直接用最新版本3.2. ...

  8. 设置java.library.path的值(Mac/Linux/Windows)

    说明:网上基本针对这个值的设置分为两面,Windows派和Linux派,Windows的不说,Linux下只会说设置LD_LIBRARY_PATH即可,但这种方式在Java 8是一个错误的设置,尤其是 ...

  9. LightOJ 1118 - Incredible Molecules (两圆面积交)

    1118 - Incredible Molecules   PDF (English) Statistics Forum Time Limit: 0.5 second(s) Memory Limit: ...

  10. Windows Sysinternals实战指南

    http://www.epubit.com.cn/book/details/4786 Mark Russinovich是Microsoft Azure首席技术官,主要负责微软云计算平台的技术战略和架构 ...