TextView
,
Button
,
LinearLayout
,
RelativeLayout
其实都是
View
的子类。
子类
ViewGroup
是各种layout的基类。
ViewGroup
可装载View和其它
ViewGroup
。
ImageView
)、网页(
WebView
)等。
view的树形结构例子。在Android Studio的Component Tree面板可以查看layout的View结构
有一些通用的操作:
设置属性
:比如给
TextView
设置文字内容。每种子类都有不同的方法。在xml中也可以指定view的内容。
设置关注
:framework会处理用户输入时的移动关注。要强行关注某个view,请调用
requestFocus()
。
设置监听器
:View允许客户端设置一些监听器。例如所有的view都能设置监听器去监听focus事件。
开发者可以用
setOnFocusChangeListener(android.view.View.OnFocusChangeListener)
来设置focus事件监听。
也可监听点击事件。
设置是否可见
:用
setVisibility(int)
方法显示或隐藏view
“不要主动调measure layout draw的相关方法”
Android framework 会处理View的测量(measure),布局(layout)和绘制(draw)工作。
开发者不需要主动调用相关的方法。除非是自定义了
ViewGroup
。
Activity
,
Service
等等组件的回调函数(生命周期)。这里介绍
View
的回调函数。
分为3个阶段:measure、layout、draw
在
onMeasure
方法中View会对其所有的子元素执行measure过程,此时measure过程就从父容器“传递”到了子元素中,接着子元素会递归的对其子元素进行measure过程,如此反复完成对整个View树的遍历。onLayout与onDraw过程的执行流程与此类似。
measure过程决定了View的测量宽高,这个过程结束后,就可以通过
getMeasuredHeight
和
getMeasuredWidth
获得View的测量宽高了。
layout过程决定了View在父容器中的位置和View的最终显示宽高,
getTop
等方法可获取View的top等四个位置参数(View的左上角顶点的坐标为(left, top), 右下角顶点坐标为(right, bottom))。
getWidth
和
getHeight
可获得View的最终显示宽高
(width = right - left;height = bottom - top)
。
draw过程决定了View最终显示出来的样子,此过程完成后,View才会在屏幕上显示出来。
自定义一个类继承
View
,放到activity的layout中,打印log观察各个函数调用情况
Activity onCreate
View LifeView(Context context, @Nullable AttributeSet attrs)
View onFinishInflate
Activity onStart
Activity onResume
View onAttachedToWindow
View onMeasure
View onSizeChanged
View onLayout
View onDraw
View onWindowFocusChanged true
View onMeasure
View onLayout
View onDraw
Activity onPause
View onWindowFocusChanged false
Activity onStop
Activity onDestroy
可以看出,在activity可见(onResume
)后,view与window关联起来。
先测量,决定自身大小,决定在父容器中的位置和大小,然后绘制到屏幕上。
根据上面的log,我们也可以看出View的主要绘制流程是measure、layout、draw。
Handler。
https://an.rustfisher.com
华为开发者空间发布
让每位开发者拥有一台云主机
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
[email protected]