Step 3 、selectDrawable()函数原型:
该函数位于 frameworks\base\graphics\java\android\graphics\drawable\StateListDrawable.java 类中
public boolean selectDrawable(int idx)
{
if (idx >= 0 && idx < mDrawableContainerState.mNumChildren) {
//获取对应索引位置的Drawable对象
Drawable d = mDrawableContainerState.mDrawables[idx];
…
mCurrDrawable = d; //mCurrDrawable即使当前Drawable对象
mCurIndex = idx;
…
} else {
…
}
//请求该View刷新自己,这个方法我们稍后讲解。
invalidateSelf();
return true;
}
该函数的主要功能是选择当前索引下标处的Drawable对象,并保存在mCurrDrawable中。
知识点三: 关于Drawable.Callback接口
该接口定义了如下三个函数:
//该函数位于 frameworks\base\graphics\java\android\graphics\drawable\Drawable.java 类中
public static interface Callback {
//如果Drawable对象的状态发生了变化,会请求View重新绘制,
//因此我们对应于该View的背景Drawable对象能够”绘制出来”.
public void invalidateDrawable(Drawable who);
//
public void scheduleDrawable(Drawable who, Runnable what, long when);
//
public void unscheduleDrawable(Drawable who, Runnable what);
}
其中比较重要的函数为:
public voidinvalidateDrawable(Drawable who)
函数功能:如果Drawable对象的状态发生了变化,会请求View重新绘制,因此我们对应于该View的背景Drawable对象
能够重新”绘制“出来。
Android框架View类继承了该接口,同时实现了这三个函数的默认处理方式,其中invalidateDrawable()方法如下:
public class View implements Drawable.Callback, KeyEvent.Callback, AccessibilityEventSource
{
…
//Invalidates the specified Drawable.
//默认实现,重新绘制该视图本身
public void invalidateDrawable(Drawable drawable) {
if (verifyDrawable(drawable)) { //是否是同一个Drawable对象,通常为真
final Rect dirty = drawable.getBounds();
final int scrollX = mScrollX;
final int scrollY = mScrollY;
//重新请求绘制该View,即