DrawableContainer
2016-04-02 11:19
561 查看
和 DrawableWrapper 一样,DrawableContainer 也是一个容器。
它内部保存了 mDrawables ,然后在适当的时候切换它们。
@Override
public void draw(Canvas canvas) {
if (mCurrDrawable != null) {
mCurrDrawable.draw(canvas);
}
if (mLastDrawable != null) {
mLastDrawable.draw(canvas);
}
}实际展示的是 mCurrDrawable ,而 mLastDrawable 是为了切换时的动画效果。
StateListDrawable 是它的实现类,因为版本的限制,目前实现按钮点击效果,主要是靠它。
StateListDrawable 内部保存了 int[][] mStateSets,结合父类的中的 mDrawables,实现根据 state 切换背景。
LevelListDrawable 则是根据 level 进行切换。
AnimationDrawable,它按一定的 duration 不断切换 drawable。
它内部保存了 mDrawables ,然后在适当的时候切换它们。
@Override
public void draw(Canvas canvas) {
if (mCurrDrawable != null) {
mCurrDrawable.draw(canvas);
}
if (mLastDrawable != null) {
mLastDrawable.draw(canvas);
}
}实际展示的是 mCurrDrawable ,而 mLastDrawable 是为了切换时的动画效果。
StateListDrawable 是它的实现类,因为版本的限制,目前实现按钮点击效果,主要是靠它。
StateListDrawable 内部保存了 int[][] mStateSets,结合父类的中的 mDrawables,实现根据 state 切换背景。
@Override protected boolean onStateChange(int[] stateSet) { final boolean changed = super.onStateChange(stateSet); int idx = mStateListState.indexOfStateSet(stateSet); if (DEBUG) android.util.Log.i(TAG, "onStateChange " + this + " states " + Arrays.toString(stateSet) + " found " + idx); if (idx < 0) { idx = mStateListState.indexOfStateSet(StateSet.WILD_CARD); } return selectDrawable(idx) || changed; }
LevelListDrawable 则是根据 level 进行切换。
@Override protected boolean onLevelChange(int level) { int idx = mLevelListState.indexOfLevel(level); if (selectDrawable(idx)) { return true; } return super.onLevelChange(level); }
AnimationDrawable,它按一定的 duration 不断切换 drawable。
public void start() { mAnimating = true; if (!isRunning()) { // Start from 0th frame. setFrame(0, false, mAnimationState.getChildCount() > 1 || !mAnimationState.mOneShot); } }
private void setFrame(int frame, boolean unschedule, boolean animate) { if (frame >= mAnimationState.getChildCount()) { return; } mAnimating = animate; mCurFrame = frame; selectDrawable(frame); if (unschedule || animate) { unscheduleSelf(this); } if (animate) { // Unscheduling may have clobbered these values; restore them mCurFrame = frame; mRunning = true; scheduleSelf(this, SystemClock.uptimeMillis() + mAnimationState.mDurations[frame]); } }实现不断切换的关键:
public void scheduleSelf(Runnable what, long when) { final Callback callback = getCallback(); if (callback != null) { callback.scheduleDrawable(this, what, when); } }
@Override public void scheduleDrawable(Drawable who, Runnable what, long when) { if (verifyDrawable(who) && what != null) { final long delay = when - SystemClock.uptimeMillis(); if (mAttachInfo != null) { mAttachInfo.mViewRootImpl.mChoreographer.postCallbackDelayed( Choreographer.CALLBACK_ANIMATION, what, who, Choreographer.subtractFrameDelay(delay)); } else { ViewRootImpl.getRunQueue().postDelayed(what, delay); } } }
相关文章推荐
- lintcode-medium-Number of Airplanes in the Sky
- 使用MacBook Air的4项基本技巧
- Xenomai on the Beaglebone Black in 14 easy steps ---fwqlzz love is for ever
- 11. Container With Most Water
- 阶梯博弈(Stair Nim)
- leetcode 172. Factorial Trailing Zeroes
- rails中使用ajax
- 领域驱动设计(Domain Driven Design)参考架构详解
- leetcode 每日一题 172. Factorial Trailing Zeroes
- tail -F查看线上日志
- Run-Time Check Failure #0 错误
- leetcode 70. Climbing Stairs
- 【HDU】 1023 Train Problem II
- 解决maillog文件删除后无法重建的问题
- opencv_traincascade问题
- AIDL的Binder框架
- 出现( linker command failed with exit code 1)错误总结
- 【HDU】 1022 Train Problem I
- 手动执行failover
- 朴素贝叶斯(naive bayes)