Android中View绘制各种状态的背景图片原理深入分析以及StateListDrawable使用,android音频

本文详细解释了Android中的setState()方法如何在View中管理Drawable状态,包括onStateChange()、Drawable.Callback接口的作用,以及View绘制背景图片的过程。通过自定义View示例展示了如何在不同状态下动态更换背景图片。
摘要由CSDN通过智能技术生成

mPrivateFlags &= ~DRAWABLE_STATE_DIRTY;

return mDrawableState;

}

}

通过这段代码我们可以明白View内部是如何获取更细后的状态值以及动态获取对应的背景Drawable对象----setState()方法

去完成的。这儿我简单的分析下Drawable类里的setState()方法的功能,把流程给走一下:

Step 1 、 setState()函数原型 ,

函数位于:frameworks\base\graphics\java\android\graphics\drawable\StateListDrawable.java 类中

//如果状态态值发生了改变,就回调onStateChange()方法。

public boolean setState(final int[] stateSet) {

if (!Arrays.equals(mStateSet, stateSet)) {

mStateSet = stateSet;

return onStateChange(stateSet);

}

return false;

}

该函数的主要功能: 判断状态值是否发生了变化,如果发生了变化,就调用onStateChange()方法进一步处理。

Step 2 、onStateChange()函数原型:

该函数位于 frameworks\base\graphics\java\android\graphics\drawable\StateListDrawable.java 类中

//状态值发生了改变,我们需要找出第一个吻合的当前状态的Drawable对象

protected boolean onStateChange(int[] stateSet) {

//要找出第一个吻合的当前状态的Drawable对象所在的索引位置, 具体匹配算法请自己深入源码看看

int idx = mStateListState.indexOfStateSet(stateSet);

//获取对应索引位置的Drawable对象

if (selectDrawable(idx)) {

return true;

}

}

该函数的主要功能: 根据新的状态值,从StateListDrawable实例对象中,找到第一个完全吻合该新状态值的索引下标处 ;

继而,调用selectDrawable()方法去获取索引下标的当前Drawable对象。

具体查找算法在 mStateListState.indexOfStateSet(stateSet) 里实现了。基本思路是:查找第一个能完全吻合该新状态值

的索引下标,如果找到了,则立即返回。 具体实现过程,只好看看源码咯。

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

  • 27
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值