学习
实践
活动
工具
TVP
写文章

View 源码分析——setContentView

.} // mDecor要改变的标记位 mDecor.startChanging(); // 它将 layoutResource 布局文件解析成 View PhoneWindow里面创建DecorView,DecorView会去加载系统的一个布局(FrameLayout) 将页面自己写的布局填充到DecorView布局里面id为R.id.content的View ,也就是FrameLayout里面 View层级图 [系统布局.png]

33020

View 绘制源码分析

通过阅读源码得知在PhoneWindow的DecorView中对应的模式为EXACTLY,大小size就是对应屏幕的尺寸,而view大小是由父view与子view共同决定 //这里的两个参数都是由父布局传进来的 NOTIFY_AUTOFILL_ENTER_ON_LAYOUT;         notifyEnterOrExitForAutoFillIfNeeded(true);     } } ViewGroup源码查看采用 left + width, top + height); } onLayout 分析总结 从源码中得知View的layout方法可以重载,而ViewGroup的layout方法不可以重载,子类必须实现抽象方法 但是当viewgroup需要通过onDraw方法来绘制内容时,于是就要显示的关闭WILL_NOT_DRAW方法 Draw 分析总结 当是一个viewgroup,那么要递归所有的子view已完成绘制 从源码中可知 viewgroup不绘制任何内容,真正绘制在子view中进行,也就是调用子view的draw方法进行绘制 View动画和ViewGroup布局动画区别: View动画指的是View自身的动画,可以通过

