Activity和View之间的关系
每个Activity都包含一个Window对象,Window对象通常是由PhoneWindow实现的。 PhoneWindow:将DecorView设置为整个应用窗口的根View,DecorView:是顶层视图,将要显示的具体内容呈现在PhoneWindow上,DecorView是当前Activity所有View的祖先,它并不会向用户呈现任何东西。
DecorView为整个Window界面的最顶层View,它只有一个子元素LinearLayout。代表整个Window界面,包含通知栏、标题栏、内容显示栏三块区域。其中LinearLayout中有两个FrameLayout子元素。
事件分发机制
事件传递的顺序:Activity
-> ViewGroup
-> View
事件分发涉及的几个方法。
Activity的事件分发
ViewGroup的事件分发
View的事件分发
View的绘制
MeasureSpec
Layout
Draw
详细的可以看一下这篇文章,写得 比较清楚:Android View的绘制过程
常见面试题
怎么获取view的高度
handler.post 能不能获取到高度
不能
复制代码
onCreate设置了contentView之后,获取它里面的一个textview的宽高能获取吗,如果想获取宽高如何去做?
如果想让一个imageView高度跟着一个textview的高度变化怎么做
onGlobalLayoutChange里能获取到宽高吗
可以。
`OnGlobalLayoutListener` 是`ViewTreeObserver`的内部类,当一个视图树的布局发生改变时,可以被ViewTreeObserver监听到,这是一个注册监听视图树的观察者(observer),在视图树的全局事件改变时得到通知。
复制代码
还在onCreate的时候用textView.post,之后再runnable中能获取宽高吗,为什么
可以
复制代码
view.post有自己的队列吗
没有自己的队列,但是实在View渲染过之后才会加入队列。
复制代码
view的x和left区别
从 Android 3.0 开始,View 增加了 x,y,translationX 和 translationY。
x,y 同样是 View 左上角相对父容器的坐标,但不同于 left 和 top ,这两个坐标点的值并一定都是相等的。而不相等的情况是由 translationX 和 translationY 值的设置引起的。
view的requestLayout和Initlayout区别
requestLayout:
requestLayout会直接递归调用父窗口的requestLayout,直到ViewRootImpl,然后触发peformTraversals,由于mLayoutRequested为true,会导致onMeasure和onLayout被调用。不一定会触发OnDraw。requestLayout触发onDraw可能是因为在在layout过程中发现l,t,r,b和以前不一样,那就会触发一次invalidate,所以触发了onDraw,也可能是因为别的原因导致mDirty非空(比如在跑动画)
invalidate:
view的invalidate不会导致ViewRootImpl的invalidate被调用,而是递归调用父view的invalidateChildInParent,直到ViewRootImpl的invalidateChildInParent,然后触发peformTraversals,会导致当前view被重绘,由于mLayoutRequested为false,不会导致onMeasure和onLayout被调用,而OnDraw会被调用
postInvalidate:
postInvalidate是在非UI线程中调用,invalidate则是在UI线程中调用。
复制代码
View的动画
动画分哪几类。
属性动画内部实现原理,差值器和估值器的使用。
属性动画和补间动画的区别。