热门标签 | HotTags
当前位置:  开发笔记 > 前端 > 正文

HenCoderUI部分2-1布局基础

HenCoder的第二季:自定义View第二部分——布局过程的自定义,从这期正式开始了。好像有点小激动。废话少说,直入正题。简介之前我说过,自定义View最关

HenCoder 的第二季:自定义 View 第二部分——布局过程的自定义,从这期正式开始了。好像有点小激动。

废话少说,直入正题。

简介

之前我说过,自定义 View 最关键的有三个点:绘制、布局和触摸反馈。上一季讲过的绘制,内容虽然多(好像讲了 8 期?),但难度上其实是最简单的。而布局就和它相反,布局过程的技术知识,内容比较少(应该 3 期就能讲完),但你先要理解它的内部工作原理才能正确理解它的使用,而它的工作原理却是有点绕的。所以如果你跟着 HenCoder 学习布局过程的自定义,大致会是这样一种体验:看完视频或者读完文章,感觉吸收了一大波知识,信息量好大难以吞咽的样子,但当你真的把它们吞咽下去,然后下载了我的练习项目去做练习的时候,却又发现:卧槽,就这么点东西?布局过程的自定义竟然这么简单?

会者不难这个词在很多地方都讲得通,但在布局过程的自定义上,尤为适用。

具体的概念、原理和技术细节,来看视频吧:



总结

有人说:什么?简介完了就是总结了?

嚯嚯,对的。所有的内容都在视频里讲完了,所以在这里就把视频里讲到的关键点总结一下:

布局过程的含义

布局过程,就是程序在运行时利用布局文件的代码来计算出实际尺寸的过程。

布局过程的工作内容

两个阶段:测量阶段和布局阶段。

测量阶段:从上到下递归地调用每个 View 或者 ViewGroup 的 measure() 方法,测量他们的尺寸并计算它们的位置;
布局阶段:从上到下递归地调用每个 View 或者 ViewGroup 的 layout() 方法,把测得的它们的尺寸和位置赋值给它们。

View 或 ViewGroup 的布局过程

  1. 测量阶段,measure() 方法被父 View 调用,在 measure() 中做一些准备和优化工作后,调用 onMeasure() 来进行实际的自我测量。 onMeasure() 做的事,View  ViewGroup 不一样:

    1. ViewView  onMeasure() 中会计算出自己的尺寸然后保存;

    2. ViewGroupViewGroup  onMeasure() 中会调用所有子 View 的 measure() 让它们进行自我测量,并根据子 View 计算出的期望尺寸来计算出它们的实际尺寸和位置(实际上 99.99% 的父 View 都会使用子 View 给出的期望尺寸来作为实际尺寸,原因在下期或下下期会讲到)然后保存。同时,它也会根据子 View 的尺寸和位置来计算出自己的尺寸然后保存;

  2. 布局阶段,layout() 方法被父 View 调用,在 layout() 中它会保存父 View 传进来的自己的位置和尺寸,并且调用 onLayout() 来进行实际的内部布局。onLayout() 做的事, View  ViewGroup也不一样:

    1. View:由于没有子 View,所以 View  onLayout() 什么也不做。

    2. ViewGroupViewGroup  onLayout() 中会调用自己的所有子 View 的 layout() 方法,把它们的尺寸和位置传给它们,让它们完成自我的内部布局。

布局过程自定义的方式

三类:

  1. 重写 onMeasure() 来修改已有的 View 的尺寸;

  2. 重写 onMeasure() 来全新定制自定义 View 的尺寸;

  3. 重写 onMeasure()  onLayout() 来全新定制自定义 ViewGroup 的内部布局。

第一类自定义的具体做法

也就是重写 onMeasure() 来修改已有的 View 的尺寸的具体做法:

  1. 重写 onMeasure() 方法,并在里面调用 super.onMeasure(),触发原有的自我测量;

  2.  super.onMeasure() 的下面用 getMeasuredWidth()  getMeasuredHeight() 来获取到之前的测量结果,并使用自己的算法,根据测量结果计算出新的结果;

  3. 调用 setMeasuredDimension() 来保存新的结果。

练习项目

为了避免转头就忘,强烈建议你趁热打铁,做一下这个练习项目:HenCoderPracticeLayout1(微信用户可以点底部的「阅读原文」)