19930
  • 广告
    关闭

    11.11云上盛惠

    万元礼包限时领取,百款云产品特惠助力上云,云服务器2核2G低至4.2元/月

  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    View·dispatchTouchEvent 源码分析(三)

    查看上节文章View·从 InputEvent 到 dispatchTouchEvent 源码分析(二)。 我们观察到上述代码在处理ACTION_DOWN事件时候得到执行机会,也就是在收到ACTION_DOWN事件时,框架会遍历View[]。而View[]的初始化可追述到addView()方法。 所以上段代码最终表达了一件事情:遍历View[],并依据 View 拦截事件的返回值构建出一条处理链。重点请看方法dispatchTransformedTouchEvent()。 1.6.1 第一次事件(ACTION_DOWN)的分发过程之分发到 View result的true/false,决定 View 是否能收到后续的手势事件,看到下方有几处会影响result取值的地方。 从DecorView到具体的得到焦点的 View(如果中途被拦截,那就是拦截的 View),通过ACTION_DOWN 事件确定了一个 TouchTarget 分发链,那么接续的事件都将通过这条分发链进行处理

    67430

    View·dispatchTouchEvent 源码分析(四)

    上节概述 从上节View·dispatchTouchEvent 源码分析(三)中,我们分析了 ACTION_DOWN 事件的派发和拦截过程。 接下去,我们分析后续的事件是怎么被处理的! 所以追述到View中。 // (01) 如果child是空,则将ACTION_CANCEL消息分发给当前ViewGroup; // 只不过会将ViewGroup看作它的父类View,调用View的dispatchTouchEvent 如果它的第三个参数child是null,则会将触摸消息分发给ViewGroup自己,只不过此时是将ViewGroup看作一个View,即调用View的dispatchTouchEvent()进行消息分发 下一章将会分析View在调用dispatchTouchEvent()时会影响哪些方法,并且这些影响的方法如何在实际工作中产生效用。

    28720

    View的事件源码解析

    上次刚刚分析了view的事件拦截机制,那么这次我们通过源码来分析一波view的事件,如果对view的事件不了解的,可以先看View的事件拦截浅析 解析View源码 既然是分析源码,那么我们就要找准入手点 我们打开onTouchEvent的源码,看个究竟。 ... 源码太多,这边我省略了部分源码,留了几个重点,我们可以看下clickable是通过或的关系得到的,也就是只要长按和点击有一个执行,那他为ture。 dispatchTouchevent 这样我们差不多把事件分析的源码整理的差不多了。 我们去翻下源码,看看在哪边执行了这个方法。

    40760

    视图view类-源码解析

    首先,在控制器类中保持着一个view类的对象实例,只要继承自控制器父类的类都可以使用这个实例,所以我们在控制器子类中就可以使用view类实例去很容易的调用模板,输出内容。 类的display方法,display的主要实现逻辑还在view类中。 核心代码逻辑在view类的140行左右。 在view类的fetch方法中并没有直接调用模板引擎template类的的方法去解析模板,而是去调用了一个view_parse标签,在这个标签上绑定了行为模式扩展类ParseTemplateBehavior 关于模板引擎解析模板的裸机,请看源码分析8

    31010

    View事件分发机制源码解析

    注:本文解析的源码基于 API 25,部分内容来自于《Android开发艺术探索》。 之前重新梳理了一下 View 事件的分发,所以为了有所记录,下定决心要写一篇关于 View 事件分发的博客。 先遍历了所有的子 View ,会根据点击坐标是否落在子view范围内以及子view是否正在动画来判断是否接收事件。 否则就直接将事件分发给子 View 了。 References Android中MotionEvent的来源和ViewRootImpl Android 事件分发机制源码攻略(二) —— ViewGroup篇

    9940

    View的绘制流程源码分析

    概述 View的绘制流程主要是指测量、布局以及绘制显示,在View中,measure是测量View的宽高,layout是控制View四个顶点的位置,而draw就是将布局直接绘制出来。 View的measure过程 View的measure说简单也简单,说复杂也复杂,我们直接通过源码来看看measure的时候到底经历了什么。 而我们继续往下看ViewGroup源码的时候,我们可以发现它还有一个方法就是measureChildWithMargins,字面意思就是测量的时候算上margins的值,具体我们还是通过源码来看一下: 那我们就通过最常用的Linearlayout源码来分析onlayout方法。 return; } ··· } 可以通过源码的注释发现,如果可能的话跳过第二步和第五步。

    35660

    Android View 源码解析(二) - LayoutInflater

    继Android View 源码解析(一) - setContentView之后接着说 之前我们分析了setContentView方法的相关代码 接下来说说LayoutInflater的方法 LayoutInflater 源码分析 与setContentView相关 在PhoneWindow的generateLayout中调用了 View in = mLayoutInflater.inflate(layoutResource = null); } public View inflate(XmlPullParser parser, @Nullable ViewGroup root) { return inflate = null); } public View inflate(@LayoutRes int resource, @Nullable ViewGroup root, boolean attachToRoot 0]; mConstructorArgs[0] = inflaterContext; //定义返回值 初始化传入形参 root View

    31340

    Android View 源码解析(一) - setContentView

    本系列主要是探讨View的绘制过程及部分相关的实现机制的源码分析 setContentView分析 相关关系 Activity中有Window成员 实例化为PhoneWindow PhoneWindow view) { setContentView(view, new ViewGroup.LayoutParams(MATCH_PARENT, MATCH_PARENT)); } @ Override public void setContentView(View view, ViewGroup.LayoutParams params) { if (mContentParent ); } else { //已经为View 直接使用View的addView方法追加到当前mContentParent中 mContentParent.addView 源码总结 创建一个DecorView的对象mDector 该mDector将作为整个应用窗口的根视图 根据根据Feature等style theme创建不同的窗口修饰布局文件 并且通过findViewById

    41140

    Android中View研究自学之路 Android6.0源码分析之View(一)Android6.0源码分析之View(二)

    Chapter Two,view自学之路 对于view的研究始于view.java和viewgroup.java,刚开始我是一点一点儿看代码,看过源码的都知道,view.java共22580行,单单是 Chapter Three,如何使用viewview需要放在view容器里,即viewgroup中,viewgroup表示的是一组view。 当然你也可以直接继承自view,来实现一种完全自定义的view 第二步,创建view的构造方法,对于view有四种构造方法,至于这四种构造方法有什么区别,都要覆写吗? 这类问题可以参考我的另一篇博客 Android6.0源码分析之View(一) 第三步,重写onMeasure方法,onMeasure就做了一件事,就是将所测量的宽高保存起来,这个在父类view中已经做了处理 ,你可以忽略,也就是说如果你对大小没有特殊的处理可以遵循父类view的处理,对于measure相关的可以看另一篇博客 Android6.0源码分析之View(二)--measure 第四步,重写onDraw

    30170

    自定义View | invalidate()源码分析

    = VISIBLE)、 或者没有设置动画mCurrentAnimation == null等 (mCurrentAnimation在View源码是一个全局变量,跟动画有关,可以看一下源码) 】, View的draw()的源码 我们在《自定义View | 基础概述 & 自定义TextView实战 & 基于源码分析自定义View继承自ViewGroup时无法正常绘制的问题》这篇笔记中有提及到, 下面是源码注释中总结的六个步骤: ? 这里的是主线程; 归结一下invalidate()的流程 简要浏览完源码了,归结一下invalidate()的大概流程: 首先从调用了invalidate()的View开始, 一路往上,跑到最外层的 用最外层的View调用draw(), draw()如源码第四步有一个dispatchDraw(),又会一路往下画, 不断的绘制子孩子,再绘制子孩子的子孩子, 最终绘制到 调用了invalidate(

    35720

    View·InputEvent事件投递源码分析(一)

    总结 本文从源码角度,描述了如下4个阶段: 从底层硬件产生的触摸事件,并将事件传递到InputEventReceiver中。 事实也是如此: // android.view.View public boolean dispatchTouchEvent(MotionEvent event) { } 事件产生 —— 通过命令创造 所以它具备将InputEvent派发到指定的View的能力。 省略无关的代码 public void setView(View view, WindowManager.LayoutParams attrs, View panelParentView) { processPointerEvent方法是对触摸事件的预处理,在View执行拖拽时将会使用到预处理后的值。

    94540

    Android6.0源码分析之View(二)--measure Android6.0源码分析之View(一)

    接着上一篇 Android6.0源码分析之View(一) 紧接着来学习view的measure,(注,开始写博客之后,很明显我的学习效率高多了,研究了俩星期硬是没有研究view的measure,接下来终于可以来好好研究研究了 测量规范其实故名思义可以知道就是父view规定以什么样的方式进行测量子view,简单介绍一下MeasureSpec: 1>,测量规范中是父view对子view的布局要求,每一个MeasureSpec对象只包含一种测量规范 ,要么是父view对子view的宽度测量要求,要么是高度测量要求。 对子view的大小不做限制,子view想要多大就多大 EXACTLY(准确的):父view已经对子view的大小有个明确的规定值,所以无论子view想要多大必须使用父view对子view的这个值 AT_MOST 方法总结: 也就是说,该方法返回了view的默认大小的值,这个值跟父view对子view是否进行了限制有关, 如果父view对子view没进行限制,则返回所建议的view的大小, 若进行了限制,则返回测量规范对象中的

    42590

    View·从 InputEvent 到 dispatchTouchEvent 源码分析(二)

    大概 延续上一篇文章(View·InputEvent事件投递源码分析(一))得出的结论,本文接着对 View、ViewGroup 的事件派发、拦截进行源码分析。 ViewRootImpl#setView 里的 View 是什么? 上一篇文章得到 View 的屏幕触摸事件的处理由 ViewPostImeInputStage 类进行处理。 FINISH_HANDLED : FORWARD; } 【 Tips : 阅读源码的时候,时刻需要带着问题去找答案。】 // ViewRootImpl.java public void setView(View view, WindowManager.LayoutParams attrs, View panelParentView 倒不是执意要去造轮子,只是想通过自己对源码的分析加深对分发过程的理解。

    47120

    Android6.0源码分析之View(一)

    对于view我的学习思路是先要对view相关的知识进行一个整体的系统的了解,然后在对view中各个知识模块进行详细的研究,如果有正在研究view并且遇到问题的可以留言,大家一起讨论讨论。 想要对view先有个整体的了解,我建议大家参考view.java中的类的注释,注释中交代了view所涉及到的所有知识。 父view可能对子view多次调用measure方法。例如,父view去测量未指明大小的view所想要的size,又或者所有view的大小加起来过大或者过小时就会重新进行measure。 view给子view一个确定值,不论子view想要多大,只能使用父view给子view规定的值 AT_MOST:至多,父view会规定一个最大值,子view的大小不能超过这个值 通过调用requestlayout 动画可以是view进行伸缩,旋转,平移和透明度渐变的动画。如果一个有子viewview添加了动画,那么这个动画会影响以该view为一个根节点沿着view树向下的所有view

    32580

    Android View源码解读:浅谈DecorView与ViewRootImpl

    在深入接触View的测量、布局、绘制这三个流程之前,我们从Activity入手,看看从Activity创建后到View的正式工作之前,所要经历的步骤。以下源码均取自Android API 21。 Activity中,会在onCreate()方法中写下这样一句: setContentView(R.layout.main); 显然,这是为activity设置一个我们定义好的main.xml布局,我们跟踪一下源码 尝试追踪一下源码,发现mWindow是Window类型的,但是它是一个抽象类,setContentView也是抽象方法,所以我们要找到Window类的实现类才行。 创建DecorView 接着上面提到的installDecor()方法,我们看看它的源码, PhoneWindow#installDecor: private void installDecor() { 以及windowManager对象,而WindowManager是抽象类,它的实现类是WindowManagerImpl,所以后面调用的是WindowManagerImpl#addView方法,我们看看源码

    47620

    Activity加载view6.0源码分析---setContentView

    对于activity的布局的加载大致分为两部分,一部分是加载view,另一部分是将view绑定到应用窗口Window。 其中这两个步 骤中将view绑定到window是在启动activity时完成的操作,是将mDecor绑定到window。然后再往mDecor中添加各种view。 layoutResID) { getWindow().setContentView(layoutResID); initWindowDecorActionBar(); } 源码中对该方法的解释是 ,从一个layout文件中取出view设置成activity的content,该资源文件会被填充,并遍历文件中的所有 view添加到activity。 you should instantiate when needing a * Window. */ public abstract class Window { 源码中对于Window类的说明是

    39780

    Android源码解读-View绘制流程之setContentView

    1.直接看下setContentVIew源码 activity.java public void setContentView(@LayoutRes int layoutResID) { getWindow ().setContentView(layoutResID);// initWindowDecorActionBar(); } 1.在activity.java源码中我们可以看到 mWindow = new PhoneWindow(this, window, activityConfigCallback);所以我们直接看PhoneWindow源码中的setContentView。 private void addInArray(View child, int index) { View[] children = mChildren; final int count public void addView(@NonNull View view, @NonNull ViewGroup.LayoutParams params) { applyDefaultToken

    27441

    Django源码学习-7-View 视图函数

    Django网络应用开发的5项基础核心技术包括模型(Model)的设计,URL 的设计与配置,View(视图)的编写,Template(模板)的设计和Form(表单)的使用。 在Django中view层起到的作用是相当于controller的角色,在view中实施的 动作,一般是取得请求参数,再从model中得到数据,再通过数据创建模板,返回相应 响应对象。 Django中将视图定义为一种函数,称其为视图函数(view function)。

    22620

    扫码关注腾讯云开发者

    领取腾讯云代金券