【Android】ImageView源码简析
引文
这里是【重要声明】:
首先非常非常非常感谢您能阅读这篇文章,重要的谢谢当然是说三遍。
【1】因为Android系统中与View体系相关的内容较为复杂庞大,而一篇文章根本不可能讲述完所有的要点,因此文章中对于某些属性细节仅为介绍,而其实现以及具体的使用与分析等引用了【其它博主】的相应【博文】,借此希望能略微免除读者再额外搜索查阅的烦恼。在此对相应文章的作者表示感谢,由于没有预先与相关博主进行沟通联系,如若侵犯了您的权益,请您联系我,立刻删除相应的链接。再次表示感谢。
【2】文中有些方法内容的简析在可能我们平时编程时基本不会调用,但知其然与知其所以然应该能帮助我们更好的理解ImageView。
【3】作者水平有限,文章会有很多Bug,希望小伙伴们多多批评,我将及时学习改正,我们大家共同学习。
ImageView是Android开发中常用的图像显示控件。网上有很多关于其某某具体属性分析的文章,但是搜索来搜索去都没有发现相应的总结。因此希望借这篇文章将其代码简要的分析一下。站在前人的肩膀上,也不能总是吃老本啊,总归也是要拓展一下的。
本次源码的分析建立在Android API 25的基础上,毕竟截止到写作时传说中Android O(26)还只是beta_4版本啊。
我们先忽略它的直接与间接子类,只看继承关系。首先,通过官网的解释(如下图):
可以很清楚看到ImageView直接继承于View。
一、内部成员变量及其枚举类与构造器简析
1、其成员变量(与相应注释)主要如下:
private Uri mUri;
private int mResource = 0;
//【ImageView】中利用【矩阵】来处理缩放等操作
private Matrix mMatrix;
//缩放类型
private ScaleType mScaleType;
private boolean mHaveFrame = false;
private boolean mAdjustViewBounds = false;
private int mMaxWidth = Integer.MAX_VALUE;
private int mMaxHeight = Integer.MAX_VALUE;
//以下变量与显示的Drawable有关
private ColorFilter mColorFilter = null; //色彩滤镜
private boolean mHasColorFilter = false;//是否含有色彩滤镜
private Xfermode mXfermode;//图像混合模式
private int mAlpha = 255;//透明度
private final int mViewAlphaScale = 256;
private boolean mColorMod = false;
private Drawable mDrawable = null;
private BitmapDrawable mRecycleableBitmapDrawable = null;
//注意tint:为图片设置渲染颜色,单独设置时,会覆盖掉原有背景图片
private ColorStateList mDrawableTintList = null;//着色列表
private PorterDuff.Mode mDrawableTintMode = null;//图像(渲染)混合
private boolean mHasDrawableTint = false;
private boolean mHasDrawableTintMode = false;
private int[] mState = null;//图像当前的状态
private boolean mMergeState = false;
private int mLevel = 0;
[一篇关于Level的博文](http://blog.csdn.net/zhangphil/article/details/48936209)
private int mDrawableWidth;
private int mDrawableHeight;
private Matrix mDrawMatrix = null