0?wx_fmt=gif

下期预告

下期是布局部分的最后一期:全新自定义 View 的尺寸。

觉得赞?

那就关注一下?↓↓↓

0?wx_fmt=jpeg






推荐阅读
  • JSOI2010 蔬菜庆典:树结构中的无限大权值问题
    本文探讨了 JSOI2010 的蔬菜庆典问题,主要关注如何处理非根非叶子节点的无限大权值情况。通过分析根节点及其子树的特性,提出了有效的解决方案,并详细解释了算法的实现过程。 ... [详细]
  • 本文在前文探讨的GLSL矩阵变换(包括旋转变换和平移变换)基础上,进一步介绍摄像机位置和姿态设置,以及成像区域定义的方法。我们将详细讲解如何使用QMatrix4x4类来创建view matrix和projection matrix,并通过具体实例展示其应用。 ... [详细]
  • Redux入门指南
    本文介绍Redux的基本概念和工作原理,帮助初学者理解如何使用Redux管理应用程序的状态。Redux是一个用于JavaScript应用的状态管理库,特别适用于React项目。 ... [详细]
  • 在 Android 开发中,通过 Intent 启动 Activity 或 Service 时,可以使用 putExtra 方法传递数据。接收方可以通过 getIntent().getExtras() 获取这些数据。本文将介绍如何使用 RoboGuice 框架简化这一过程,特别是 @InjectExtra 注解的使用。 ... [详细]
  • 使用Powershell Studio快速构建GUI应用程序
    本文介绍了如何利用Powershell Studio创建功能强大的可视化界面。相较于传统的开发工具,Powershell Studio提供了更为简便和高效的开发体验,尤其适合需要快速构建图形用户界面(GUI)的场景。 ... [详细]
  • 黑马头条项目:Vue 文章详情模块与交互功能实现
    本文详细介绍了如何在黑马头条项目中配置文章详情模块的路由、获取和展示文章详情数据,以及实现关注、点赞、不喜欢和评论功能。通过这些步骤,您可以全面了解如何开发一个完整的前端文章详情页面。 ... [详细]
  • 深入解析SpringMVC核心组件:DispatcherServlet的工作原理
    本文详细探讨了SpringMVC的核心组件——DispatcherServlet的运作机制,旨在帮助有一定Java和Spring基础的开发人员理解HTTP请求是如何被映射到Controller并执行的。文章将解答以下问题:1. HTTP请求如何映射到Controller;2. Controller是如何被执行的。 ... [详细]
  • 在尝试使用C# Windows Forms客户端通过SignalR连接到ASP.NET服务器时,遇到了内部服务器错误(500)。本文将详细探讨问题的原因及解决方案。 ... [详细]
  • InmyapplicationIhaveQGraphicsScenewithpixmapaddedandallisviewedinQGraphicsViewwithsc ... [详细]
  • 本文回顾了2017年的转型和2018年的收获,分享了几家知名互联网公司提供的工作机会及面试体验。 ... [详细]
  • 深入理解TCP/IP协议中的MTU与MSS及以太网数据帧
    本文详细探讨了TCP/IP协议中MTU(最大传输单元)和MSS(最大分段大小)的概念及其在以太网数据帧中的应用。通过分析这些关键参数的工作机制,帮助读者更好地理解网络通信中的数据包处理过程。 ... [详细]
  • 本文探讨了在Django项目中,如何在对象详情页面添加前后导航链接,以提升用户体验。文章详细描述了遇到的问题及解决方案。 ... [详细]
  • 深入解析 Android IPC 中的 Messenger 机制
    本文详细介绍了 Android 中基于消息传递的进程间通信(IPC)机制——Messenger。通过实例和源码分析,帮助开发者更好地理解和使用这一高效的通信工具。 ... [详细]
  • 探讨ChatGPT在法律和版权方面的潜在风险及影响,分析其作为内容创造工具的合法性和合规性。 ... [详细]
  • 本文详细介绍了如何在Android 4.4及以上版本中配置WebView以实现内容的自动高度调整和屏幕适配,确保中文显示正常,并提供代码示例。 ... [详细]
author-avatar
多米音乐_34138178
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有