/**
* A set of information given to a view when it is attached to its parent
* window.
*/
final static class AttachInfo {
//回调接口
interface Callbacks {
//播放声音反馈
void playSoundEffect(int effectId);
//执行触摸时的反馈
boolean performHapticFeedback(int effectId, boolean always);
}
/**
* InvalidateInfo is used to post invalidate(int, int, int, int) messages
* to a Handler. This class contains the target (View) to invalidate and
* the coordinates of the dirty rectangle.
*
* For performance purposes, this class also implements a pool of up to
* POOL_LIMIT objects that get reused. This reduces memory allocations
* whenever possible.
*/
//postinvalidate() / invalidate() 时,发送给的Message的 object 对象
static class InvalidateInfo {
private static final int POOL_LIMIT = 10;
//维持着一个长度为10 异步对象池
//SynchronizedPool-内部实现是一个数组,获取和 释放 加了对象锁
private static final SynchronizedPool<InvalidateInfo> sPool =
new SynchronizedPool<InvalidateInfo>(POOL_LIMIT);
//目标view
View target;
//目标left
int left;
//目标的top
int top;
//目标right
int right;
//目标bottom
int bottom;
//sPool中获取 invalidateInfo 对象,没有则new
public static InvalidateInfo obtain() {
InvalidateInfo instance = sPool.acquire();
return (instance != null) ? instance : new InvalidateInfo();
}
// 释放invalidateInfo 对象
public void recycle() {
target = null;
sPool.release(this);
}
}
//IWindowSession 是一个aidl 接口,wms 进程的回调接口,
//https://www.androidos.net.cn/android/9.0.0_r8/xref/frameworks/base/core/java/android/view/IWindowSession.aidl
final IWindowSession mSession;
//IWindow 是一个aidl 接口 :当wms发生改变时,回调该接口方法 //https://www.androidos.net.cn/android/9.0.0_r8/xref/frameworks/base/core/java/android/view/IWindow.aidl
// mWindow 是 IWindow 接口的 Binder类
final IWindow mWindow;
//IWindow 中 的 binder
//mWindowToken= mWindow.asBinder()
final IBinder mWindowToken;
//view 的显示相关信息
Display mDisplay;
//callbacks 回调
final Callbacks mRootCallbacks;
//从mSession 中获取的 IWindowId 接口
//interface IWindowId{
//void registerFocusObserver(IWindowFocusObserver observer);
//void unregisterFocusObserver(IWindowFocusObserver observer);
//boolean isFocused();
//}
IWindowId mIWindowId;
// WindowId 是 IWindowId 包装类
WindowId mWindowId;
/**
* The top view of the hierarchy.
*/
//AttachInfo 所依附关联的View
View mRootView;
// 父类Window 的windowToken
IBinder mPanelParentWindowToken;
//是否支持硬件加速
boolean mHardwareAccelerated;
//是否支持硬件加速
boolean mHardwareAccelerationRequested;
//渲染线程
ThreadedRenderer mThreadedRenderer;
//渲染节点
List<RenderNode> mPendingAnimatingRenderNodes;
/**
* The state of the display to which the window is attached, as reported
* by {@link Display#getState()}. Note that the display state constants
* declared by {@link Display} do not exactly line up with the screen state
* constants declared by {@link View} (there are more display states than
* screen states).
*/
//显示状态
int mDisplayState = Display.STATE_UNKNOWN;
/**
* Scale factor used by the compatibility mode
*/
//兼容模式比例因子
float mApplicationScale;
/**
* Indicates whether the application is in compatibility mode
*/
//是否兼容模式
boolean mScalingRequired;
/**
* Left position of this view's window
*/
//View Window left坐标
int mWindowLeft;
/**
* Top position of this view's window
*/
//View Window top坐标
int mWindowTop;
/**
* Indicates whether views need to use 32-bit drawing caches
*/
//是否使用32位缓存
boolean mUse32BitDrawingCache;
/**
* For windows that are full-screen but using insets to layout inside
* of the screen areas, these are the current insets to appear inside
* the overscan area of the display.
*/
final Rect mOverscanInsets = new Rect();
/**
* For windows that are full-screen but using insets to layout inside
* of the screen decorations, these are the current insets for the
* content of the window.
*/
//全屏window 内容区域
final Rect mContentInsets = new Rect();
/**
* For windows that are full-screen but using insets to layout inside
* of the screen decorations, these are the current insets for the
* actual visible parts of the window.
*/
//全屏window 可见区域
final Rect mVisibleInsets = new Rect();
/**
* For windows that are full-screen but using insets to layout inside
* of the screen decorations, these are the current insets for the
* stable system windows.
*/
final Rect mStableInsets = new Rect();
final DisplayCutout.ParcelableWrapper mDisplayCutout =
new DisplayCutout.ParcelableWrapper(DisplayCutout.NO_CUTOUT);
/**
* For windows that include areas that are not covered by real surface these are the outsets
* for real surface.
*/
final Rect mOutsets = new Rect();
/**
* In multi-window we force show the navigation bar. Because we don't want that the surface
* size changes in this mode, we instead have a flag whether the navigation bar size should
* always be consumed, so the app is treated like there is no virtual navigation bar at all.
*/
boolean mAlwaysConsumeNavBar;
/**
* The internal insets given by this window. This value is
* supplied by the client (through
* {@link ViewTreeObserver.OnComputeInternalInsetsListener}) and will
* be given to the window manager when changed to be used in laying
* out windows behind it.
*/
final ViewTreeObserver.InternalInsetsInfo mGivenInternalInsets
= new ViewTreeObserver.InternalInsetsInfo();
/**
* Set to true when mGivenInternalInsets is non-empty.
*/
boolean mHasNonEmptyGivenInternalInsets;
/**
* All views in the window's hierarchy that serve as scroll containers,
* used to determine if the window can be resized or must be panned
* to adjust for a soft input area.
*/
//可以滚动视图集合
final ArrayList<View> mScrollContainers = new ArrayList<View>();
final KeyEvent.DispatcherState mKeyDispatchState
= new KeyEvent.DispatcherState();
/**
* Indicates whether the view's window currently has the focus.
*/
//view 的window 是否 有焦点
boolean mHasWindowFocus;
/**
* The current visibility of the window.
*/
//当前window 的可见性
int mWindowVisibility;
/**
* Indicates the time at which drawing started to occur.
*/
//开始绘制时间
long mDrawingTime;
/**
* Indicates whether or not ignoring the DIRTY_MASK flags.
*/
//是否忽略DIRTY_MASK标志
boolean mIgnoreDirtyState;
/**
* This flag tracks when the mIgnoreDirtyState flag is set during draw(),
* to avoid clearing that flag prematurely.
*/
boolean mSetIgnoreDirtyState = false;
/**
* Indicates whether the view's window is currently in touch mode.
*/
//view 的 window 是否处于 touch 模式
boolean mInTouchMode;
/**
* Indicates whether the view has requested unbuffered input dispatching for the current
* event stream.
*/
boolean mUnbufferedDispatchRequested;
/**
* Indicates that ViewAncestor should trigger a global layout change
* the next time it performs a traversal
*/
boolean mRecomputeGlobalAttributes;
/**
* Always report new attributes at next traversal.
*/
boolean mForceReportNewAttributes;
/**
* Set during a traveral if any views want to keep the screen on.
*/
//保持屏幕常亮
boolean mKeepScreenOn;
/**
* Set during a traveral if the light center needs to be updated.
*/
boolean mNeedsUpdateLightCenter;
/**
* Bitwise-or of all of the values that views have passed to setSystemUiVisibility().
*/
int mSystemUiVisibility;
/**
* Hack to force certain system UI visibility flags to be cleared.
*/
int mDisabledSystemUiVisibility;
/**
* Last global system UI visibility reported by the window manager.
*/
int mGlobalSystemUiVisibility = -1;
/**
* True if a view in this hierarchy has an OnSystemUiVisibilityChangeListener
* attached.
*/
boolean mHasSystemUiListeners;
/**
* Set if the window has requested to extend into the overscan region
* via WindowManager.LayoutParams.FLAG_LAYOUT_IN_OVERSCAN.
*/
boolean mOverscanRequested;
/**
* Set if the visibility of any views has changed.
*/
boolean mViewVisibilityChanged;
/**
* Set to true if a view has been scrolled.
*/
boolean mViewScrollChanged;
/**
* Set to true if a pointer event is currently being handled.
*/
boolean mHandlingPointerEvent;
/**
* Global to the view hierarchy used as a temporary for dealing with
* x/y points in the transparent region computations.
*/
final int[] mTransparentLocation = new int[2];
/**
* Global to the view hierarchy used as a temporary for dealing with
* x/y points in the ViewGroup.invalidateChild implementation.
*/
final int[] mInvalidateChildLocation = new int[2];
/**
* Global to the view hierarchy used as a temporary for dealing with
* computing absolute on-screen location.
*/
final int[] mTmpLocation = new int[2];
/**
* Global to the view hierarchy used as a temporary for dealing with
* x/y location when view is transformed.
*/
final float[] mTmpTransformLocation = new float[2];
/**
* The view tree observer used to dispatch global events like
* layout, pre-draw, touch mode change, etc.
*/
final ViewTreeObserver mTreeObserver;
/**
* A Canvas used by the view hierarchy to perform bitmap caching.
*/
Canvas mCanvas;
/**
* The view root impl.
*/
final ViewRootImpl mViewRootImpl;
/**
* A Handler supplied by a view's {@link android.view.ViewRootImpl}. This
* handler can be used to pump events in the UI events queue.
*/
final Handler mHandler;
/**
* Temporary for use in computing invalidate rectangles while
* calling up the hierarchy.
*/
final Rect mTmpInvalRect = new Rect();
/**
* Temporary for use in computing hit areas with transformed views
*/
final RectF mTmpTransformRect = new RectF();
/**
* Temporary for use in computing hit areas with transformed views
*/
final RectF mTmpTransformRect1 = new RectF();
/**
* Temporary list of rectanges.
*/
final List<RectF> mTmpRectList = new ArrayList<>();
/**
* Temporary for use in transforming invalidation rect
*/
final Matrix mTmpMatrix = new Matrix();
/**
* Temporary for use in transforming invalidation rect
*/
final Transformation mTmpTransformation = new Transformation();
/**
* Temporary for use in querying outlines from OutlineProviders
*/
final Outline mTmpOutline = new Outline();
/**
* Temporary list for use in collecting focusable descendents of a view.
*/
final ArrayList<View> mTempArrayList = new ArrayList<View>(24);
/**
* The id of the window for accessibility purposes.
*/
int mAccessibilityWindowId = AccessibilityWindowInfo.UNDEFINED_WINDOW_ID;
/**
* Flags related to accessibility processing.
*
* @see AccessibilityNodeInfo#FLAG_INCLUDE_NOT_IMPORTANT_VIEWS
* @see AccessibilityNodeInfo#FLAG_REPORT_VIEW_IDS
*/
int mAccessibilityFetchFlags;
/**
* The drawable for highlighting accessibility focus.
*/
Drawable mAccessibilityFocusDrawable;
/**
* The drawable for highlighting autofilled views.
*
* @see #isAutofilled()
*/
Drawable mAutofilledDrawable;
/**
* Show where the margins, bounds and layout bounds are for each view.
*/
boolean mDebugLayout = SystemProperties.getBoolean(DEBUG_LAYOUT_PROPERTY, false);
/**
* Point used to compute visible regions.
*/
final Point mPoint = new Point();
/**
* Used to track which View originated a requestLayout() call, used when
* requestLayout() is called during layout.
*/
View mViewRequestingLayout;
/**
* Used to track views that need (at least) a partial relayout at their current size
* during the next traversal.
*/
List<View> mPartialLayoutViews = new ArrayList<>();
/**
* Swapped with mPartialLayoutViews during layout to avoid concurrent
* modification. Lazily assigned during ViewRootImpl layout.
*/
List<View> mEmptyPartialLayoutViews;
/**
* Used to track the identity of the current drag operation.
*/
IBinder mDragToken;
/**
* The drag shadow surface for the current drag operation.
*/
public Surface mDragSurface;
/**
* The view that currently has a tooltip displayed.
*/
View mTooltipHost;
/**
* Creates a new set of attachment information with the specified
* events handler and thread.
*
* @param handler the events handler the view must use
*/
AttachInfo(IWindowSession session, IWindow window, Display display,
ViewRootImpl viewRootImpl, Handler handler, Callbacks effectPlayer,
Context context) {
mSession = session;
mWindow = window;
mWindowToken = window.asBinder();
mDisplay = display;
mViewRootImpl = viewRootImpl;
mHandler = handler;
mRootCallbacks = effectPlayer;
mTreeObserver = new ViewTreeObserver(context);
}
}
- AttachInfo 类里面,主要 包含了 view 和 Window 的关联信息。
- AttacInfo.InvalidateInfo 类中,包含了 View 的下一帧绘制信息,通过handler 发送到UI线程