---- Activity#setContentView 关于View的工作原理,大家可能会问:为什么不直接看View呢?...因为我觉得Activty是呈现应用界面的载体,所有的View都在Acitivity中,并且在理解Activity的启动XML的加载也是一种了解View工作原理的一个很好的入口。...//这里mContentParent就是我们布局加载的父View,activity_main就是加载到他里面 if (mContentParent == null) {...---- 总结 通过上面的流程,我们现在就了解了Activity的布局加载,现在我们来梳理下流程: ? Android布局加载.png 层级结构关系: ?...---- DecorView添加到窗口过程 1.ActivityThread#performResumeActivity 上面我们已经了解了,Activity的布局加载过程,当我们加载布局完成后我们是如何将我们加载的布局添加到我们的界面窗口的呢
在activity的布局中,线性布局和表格布局是最简单的,这次分别从线性布局,表格布局以及线性布局和表格混合布局做了实验,实验中只需要编写 相应的xml的代码,java代码不需要更改,因为我们这里只是练习...其中本实验用到的各控件的属性解释如下: android:layout_weight属性是指不同的控件在activity中占有体积大小的比例。 ...-- 线性布局中 android:layout_weight属性是指不同的控件在activity中占有体积大小的比例。...: 表格布局有点类似表单的意思,可以在activity中建立多行,每一行又可以设置为多列,所以看起来横竖条理比较清晰,因此叫做表格布局。 ...这次实验将上面的2个实验混合起来显示的,即总的布局为垂直方向上的线性布局,上面那个布局内部又为垂直方向的布局,下面那个布局为也是一个线性布局,不过里面嵌入了一个表格布局,所以总共有4个布局。
有些时候我们需要获取到View的宽高信息。在onCreate和onResume中尝试view.getWidth()或是view.getHeiht()时,我们会发现获取到的是0。...Activity视图在创建完成后,各个子view并不一定被加载完成。 获取宽高正确的方法有哪些呢?...方法1 - 在Activity的onWindowFocusChanged获取宽高 @Override public void onWindowFocusChanged(boolean hasFocus)...: mBtn1.getWidth == " + mBtn1.getWidth()); } 方法2 - 使用ViewTreeObserver的OnGlobalLayoutListener回调 获取View...从log的时间上可以看出,在view加载完毕后,执行的Runnable。 应用 - 动态调整ImageView的宽高 获取到view的宽高后,我们可以动态地调整ImageView的高度。
View、Window以及Activity主要是用于显示并与用户交互的。这让我们在初学的时候很容易弄混,而且无法理解他们区别以及联系。本文是笔者查阅相关资料后,结合自己的理解写出来。...3、Activity 3.1 Activity基本理解 对于开发人员来说,一个Activity就“相当于”一个界面(通过setContentView指定具体的View)。...我们可以直接在Activity里处理事件,如onKeyEvent,onTouchEvent等。 并可以通过Activity维护应用程序的生命周期。 3.2 Activity有存在的必要吗?...我们把Activity所做的事情,全部封装到Window不就好了? 其实,本质上讲,我们要显示一个窗口出来,的确可以不需要Activity。悬浮窗口中不就是没有使用Activity来显示一个悬浮窗吗?...既然如此,Window(以及View)能处理点击事件以及封装各种逻辑,那为啥还需要Activity呢?
相对布局要比前面讲的线性布局和表格布局要灵活一些,所以平常用得也是比较多的。...本次实验就是显示如下的activity: ? 其中只有2个button,1个textview,1个edittext。 ...在相对布局中,一般用到的控件属性解释如下: 在相对布局中有如下属性,解释如下: android:layout_above 为将该控件的底部放在指定id控件的上方 ...将该控件右边与指定id控件右边对齐 android:layout_alignTop 将该控件顶端与指定id控件顶端对齐 实现上面activity...的相对布局比较灵活,一些常见的属性也比较多,用得多自然就会了。
在研究activity组件的view加载之前,先整体认 识下activity的布局,有助于更好的去理解setContentView方法 Chapter One:认识Activity的布局 对于研究布局这种东西...从这张activity的布局图可以看到:一个activity对应一个应用窗口mWindow,应用窗口mWindow包括activity的顶级view是 mDecorView,mDecorView包括状态栏...布局的最外层view,包括标题栏和activity的内容布局 mContentParent:activity的内容布局,继承自ViewGroup,用来加载存放activity的view树,如果没有标题栏...对activity的布局大致有个了解之后,就开始去分析activity启动后加载view的流程 Chapter Two:activity加载view布局----始于setContentView ...对于activity的布局的加载大致分为两部分,一部分是加载view,另一部分是将view绑定到应用窗口Window。
上节课我们主要介绍了 view 组件,及它的一些主要的属性,这节课我们继续介绍这个组件,以及如何基于 flex 布局思想,实现常见的 ui 布局。基本所有常见的布局,都可以使用 view 实现。...view 容器组件最大的作用,就是实现 ui 布局。最常用的是 flex 布局。flex 布局指将 display 样式设置为 flex,再加以其它相关的样式实现的布局。...关于 flex 布局有三个十分重要的样式: 1,justify-content:调整内容在主轴方向的排列方式 2,align-items:对齐元素在辅轴方向的对齐方式 3,align-content:对齐多行内容在辅轴方向上的排列方式...view> ?...view> ?
ViewRootImpl:ViewRootImpl是View的根,它控制了View的测量和绘制,同时持有WindowSession通过Binder与WMS通信,同时持有IWindow作为WSM的回调接口...DecorView:继承FrameLayout,是视图树的根布局。 ?...从启动Activity说起 第一个部分是启动Activity到创建出ViewRootImpl。 ?...应用无论是使用View/Canvas绘制(软件绘制,Skia),或者使用硬件加速绘制,最底层都是与Surface(OpenGL)进行交互。...再回到Activity的生命周期onCreate,调用setContentView创建一个不可见的DecorView,当ActivityThread.handleResumeActivity -> Activity.makeVisible
()测量 、 再onLayout()布局 、最后onDraw()绘制。...包含什么 布局: onlayout onmeausre/ Layout:viewGroup 显示: onDraw :view: canvas paint matrix clip rect animation...text绘制 frameWork: 交互: onTouchEvent :组合的viewGroup LayoutParams与MeasureSpec LayoutParams LayoutParams(布局参数...),也就是xml里定义的 image.png image.png 获取 image.png MeasureSpec MeasureSpec是一个(32位)的int值,高两位表示父容器对 view 的布局上的限制...onLayout() 9.因为度量的时候,已经确定了每一行存哪几个View,把他存到数组里,这样布局的时候简单很多 image.png 10.布局onLayout()重要的就是确定上下左右。
app-> java->com.jay.helloworld->MainActivity 这是主Activity。...它是应用的入口,当您构建和运行应用时,系统会启动此Activity的实例并加载其布局, public class MainActivity extends AppCompatActivity {...() { @Override public void onClick(View view) { Snackbar.make...4. app->res->layout->activity_main.xml 此XML文件定义了activity界面(UI)的布局,整体布局都是采用CoordinatorLayout布局,这个布局是support...v7系统新增的布局,具有便于协调子布局的特点,该布局是增强版的FrameLayout布局,它通常与ToolBar和FloatingActionButton合用。
之前写了一篇文章介绍自定义View,主要是介绍了自定义View绘制相关的操作。 这里主要是介绍自定义View另一个重要的关键——布局Layout。...绘制相关介绍可以参考:https://www.jianshu.com/p/8b96285cda49 自定义布局 自定义布局主要分为两个部分, 测量(measure()) 和 布局 (layout())...测量过程: 从根view递归调用每一级子view的measure()方法 布局流程:从根view递归调用每一级子view的layout()方法,把测量时得到的子View的尺寸和位置传递给子View。...具体的布局流程如下: 1,在xml中编写View的相关属性 (layout_xxx,设置View的宽高等) 2,父View在自己的onMeasure()方法中,根据xml中设置的要求和自己可用的空间...的布局,先看效果 标签效果 标签我使用了自定义的View如下,这个属于自定义view的绘制部分,比较简单不是本篇文章介绍的重点,这里就不多说了。
一、首先我们先看下Activity是如何显示View 平常我们在Activity的onCreate会调用setContentView(R.layout.xxx),Activity启动过程与window的源码流程可参考...总结几个步骤: 1、创建Activity:ActivityThread的performLaunchActivity函数中创建Activity后,调用Activity.attach函数 2、创建PhoneWindow...:Activity.attach函数中创建与之关联的PhoneWindow,PhoneWindow会创建DectorView。...的onResume, 然后设置Activity的PhoneWindow的type类型: r.window = r.activity.getWindow(); View decor = r.window.getDecorView...view = (View) layoutInflater.inflate(R.layout.window_test_main, null); WindowManager windowManager =
这行代码将content_main.xml 的布局嵌入activity_main布局中。...match_parent" android:layout_height="match_parent" app:layout_behavior="@string/appbar_scrolling_view_behavior
params); //更新View public void removeView(View view); //删除View } 5.Activity中setContentView()发生了什么...或者layout布局文件填充到这个mContentParent中,后面会讲到具体细节。...DecoreView本质就是一个FrameLayout,是Activity中的顶级View,如果我们不设置任何主题style,默认加载的DecorView会addView以下布局文件 ?...即使Activity的布局已经成功添加到DecorView中,DecorView此时还没有添加到Window中 ActivityThread的handleResumeActivity方法中,首先会调用Activity...ViewRootImpl中调用performTraversals方法,然后便开始测量布局绘画了,界面才得以显示出来,这就是View的绘制流程起点。 10、Token是什么?
对于网页布局,推荐 Flex 是 Flexible Box 的缩写,意为"弹性布局",用来为盒状模型提供最大的灵活性。...对于这个布局的多动手,实在是一个非常不错的方法。...flex-direction flex-wrap flex-flow justify-content align-items align-content 先声明这个是什么布局, 直接在对于的父...view里面用, 下面的代码 display: flex; 对于第一个flex-direction,父view里面的元素排列方式,就是flex布局(这里注意是里面的view才生效,如果作用范围不是这个,...row | row-reverse | column | column-reverse; flex-wrap 这个意思,对于元素太多,而且指定每个view的宽度,view 宽度大于最大宽度是否换行,依次的意思不换号
listview分两部分: 1.activity 2.item 将item通过setAdapter绑定到activity。 activity布局如下: <?...android:layout_height="fill_parent" android:id="@+id/listView" /> item布局..."25sp" android:layout_height="wrap_content" android:id="@+id/amount" /> Java代码activity...Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main
序言 很多人都会用Activity、Window、View,但是你知道他们是怎样加载出来并呈现在你眼前的吗?你知道他们之间有着鲜为人知的关系吗? ?...在这个例子当中,画板就好比Activity,纸就好比Window,而笔就是View,我们所看到的就是这幅画,是通过笔一点一点画出来的,在哪里画呢?当然是纸上了,而最终承载这幅画的东西就是画板了。...Activity的创建过程 我们都知道,Activity启动的时候是从ActivityThread中的Handler中发起的,然后经过handlerLauncher等一系列方法,如果还不知道的话可以去参考我之前写的...方法中创建了一个Window,这个Window就是我们经常听到的PhoneWindow View的创建过程 我们大胆的猜测一下,View应该是被添加到Window中的,那么我们来看一下,到底是怎样添加的呢...a.mFinished && willBeVisible) { 8 r.window = r.activity.getWindow(); 9 View decor =
而对于ViewGroup来说,则是一个用于存放其他View和ViewGroup对象的布局容器!...viewgroup.png Android为我们提供了View和ViewGroup的两个子类的集合,提供常用的一些输入控件(比如按钮,图片和文本域等)和各种各样的布局模式(比如线程布局,相对布局,绝对布局...View的容器,而它的子视图View可能是输入一些控件或者在某块区域的小部件UI。...绝对布局: 指子控件通过绝对定位x,y位置来决定其位置摆放。 表格布局: 指以行列的形式放置子控件,每一行是一个TableRow对象或者View对象。...listview.png 结语 本文主要讲解 Android精通:View与ViewGroup,LinearLayout线性布局,RelativeLayout相对布局,ListView列表组件 下面我将继续对
我们都知道布局文件的加载是在Activity的onCreate()方法中,使用setContentView进行加载 这个方法是个重载方法 ?...直接创建了一个PhoneWindow对象, 那么意味着 每创建一个Activity都会创建一个PhoneWindow对象 那么PhoneWindow与Window到底是什么关系呢? ?...PhoneWindow是Window的子类 那么到此为止, 我们知道了其实Activity中的setContentView实际上是PhoneWindow在处理 我们找到PhoneWindow.java能发现其对应的方法...咱们平常开发时在xml中写的布局并不是根结点, 而是contentParent的子view 总结 它们之间的关系可以大致理解为: Activity: 相当于一栋房子 Window: 相当于房子里的一扇窗户...View: 相当于窗户上的一朵窗花 它们三个的创建顺序为: Activity--->Window--->View 具体时序图如下: ?
5、Activity、View、Window三者如何关联? 为什么要设计Activity、View、Window?...下面是重点:Activity、View、Window三者的关系。 美丽的窗花View View如何跟Activity关联起来的?...如图所见,DecorView它不仅包含了我们自己的布局,它还包含了titleBar。为啥需要?结构上的需要,更好的管理布局。...Window作为中间人,已经关联了Activity跟View了,那么如果处理Activity跟View之间的关系呢?...4、View跟Window有什么联系? View需要通过Window来展示在Activity上。 5、Activity、View、Window三者如何关联?
领取专属 10元无门槛券
手把手带您无忧上云