Android ImageView剖析及拓展

Posted wuhongqi0012

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android ImageView剖析及拓展相关的知识,希望对你有一定的参考价值。

转载来自:http://blog.csdn.net/wangjinyu501/article/details/31386371

版本:1.0  日期:2014.6.11  2014.6.12 版权:© 2014 kince 转载注明出处
  ImageView是开发中经常使用到的一个控件,也可以说是必不可少的。对于它的使用,除了注意ScaleType的理解和设置外,还需要注意其他一些问题,比如设置一张大的背景图片内存占用和释放等。还有它的拓展性方面, 像圆角图片、圆形图片、图片边框等等。因此,如果想熟练使用这个控件,就需要对其实现的机制有一个基本的了解。    ImageView也是直接继承于View类,主要的结构图如下:
 鉴于篇幅大小,就不copy ImageView的整体代码,选择结构图中的部分作为重点。首先是构造方法,代码如下: [html]  view plain copy
  1. public ImageView(Context context, AttributeSet attrs, int defStyle)   
  2.        super(context, attrs, defStyle);  
  3.        initImageView();  
  4.   
  5.        TypedArray a = context.obtainStyledAttributes(attrs,  
  6.                com.android.internal.R.styleable.ImageView, defStyle, 0);  
  7.   
  8.        Drawable d = a.getDrawable(com.android.internal.R.styleable.ImageView_src);  
  9.        if (d != null)   
  10.            setImageDrawable(d);  
  11.          
  12.   
  13.        mBaselineAlignBottom = a.getBoolean(  
  14.                com.android.internal.R.styleable.ImageView_baselineAlignBottom, false);  
  15.   
  16.        mBaseline = a.getDimensionPixelSize(  
  17.                com.android.internal.R.styleable.ImageView_baseline, -1);  
  18.   
  19.        setAdjustViewBounds(  
  20.            a.getBoolean(com.android.internal.R.styleable.ImageView_adjustViewBounds,  
  21.            false));  
  22.   
  23.        setMaxWidth(a.getDimensionPixelSize(  
  24.                com.android.internal.R.styleable.ImageView_maxWidth, Integer.MAX_VALUE));  
  25.         
  26.        setMaxHeight(a.getDimensionPixelSize(  
  27.                com.android.internal.R.styleable.ImageView_maxHeight, Integer.MAX_VALUE));  
  28.         
  29.        int index = a.getInt(com.android.internal.R.styleable.ImageView_scaleType, -1);  
  30.        if (index >= 0)   
  31.            setScaleType(sScaleTypeArray[index]);  
  32.          
  33.   
  34.        int tint = a.getInt(com.android.internal.R.styleable.ImageView_tint, 0);  
  35.        if (tint != 0)   
  36.            setColorFilter(tint);  
  37.          
  38.         
  39.        int alpha = a.getInt(com.android.internal.R.styleable.ImageView_drawableAlpha, 255);  
  40.        if (alpha != 255)   
  41.            setAlpha(alpha);  
  42.          
  43.   
  44.        mCropToPadding = a.getBoolean(  
  45.                com.android.internal.R.styleable.ImageView_cropToPadding, false);  
  46.         
  47.        a.recycle();  
  48.   
  49.        //need inflate syntax/reader for matrix  
  50.      
  51.   
  52.    private void initImageView()   
  53.        mMatrix     = new Matrix();  
  54.        mScaleType  = ScaleType.FIT_CENTER;  
  55.        mAdjustViewBoundsCompat = mContext.getApplicationInfo().targetSdkVersion <=  
  56.                Build.VERSION_CODES.JELLY_BEAN_MR1;  
  57.      
  在构造方法中也是很常规的从attrs文件中读取属性值,并进行设置。也可以看到ImageView默认使用的ScaleType 是FIT_CENTER。说到ScaleType,它是一个枚举类型,用于设置,平常使用的ScaleType就是在这里定义的。 [html]  view plain copy
  1. /**  
  2.      * Options for scaling the bounds of an image to the bounds of this view.  
  3.      */  
  4.     public enum ScaleType   
  5.         /**  
  6.          * Scale using the image matrix when drawing. The image matrix can be set using  
  7.          * @link ImageView#setImageMatrix(Matrix). From XML, use this syntax:  
  8.          * <code>android:scaleType="matrix"</code>.  
  9.          */  
  10.         MATRIX      (0),  
  11.         /**  
  12.          * Scale the image using @link Matrix.ScaleToFit#FILL.  
  13.          * From XML, use this syntax: <code>android:scaleType="fitXY"</code>.  
  14.          */  
  15.         FIT_XY      (1),  
  16.         /**  
  17.          * Scale the image using @link Matrix.ScaleToFit#START.  
  18.          * From XML, use this syntax: <code>android:scaleType="fitStart"</code>.  
  19.          */  
  20.         FIT_START   (2),  
  21.         /**  
  22.          * Scale the image using @link Matrix.ScaleToFit#CENTER.  
  23.          * From XML, use this syntax:  
  24.          * <code>android:scaleType="fitCenter"</code>.  
  25.          */  
  26.         FIT_CENTER  (3),  
  27.         /**  
  28.          * Scale the image using @link Matrix.ScaleToFit#END.  
  29.          * From XML, use this syntax: <code>android:scaleType="fitEnd"</code>.  
  30.          */  
  31.         FIT_END     (4),  
  32.         /**  
  33.          * Center the image in the view, but perform no scaling.  
  34.          * From XML, use this syntax: <code>android:scaleType="center"</code>.  
  35.          */  
  36.         CENTER      (5),  
  37.         /**  
  38.          * Scale the image uniformly (maintain the image's aspect ratio) so  
  39.          * that both dimensions (width and height) of the image will be equal  
  40.          * to or larger than the corresponding dimension of the view  
  41.          * (minus padding). The image is then centered in the view.  
  42.          * From XML, use this syntax: <code>android:scaleType="centerCrop"</code>.  
  43.          */  
  44.         CENTER_CROP (6),  
  45.         /**  
  46.          * Scale the image uniformly (maintain the image's aspect ratio) so  
  47.          * that both dimensions (width and height) of the image will be equal  
  48.          * to or less than the corresponding dimension of the view  
  49.          * (minus padding). The image is then centered in the view.  
  50.          * From XML, use this syntax: <code>android:scaleType="centerInside"</code>.  
  51.          */  
  52. Android基础到进阶UI ImageView及其子类 介绍+实例

    Android基础到进阶UI ImageView及其子类 介绍+实例

    Android ImageView 设置圆角及外边框样式

    Android ImageView 不显示JPEG图片 及 Android Studio中怎样引用图片资源

    Android自定义圆角矩形ImageView,支持Glide加载图片及颜色填充

    Android自定义圆角矩形ImageView,支持Glide加载图片及颜色填充