有多种因素会导致触发refreshDrawableState,当前只考虑其中一种setPressed即设置视图是否处于被按下状态。其他会触发此方法的有focusChanged等。
原理是定义不同状态的图片,系统进行状态监听例如在onTouchEvent中判断当前在什么状态,再根据之前提供的图片进行设置并重绘显示效果。
以下是根据代码一个具体的流程,其中解释的并不是太多,当前也都比较简单都是直接的方法调用顺序。
先来看看View.setPressed源码
public void setPressed(boolean pressed) {
if (pressed) {
mPrivateFlags |= PRESSED ;
} else {
mPrivateFlags &= ~PRESSED;
}
refreshDrawableState();
dispatchSetPressed(pressed);
}
其中调用了View.refreshDrawableState,下面查看一下相关代码View.refreshDrawableState与 View.drawableStateChanged:
一
public void refreshDrawableState() {
// 用于判断是否发生状态变化
mPrivateFlags |= DRAWABLE_STATE_DIRTY ;
// 状态改变后进行绘制
drawable