Step 7. FrameLayout.draw
- public class FrameLayout extends ViewGroup {
- ......
- private Drawable mForeground;
- ......
- public void draw(Canvas canvas) {
- super.draw(canvas);
- if (mForeground != null) {
- final Drawable foreground = mForeground;
- if (mForegroundBoundsChanged) {
- mForegroundBoundsChanged = false;
- final Rect selfBounds = mSelfBounds;
- final Rect overlayBounds = mOverlayBounds;
- final int w = mRight-mLeft;
- final int h = mBottom-mTop;
- if (mForegroundInPadding) {
- selfBounds.set(0, 0, w, h);
- } else {
- selfBounds.set(mPaddingLeft, mPaddingTop, w - mPaddingRight, h - mPaddingBottom);
- }
- Gravity.apply(mForegroundGravity, foreground.getIntrinsicWidth(),
- foreground.getIntrinsicHeight(), selfBounds, overlayBounds);
- foreground.setBounds(overlayBounds);
- }
- foreground.draw(canvas);
- }
- }
- ......
- }
��������������ļ�frameworks/base/core/java/android/widget/FrameLayout.java�С�
FrameLayout��ij�Ա����draw���ȵ��ø���View�ij�Ա����draw����������UI���ݣ�Ȼ���ټ�����Ƿ�������һ��ǰ��ͼ������Ա����mForeground��ֵ�Ƿ����null�����������null�Ļ�����ô�ͻ����������ǰ��ͼ�Ĵ�С��λ�ã�Ȼ���ٵ����ó�Ա����mForeground��ָ���һ��Drawable����ij�Ա����draw���ڻ���canvas�ϻ������ǰ��ͼ��
�����������Ǿͼ�������View��ij�Ա����draw��ʵ�֣��Ա�����˽�Ӧ�ó���UI�Ļ��ƹ��̡�
Step 8. View.draw
��������������ļ�frameworks/base/core/java/android/view/View.java�У�����Ҫ�������������������
1. ���Ƶ�ǰ��ͼ�ı�����
2. ���浱ǰ�����Ķ�ջ״̬���������ڵ�ǰ�����ϴ��������ͼ�㣬�Ա�����������������Ƶ�ǰ��ͼ�ڻ���ʱ�ı߿�Ч����
3. ���Ƶ�ǰ��ͼ�����ݡ�
4. ���Ƶ�ǰ��ͼ������ͼ�����ݡ�
5. ���Ƶ�ǰ��ͼ�ڻ���ʱ�ı߿�Ч����
6. ���Ƶ�ǰ��ͼ�Ĺ�������
���������������У���Щ�ǿ����Ż��ġ����磬�����ǰ��ͼ��ijһ������ͼ�Dz����ģ����Ҹ����˵�ǰ��ͼ�����ݣ���ô��ǰ��ͼ�ı����Լ����ݾͲ�������ˣ�������ִ�е�1�͵�3�����������磬�����ǰ��ͼ���Ǵ��ڻ�����״̬����ô��2�͵�5������Ҳ�Dz���ִ�еġ�
���������Ǿͷֶ����Ķ�View��ij�Ա����draw�Ĵ��룺
- public class View implements Drawable.Callback, KeyEvent.Callback, AccessibilityEventSource {
- ......
- public void draw(Canvas canvas) {
- ......
- final int privateFlags = mPrivateFlags;
- final boolean dirtyOpaque = (privateFlags & DIRTY_MASK) == DIRTY_OPAQUE &&
- (mAttachInfo == null || !mAttachInfo.mIgnoreDirtyState);
- mPrivateFlags = (privateFlags & ~DIRTY_MASK) | DRAWN;
View��ij�Ա�����ڼ�������ִ��֮ǰ�����Ὣ��Ա����mPrivateFlags��DIRTY_MASKλ����Ϊ0���Լ���DRAWNλ����Ϊ1����Ϊ��������Ҫ��ʼ���Ƶ�ǰ��ͼ��UI�ˡ�
���Ǽ��������Ķ����룺
- // Step 1, draw the background, if needed
- int saveCount;
- if (!dirtyOpaque) {
- final Drawable background = mBGDrawable;
- if (background != null) {
- final int scrollX = mScrollX;
- final int scrollY = mScrollY;
- if (mBackgroundSizeChanged) {
- background.setBounds(0, 0, mRight - mLeft, mBottom - mTop);
- mBackgroundSizeChanged = false;
- }
- if ((scrollX | scrollY) == 0) {
- background.draw(canvas);
- } else {
- canvas.translate(scrollX, scrollY);
- background.draw(canvas);
- canvas.translate(-scrollX, -scrollY);
- }
- }
- }
���Ǽ��������Ķ����룺
- // skip step 2 & 5 if possible (common case)
- final int viewFlags = mViewFlags;
- boolean horizontalEdges = (viewFlags & FADING_EDGE_HORIZONTAL) != 0;
- boolean verticalEdges = (viewFlags & FADING_EDGE_VERTICAL) != 0;
- if (!verticalEdges && !horizontalEdges) {
- // Step 3, draw the content
- if (!dirtyOpaque) onDraw(canvas);
- // Step 4, draw the children
- dispatchDraw(canvas);
- // Step 6, draw decorations (scrollbars)
- onDrawScrollBars(canvas);
- // we're done...
- return;
- }
��δ������Ƿ�������������ĵ�2�͵�5����������View��ij�Ա����mViewFlags��FADING_EDGE_HORIZONTALλ����1��ʱ��˵����ǰ��ͼ���ڴ���ˮƽ����״̬��������Ҫ����ˮƽ�߿�Ľ���Ч����ͬ������View��ij�Ա����mViewFlags��FADING_EDGE_VERTICALλ����1��ʱ��˵����ǰ��ͼ���ڴ��ڴ�ֱ����״̬��������Ҫ���ƴ�ֱ�߿�Ľ���Ч�������ǣ������ǰ��ͼ���Ǵ��ڻ���״̬��������horizontalEdges��verticalEdges��ֵ������false��ʱ����ô�Ͳ���Ҫִ�������ĵ�2�͵�5�������ˣ���ֻ��Ҫִ�е�3����4�͵�6��������ע�⣬������dirtyOpaque��ֵ����true��ʱ��3������Ҳ�Dz���Ҫִ�еġ�
���Ǽ������·������룺
- boolean drawTop = false;
- boolean drawBottom = false;
- boolean drawLeft = false;
- boolean drawRight = false;
- float topFadeStrength = 0.0f;
- float bottomFadeStrength = 0.0f;
- float leftFadeStrength = 0.0f;
- float rightFadeStrength = 0.0f;
- // Step 2, save the canvas' layers
- int paddingLeft = mPaddingLeft;
- int paddingTop = mPaddingTop;
- final boolean offsetRequired = isPaddingOffsetRequired();
- if (offsetRequired) {
- paddingLeft += getLeftPaddingOffset();
- paddingTop += getTopPaddingOffset();
- }
- int left = mScrollX + paddingLeft;
- int right = left + mRight - mLeft - mPaddingRight - paddingLeft;
- int top = mScrollY + paddingTop;
- int bottom = top + mBottom - mTop - mPaddingBottom - paddingTop;
- if (offsetRequired) {
- right += getRightPaddingOffset();
- bottom += getBottomPaddingOffset();
- }
- final ScrollabilityCache scrollabilityCache = mScrollCache;
- int length = scrollabilityCache.fadingEdgeLength;
- // clip the fade length if top and bottom fades overlap
- // overlapping fades produce odd-looking artifacts
- if (verticalEdges && (top + length > bottom - length)) {
- length = (bottom - top) / 2;
- }
- // also clip horizontal fades if necessary
- if (horizontalEdges && (left + length > right - length)) {
- length = (right - left) / 2;
- }
- if (verticalEdges) {
- topFadeStrength = Math.max(0.0f, Math.min(1.0f, getTopFadingEdgeStrength()));
- drawTop = topFadeStrength >= 0.0f;
- bottomFadeStrength = Math.max(0.0f, Math.min(1.0f, getBottomFadingEdgeStrength()));
- drawBottom = bottomFadeStrength >= 0.0f;
- }
- if (horizontalEdges) {
- leftFadeStrength = Math.max(0.0f, Math.min(1.0f, getLeftFadingEdgeStrength()));
- drawLeft = leftFadeStrength >= 0.0f;
- rightFadeStrength = Math.max(0.0f, Math.min(1.0f, getRightFadingEdgeStrength()));
- drawRight = rightFadeStrength >= 0.0f;
- }
- saveCount = canvas.getSaveCount();
- int solidColor = getSolidColor();
- if (solidColor == 0) {
- final int flags = Canvas.HAS_ALPHA_LAYER_SAVE_FLAG;
- if (drawTop) {
- canvas.saveLayer(left, top, right, top + length, null, flags);
- }
- if (drawBottom) {
- canvas.saveLayer(left, bottom - length, right, bottom, null, flags);
- }
- if (drawLeft) {
- canvas.saveLayer(left, top, left + length, bottom, null, flags);
- }
- if (drawRight) {
- canvas.saveLayer(right - length, top, right, bottom, null, flags);
- }
- } else {
- scrollabilityCache.setFadeColor(solidColor);
- }
����ͨ��View��ij�Ա����mPaddingLeft��mPaddingRight��mPaddingTop��mPaddingBottom�Ϳ��Եõ�����ͼ�����ҡ����Լ����ڱ߾�Ĵ�С�ģ�������ʱ�������ڶ���һ����ͼ��ʱ���ܻ���Ҫ����ͼ���ڱ߾��ϻ�����������Ķ�������ʱ�������չ��ͼ���ڱ߾�������������չ��ͼ���ڱ߾��������ô����Ҫ��дView��ij�Ա����isPaddingOffsetRequired���������ķ���ֵ����Ϊtrue���������������ĸ���Ա����getLeftPaddingOffset��getRightPaddingOffset��getTopPaddingOffset��getBottomPaddingOffset���ṩ��������ҡ����Լ����ڱ߾ࡣ
��δ��뾭������͵õ��ĸ�ֵleft��right��top��bottom�����Ƿֱ��ʾ��ǰ��ͼ�����������Ƶ�����������������Ѿ������õĺ���չ���ڱ߾��ų�֮�⡣
�����left��right��top��bottom���ĸ�ֵ֮���൱�ڵõ����ҡ����Լ��±߿����ʼλ���ˣ������һ���Ҫ֪���߿�ij��ȣ�����ȷ�����ҡ����Լ��±߿���Ҫ���Ƶ�����
�߿�ij���length������View��ij�Ա����mScrollCache��ָ���һ��ScrollabilityCache����ij�Ա����fadingEdgeLength�С����ǣ����Ԥ�����õı߿�length��һ���ʺϵ�ǰ��ͼʹ�á�������Ϊ��ͼ�Ĵ�С�ǿ�����ʱ�ı�ģ�һ�������˸ı�֮��ԭ�����õı߿�length���ܾͻ��Եù�����������˵�����ǵ����������߿�������������߿����ص�ʱ����˵��ԭ�����õı߿ȹ����ˡ�����������£���Ҫ���߿�length��Ϊ��ǰ��ͼ����������ĸ߶ȺͿ��ȵĽ�С�ߵ�һ�룬�Ա���Ա�֤���������߿�������������߿ᷢ���ص���
���ҡ����Լ��±߿�Ӧ��һ��ǿ��ֵ��ǿ��ֵ��ȡֵ��ΧΪ[0.0, 1.0]�����һ���߿��ǿ��ֵ����0.0����ô�����Dz��ɼ��ģ���ʱ��Ͳ���Ҫ�������Ľ���Ч������һ���棬���һ���߿��ǿ��ֵ����1.0����ô���ij��ȵ���ԭ�����õij��ȡ����ǿ��Խ����ǿ��ֵ����Ϊһ���������ӡ����ҡ����Լ��±߿��ǿ��ֵ���Էֱ�ͨ������View��ij�Ա����getLeftFadingEdgeStrength��getRightFadingEdgeStrength��getTopFadingEdgeStrength�Լ�getBottomFadingEdgeStrength����á�ע�⣬ֻ���ڱ���verticalEdges��ֵ����true��ʱ����δ���Ż�������������߿��ǿ��ֵtopFadeStrength��bottomFadeStrength��ͬ����ֻ�б���horizontalEdges��ֵ����true��ʱ�������Ż�������������߿��ǿ��ֵleftFadeStrength��rightFadeStrength��
��������ҡ����Լ��±߿��ǿ��ֵleftFadeStrength��rightFadeStrength��topFadeStrength�Լ�bottomFadeStrength֮����δ���ͻ��ж����ǵ�ֵ�Ƿ����0���������0����ô����������Ӧ���ĸ�����drawLeft��drawRight��drawTop�Լ�drawBottom��ֵ�ͻ����true����ʾ��Ҫ�������ҡ����Լ����ĸ��߿�Ľ���Ч����
View��ij�Ա����getSolidColor���ص��ǵ�ǰ��ͼ�ı�����ɫ�������ǰ��ͼ�ı�����ɫ�Ǵ�ɫ�ģ�������solidColor��ֵ������0����ô��ʱ��ͻ�ʹ�����������ɫ�����Ʊ߿�Ľ���Ч���������ñ���scrollabilityCache��ָ���һ��ScrollabilityCache����ij�Ա����setFadeColor�������߿�Ľ���Ч����ɫ����ΪsolidColor����������DZȽϼġ������ǰ��ͼ�ı�����ɫ���Ǵ�ɫ�ģ�������solidColor��ֵ����0����������ͱȽϸ����ˣ�������Ҫ�����ڲ���canvas��������һ�黭���������������ͼ�������Ʊ߿�Ľ���Ч������������Ϊ���ܹ�ʹ�ñ�����ɫ�����Ʊ߿�Ľ���Ч����
����canvas��������һ�黭���������������ͼ����ͨ���������ij�Ա����saveLayer��ʵ�ֵġ�����ע��ڵ��ò���canvas��ָ���һ��Canvas����ij�Ա����saveLayer��ʱ�����һ������ָ��ΪCanvas.HAS_ALPHA_LAYER_SAVE_FLAG�����ʾ�ڽ����ⴴ����ͼ��ϳɵ�����canvas��������һ�黭����ȥ��Ҫ�����ⴴ����ͼ������һ������ֵ��ͬʱ�����ǻ����Կ�������ǰ��ͼ�����ҡ��Ϻ��±߿���ռ�ݵķ�Χ�ֱ�Ϊ��left, top, left + length, bottom������right - length, top, right, bottom������left, top, right, top + length���ͣ�left, bottom - length, right, bottom������������һ���ط���Ҫע����ǣ��ڲ���canvas��������һ�黭���������������ͼ��֮ǰ����δ������Ȼ��û����ĵ�ǰ��ջ״̬������ͨ��һ������saveCount�������ģ��������������ͨ�����ò���canvas��ָ���һ��Canvas����ij�Ա����getSaveCount����õġ������������ڶ��ⴴ����ͼ���ϻ����˱߿�Ľ���Ч��֮�Ϳ���ͨ��ǰ��õ�������saveCount���ָ������Ķ�ջ״̬��Ҳ���ǽ�ǰ����ⴴ����ͼ��ϳɵ�����������
���ǽ��������Ķ����룺
- // Step 3, draw the content
- if (!dirtyOpaque) onDraw(canvas);
- // Step 4, draw the children
- dispatchDraw(canvas);
��δ�������ִ�������ĵ�3�͵�4�������������Ƶ�ǰ��ͼ�����ݣ��Լ���ǰ��ͼ������ͼ�����ݣ����Ƿֱ���ͨ������View��ij�Ա����onDraw��dispatchDraw��ʵ�ֵġ�������Ҫ��ע��ǰ��ͼ������ͼ�Ļ��ƹ��̣���ˣ��ڽ�������Step 9�У���������ϸ����View��ij�Ա����dispatchDraw��ʵ�֡�
���ǽ��������Ķ����룺
- // Step 5, draw the fade effect and restore layers
- final Paint p = scrollabilityCache.paint;
- final Matrix matrix = scrollabilityCache.matrix;
- final Shader fade = scrollabilityCache.shader;
- final float fadeHeight = scrollabilityCache.fadingEdgeLength;
- if (drawTop) {
- matrix.setScale(1, fadeHeight * topFadeStrength);
- matrix.postTranslate(left, top);
- fade.setLocalMatrix(matrix);
- canvas.drawRect(left, top, right, top + length, p);
- }
- if (drawBottom) {
- matrix.setScale(1, fadeHeight * bottomFadeStrength);
- matrix.postRotate(180);
- matrix.postTranslate(left, bottom);
- fade.setLocalMatrix(matrix);
- canvas.drawRect(left, bottom - length, right, bottom, p);
- }
- if (drawLeft) {
- matrix.setScale(1, fadeHeight * leftFadeStrength);
- matrix.postRotate(-90);
- matrix.postTranslate(left, top);
- fade.setLocalMatrix(matrix);
- canvas.drawRect(left, top, left + length, bottom, p);
- }
- if (drawRight) {
- matrix.setScale(1, fadeHeight * rightFadeStrength);
- matrix.postRotate(90);
- matrix.postTranslate(right, top);
- fade.setLocalMatrix(matrix);
- canvas.drawRect(right - length, top, right, bottom, p);
- }
- canvas.restoreToCount(saveCount);
���ڵ�ǰ��ͼ�����ҡ����Լ��±߿�Ľ���Ч�����ڲ���canvas��������һ�黭���Ķ��ⴴ����ͼ���ϻ��Ƶģ���ˣ��ڻ�����֮����δ�����Ҫ���ò���canvas��ָ���һ��Canvas�������ָ�����canvas��������һ�黭���ڴ�������ͼ��ʱ�Ķ�ջ״̬�����൱���ǽ�ǰ�������Ƶı߿�Ч���ϳɵ�����canvas��������һ�黭������
���Ǽ��������Ķ����һ�δ��룺
- // Step 6, draw decorations (scrollbars)
- onDrawScrollBars(canvas);
- }
- ......
- }
�����������Ǿ���Ҫ��ע��ǰ��ͼ������ͼ�Ļ��ƹ��̣���View��ij�Ա����dispatchDraw��ʵ�֡�ע�⣬View��ij�Ա����dispatchDraw��һ����ʵ�֣�����������ViewGroup����д�ģ�Ҳ����˵��ֻ�е�һ����ͼ��������һ����ͼ����ʱ�����Ż���д����View�ij�Ա����dispatchDraw��
ǰ�������Ѿ����赱ǰ���ڴ�������ͼ��Ӧ�ó��ڵĶ�����ͼ��������һ������ΪDecorView��ͼ��DecorView���Ǵ�ViewGroup��̳������ģ�������ViewGroup������д�˸���View��ij�Ա����dispatchDraw����ˣ����������Ǿͼ�������ViewGroup�ij�Ա����dispatchDraw��ʵ�֡�
Step 9. ViewGroup.dispatchDraw
��������������ļ�frameworks/base/core/java/android/view/ViewGroup.java�У�����ʵ�ֱȽϳ������Ƿֶ����Ķ���
- public abstract class ViewGroup extends View implements ViewParent, ViewManager {
- ......
- @Override
- protected void dispatchDraw(Canvas canvas) {
- final int count = mChildrenCount;
- final View[] children = mChildren;
- int flags = mGroupFlags;
���Ǽ��������Ķ����룺
- if ((flags & FLAG_RUN_ANIMATION) != 0 && canAnimate()) {
- ......
- for (int i = 0; i < count; i++) {
- final View child = children[i];
- if ((child.mViewFlags & VISIBILITY_MASK) == VISIBLE) {
- ......
- bindLayoutAnimation(child);
- ......
- }
- }
- final LayoutAnimationController controller = mLayoutAnimationController;
- ......
- controller.start();
- ......
- if (mAnimationListener != null) {
- mAnimationListener.onAnimationStart(controller.getAnimation());
- }
- }
��δ���������鵱ǰ��ͼ�������ͼ�Ƿ���Ҫ��ʾ�������������flags��FLAG_RUN_ANIMATIONλ����1������ViewGroup��ij�Ա����canAnimate�ķ���ֵ����true������ǰ��ǰ��ͼ������������ͼ��ʾ��������ô��δ����������Ҫ��ʼ��ʾ�����ˡ�
��δ������ȼ�鵱ǰ��ͼ���ÿһ������ͼchild��������ǿɼ��ģ���ô�ͻ����ViewGroup�������һ����Ա����bindLayoutAnimation���������Ķ����������������ͼ�Ķ���֮����δ���������ٵ���ViewGroup��ij�Ա����mLayoutAnimationController��ָ���һ��LayoutAnimationController����ij�Ա����start���������������ҵ���ViewGroup��ij�Ա����mAnimationListener��ָ���һ��AnimationListener����ij�Ա����onAnimationStart��֪ͨ��Щע�ᵽ��ǰ��ͼ��Ķ��������ߣ���ǰ��ͼ�鿪ʼ��ʾ�����ˡ�
���Ǽ��������Ķ����룺
- int saveCount = 0;
- final boolean clipToPadding = (flags & CLIP_TO_PADDING_MASK) == CLIP_TO_PADDING_MASK;
- if (clipToPadding) {
- saveCount = canvas.save();
- canvas.clipRect(mScrollX + mPaddingLeft, mScrollY + mPaddingTop,
- mScrollX + mRight - mLeft - mPaddingRight,
- mScrollY + mBottom - mTop - mPaddingBottom);
- }
�����ò���canvas��������һ�黭���ļ�������֮ǰ����δ�����ȵ��ò���canvas��ָ���һ��Canvas����ij�Ա����save���������Ķ�ջ״̬���Ա��ڻ�����ɵ�ǰ��ͼ���UI֮���Իָ�canvas��������һ�黭���Ķ�ջ״̬��
���Ǽ��������Ķ����룺
- boolean more = false;
- final long drawingTime = getDrawingTime();
- if ((flags & FLAG_USE_CHILD_DRAWING_ORDER) == 0) {
- for (int i = 0; i < count; i++) {
- final View child = children[i];
- if ((child.mViewFlags & VISIBILITY_MASK) == VISIBLE || child.getAnimation() != null) {
- more |= drawChild(canvas, child, drawingTime);
- }
- }
- } else {
- for (int i = 0; i < count; i++) {
- final View child = children[getChildDrawingOrder(count, i)];
- if ((child.mViewFlags & VISIBILITY_MASK) == VISIBLE || child.getAnimation() != null) {
- more |= drawChild(canvas, child, drawingTime);
- }
- }
- }
ע�⣬������flags��FLAG_USE_CHILD_DRAWING_ORDERλ����0��ʱ�ͱ�ʾ��ǰ��ͼ�������ͼ��������������children�е�λ�ô�С����������ƣ�����Ļ�������Ҫͨ��ViewGroup��ij�Ա����getChildDrawingOrder��������Щ����ͼ�Ļ���˳��
���ǽ��������Ķ����룺
- // Draw any disappearing views that have animations
- if (mDisappearingChildren != null) {
- final ArrayList disappearingChildren = mDisappearingChildren;
- final int disappearingCount = disappearingChildren.size() - 1;
- // Go backwards -- we may delete as animations finish
- for (int i = disappearingCount; i >= 0; i--) {
- final View child = disappearingChildren.get(i);
- more |= drawChild(canvas, child, drawingTime);
- }
- }
���Ǽ��������Ķ����һ�δ��룺
- if (clipToPadding) {
- canvas.restoreToCount(saveCount);
- }
- // mGroupFlags might have been updated by drawChild()
- flags = mGroupFlags;
- if ((flags & FLAG_INVALIDATE_REQUIRED) == FLAG_INVALIDATE_REQUIRED) {
- invalidate();
- }
- if ((flags & FLAG_ANIMATION_DONE) == 0 && (flags & FLAG_NOTIFY_ANIMATION_LISTENER) == 0 &&
- mLayoutAnimationController.isDone() && !more) {
- // We want to erase the drawing cache and notify the listener after the
- // next frame is drawn because one extra invalidate() is caused by
- // drawChild() after the animation is over
- mGroupFlags |= FLAG_NOTIFY_ANIMATION_LISTENER;
- final Runnable end = new Runnable() {
- public void run() {
- notifyAnimationListener();
- }
- };
- post(end);
- }
- }
- ......
1. ������clipToPadding��ֵ�Ƿ����true������ǵĻ�����ô��˵��ǰ�����ù�����canvas��������һ�黭���IJü��������������Ѿ�����黭���ϻ�����ɵ�ǰ��ͼ���UI�ˣ���ˣ�����Ҫ�ָ�����canvas��������һ�黭����ջ״̬������ͨ�����ò���canvas��ָ���һ��Canvas����ij�Ա����restoreToCount��ʵ�ֵġ�
2. ǰ���ڻ��Ƶ�ǰ��ͼ�������ͼ��UI��ʱ���п��ܻ���Ҫ�ĵ�ǰ��ͼ��ı�־λ������ViewGroup��ij�Ա����mGroupFlags��ֵ������ĺ��mGroupFlags��FLAG_INVALIDATE_REQUIREDλ����1����ô��˵����ǰ��ͼ����Ҫ���·���һ������UI����������ͨ������ViewGroup�������һ����Ա����invalidate��ʵ�ֵġ�
3. �����ǰ��ͼ��Ķ����Ѿ���ʾ��ɣ����ҵ�ǰ��ͼ�������ͼ�Ķ���Ҳ�Ѿ���ʾ��ɣ��ٲ��ҵ�ǰ��ͼ��ע���ж��������ߣ���ô���ǻ����ViewGroup�������һ����Ա����notifyAnimationListener��֪ͨ��Щ���������ߣ���ǰ��ͼ��Ķ����Ѿ���ʾ������ע�⣬ViewGroup��ij�Ա����notifyAnimationListener������Ϣ����ʽ�����õģ���ViewGroup��ij�Ա����dispatchDraw�����ڶ���һ��ʾ������������֪ͨ��Щ���������ߡ�
�����������Ǿͼ�������ViewGroup��ij�Ա����drawChild��ʵ�֣��Ա�����˽�һ����ͼ�������ͼ�Ļ��ƹ��̡�
Step 10. ViewGroup.drawChild
��������������ļ�frameworks/base/core/java/android/view/ViewGroup.java�У�����ʵ�ֱȽϳ������Ƿֶ����Ķ���
- public abstract class ViewGroup extends View implements ViewParent, ViewManager {
- ......
- protected boolean drawChild(Canvas canvas, View child, long drawingTime) {
- boolean more = false;
- final int cl = child.mLeft;
- final int ct = child.mTop;
- final int cr = child.mRight;
- final int cb = child.mBottom;
- final int flags = mGroupFlags;
��δ������Ȼ������ͼchild������cl, ct, cr, cb�����Լ���ǰ��ͼ��ı�־λflags���Ա����������ʹ�á����⣬����more��ֵ������ʾ����ͼchild�Ƿ�����ʾ������
���ǽ��������Ķ����룺
- Transformation transformToApply = null;
- final Animation a = child.getAnimation();
- ......
- if (a != null) {
- ......
- if (mChildTransformation == null) {
- mChildTransformation = new Transformation();
- }
- more = a.getTransformation(drawingTime, mChildTransformation);
- transformToApply = mChildTransformation;
- ......
- } else if ((flags & FLAG_SUPPORT_STATIC_TRANSFORMATIONS) ==
- FLAG_SUPPORT_STATIC_TRANSFORMATIONS) {
- if (mChildTransformation == null) {
- mChildTransformation = new Transformation();
- }
- final boolean hasTransform = getChildStaticTransformation(child, mChildTransformation);
- if (hasTransform) {
- final int transformType = mChildTransformation.getTransformationType();
- transformToApply = transformType != Transformation.TYPE_IDENTITY ?
- mChildTransformation : null;
- ......
- }
- }
���ڵ�һ�����������ͼchild�ij�Ա����getAnimation�ķ���ֵa������null����������ָ���һ��Animation�������������������ͼchild�Ķ����ġ����������ͼ�Ķ�������a֮�����ǾͿ��Ե������ij�Ա����getTransformation������ִ�����Ķ����ˡ�����ö�������Ҫ����ִ�У���ô����Animation����a�ij�Ա����getTransformation�ķ���ֵmore�ͻ����true�����һ᷵������ͼchild�Ľ�������Ҫʹ�õı任��������ViewGroup��ij�Ա����mChildTransformation�С�ViewGroup��ij�Ա����mChildTransformation����ֻᱣ���ڱ���transformToApply�С�
���ڵڶ������������flags��FLAG_SUPPORT_STATIC_TRANSFORMATIONSλ����1����ʱ�����ViewGroup��ij�Ա����getChildStaticTransformation�Ϳ���֪������ͼchild�Ƿ�������һ���任������������˵Ļ�����ôViewGroup��ij�Ա����getChildStaticTransformation�ķ���ֵhasTransform�ͻ����true������������£�ViewGroup��ij�Ա����mChildTransformation�������ı任�������ҪӦ��������ͼchild�еġ�������һ��ǰ�ᣬ��ViewGroup��ij�Ա����mChildTransformation�������ı任������һ����λ����������Ϊ��λ������û�б任Ч���ġ����ViewGroup��ij�Ա����mChildTransformation�������ı任������һ����λ������ô��ͬ���ᱻ�����ڱ���transformToApply�С�
δ�ꡣ����
- �������
- AndroidӦ�ó��ڣ�Activity���IJ�����Measure�������֣�L (4�����)
- AndroidӦ�ó��ڣ�Activity���IJ�����Measure�������֣�L (1�����)
- AndroidӦ�ó��ڣ�Activity������ͼ����View���Ĵ������̷� (2�����)
- AndroidӦ�ó��ڣ�Activity���Ĵ��ڶ���Window���Ĵ����� (0�����)
- AndroidӦ�ó��ڣ�Activity�������������Ļ�����Context�� (0�����)
- AndroidӦ�ó��ڣ�Activity��ʵ�ֿ�ܼ�Ҫ���ܺ�ѧϰ�ƻ� (0�����)
- AndroidϵͳSurface���Ƶ�SurfaceFlinger������߳�ģ�� (3�����)