得到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

时间: 2024-10-09 00:06:07

得到ImageView中drawable显示的区域的计算方法的相关文章

Android调用系统相册和相机选择图片并显示在imageview中

Android调用系统相册和相机选择图片并显示在imageview中,在系统调用相机拍摄中,直接返回的是经过压缩处理后的图像,当你直接把返还后的图片放在imageview中时 图片就会非常的模糊,所以要经过先存放在sd中,然后在处理并显示.当调用系统相册时,因为Android系统从4.4版本以后系统不再返回真实的uri路径,而是封装过后的uri路径,所以当你写代码时必须注意,4.4是一个分水岭,4.4以上的版本必须就通过解析和相应的处理才能获取到真实的uri路径. 先上程序运行的结果. 这个是调

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

原文链接:         http://blog.csdn.net/wode_dream/article/details/38584693 文章中的内容参考Dev Guide中的Drawable Resources,英文好的朋友可以直接去读英文.总结这篇文章的目的是自己在使用drawable资源遇到一些问题跟大家分享下,同时整理下自己对drawable的理解. drawable资源共有10种,包括Bitmap文件.Nine-Path文件.Layer List.State List.Level

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

效果图   布局文件 <?xml version="1.0" encoding="utf-8"?> <!-- Android中EditText显示明文与密文的两种方式 --> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/to

android中drawable资源的解释及例子

文章中的内容参考Dev Guide中的Drawable Resources,英文好的朋友可以直接去读英文.总结这篇文章的目的是自己在使用drawable资源遇到一些问题跟大家分享下,同时整理下自己对drawable的理解. drawable资源共有10种,包括Bitmap文件.Nine-Path文件.Layer List.State List.Level list.Transition Drawable.Inset Drawable.Clip Drawable.Scale Drawable.Sh

ImageView中scaleType属性详解

scaleType是指定图片的拉伸方式的一个属性,下面是具体的示例和介绍: <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="

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

转自:http://www.oschina.net/question/221817_121051 主要分析Android ListView滚动过程中图片显示重复.错乱.闪烁的原因及解决方法,顺带提及ListView的缓存机制.1.原因分析ListView item缓存机制:为了使得性能更优,ListView会缓存行item(某行对应的View).ListView通过adapter的getView函数获得每行的item.滑动过程中, a. 如果某行item已经滑出屏幕,若该item不在缓存内,则p

Android ListView滑动过程中图片显示重复错位闪烁问题解决[转载]

转自:here 主要分析Android ListView滚动过程中图片显示重复.错乱.闪烁的原因及解决方法,顺带提及ListView的缓存机制.1.原因分析ListView item缓存机制:为了使得性能更优,ListView会缓存行item(某行对应的View).ListView通过adapter的getView函数获得每行的item.滑动过程中, a. 如果某行item已经滑出屏幕,若该item不在缓存内,则put进缓存,否则更新缓存:b. 获取滑入屏幕的行item之前会先判断缓存中是否有可

基于开源框架Glide加载Gif资源图到Android ImageView中

<基于第三方开源框架Android Glide加载Gif资源图片到Android ImageView中> 通常Android的ImageView不能加载Gif图片,如不做任何处理,那么加载到ImageView中的Gif只显示第一帧.网上给出很多解决方案,也有不少开源框架定制专属的Gif View用于加载Gif图,这些解决方案基本上大多数是借助Android的Movie,把Gif图片资源作为流,解析成Android Movie显示,这些定制的基本思想就是先检测该图片资源是否是Gif图,若是,则按

Toast 显示一个ImageView,Toast 显示一个Button,Toast 显示一个TextView

一:Toast 显示一个ImageView 1 package zyf.EX_Ctrl_3_B; 2 import android.app.Activity; 3 import android.os.Bundle; 4 import android.widget.ImageView; 5 import android.widget.Toast; 6 public class EX_Ctrl_3_B extends Activity { 7 /** Called when the activity