ImageView源码简析
前面几篇文章我们重点看了ImageView的构造器与”三步论”。这次,我们在一起看看ImageView中的其它方法吧。
除了三步论,好戏还有很多呀。
因为在【Android_View】ImageView源码简析笔记(一)中我们曾经一起阅读过部分其它方法的源码,以此为开始。那么这里我们必然是从Step 2开始了。
其它方法简析(2)
1.1 ImageView中的Drawable
1.1.1 获取Drawable资源
很明显,这个方法返回的mDrawable是我们整个ImageView操作的基础。
public Drawable getDrawable() {
if (mDrawable == mRecycleableBitmapDrawable) {
// 如果考虑到缓存,我们需要将当前的引用清空
mRecycleableBitmapDrawable = null;
}
return mDrawable;
}
对于这个可被回收的位图资源–【mRecycleableBitmapDrawable】
private BitmapDrawable mRecycleableBitmapDrawable = null;
可以看到,这是ImageView中的成员变量。为BitmapDrawable类型,而
public class BitmapDrawable extends Drawable {…}
所以可以很清楚看到它的类型关系。
浏览整个ImageView代码,可以发现mRecycleableBitmapDrawable一共有1处有效赋值的地方:
* 1、首先是在setImageBitmap()中:
public void setImageBitmap(Bitmap bm) {
mDrawable = null;
if (mRecycleableBitmapDrawable == null) {
//【新建Bitmap并赋值给mRecycleableBitmapDrawable】
mRecycleableBitmapDrawable = new BitmapDrawable(mContext.getResources(), bm);
} else {
mRecycleableBitmapDrawable.setBitmap(bm);
}
setImageDrawable(mRecycleableBitmapDrawable);
}
这个方法的作用是设置一个Bitmap作为ImageView的显示内容。
Bitmap实际上就是我们常说的【位图】。(ps:与之相对,android L(5.0)之后,带引入了VectorDrawable即【矢量图】的支持)
来看setImageDrawable()方法:
public void setImageDrawable(@Nullable Drawable drawable) {
if (mDrawable != drawable) {
mResource = 0;
mUri = null;
final int oldWidth = mDrawableWidth;
final int oldHeight = mDrawableHeight;
//对ImageView的mDrawable变量进行赋值,并设置初始的宽高及其他属性
updateDrawable(drawable);
if (oldWidth != mDrawableWidth || oldHeight != mDrawableHeight) {