Android基础—View相关知识

Activity和View之间的关系

WechatIMG14.png

每个Activity都包含一个Window对象,Window对象通常是由PhoneWindow实现的。 PhoneWindow:将DecorView设置为整个应用窗口的根View,DecorView:是顶层视图,将要显示的具体内容呈现在PhoneWindow上,DecorView是当前Activity所有View的祖先,它并不会向用户呈现任何东西。

DecorView为整个Window界面的最顶层View,它只有一个子元素LinearLayout。代表整个Window界面,包含通知栏、标题栏、内容显示栏三块区域。其中LinearLayout中有两个FrameLayout子元素。

事件分发机制

事件传递的顺序:Activity -> ViewGroup -> View

事件分发涉及的几个方法。

image.png

Activity的事件分发

image.png

ViewGroup的事件分发

image.png

View的事件分发

image.png

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的动画

动画分哪几类。

属性动画内部实现原理,差值器和估值器的使用。

属性动画和补间动画的区别。

分类:
Android
标签: