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

本文深入探讨Android中View如何根据状态绘制不同背景图片,主要涉及StateListDrawable的使用和原理,包括setState()、onStateChange()和selectDrawable()等关键方法,以及Drawable.Callback接口在View重绘过程中的作用。通过示例代码展示了如何自定义View以实现状态切换背景的效果。
摘要由CSDN通过智能技术生成

/*Return an array of resource IDs of the drawable states representing the

  • current state of the view.

*/

public final int[] getDrawableState() {

if ((mDrawableState != null) && ((mPrivateFlags & DRAWABLE_STATE_DIRTY) == 0)) {

return mDrawableState;

} else {

//根据当前View的状态属性值,将其转换为一个整型集合,并返回

mDrawableState = onCreateDrawableState(0);

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 、

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值