字节跳动-Android自定义组件开发,带你领略什么叫细节爆炸!

前言

今天总结一下Android开发中的自定义控件的开发,Android中所有控件和布局的基类都是View,自定义控件也就是继承View或者View的派生类,然后再重写类中的内部方法。
通常来说自定义控件分为三种:
1.自定义View:继承View
2.基于现有组件:继承View的派生类
3.组合的方式:自定义控件中包含了其他的组件

1、概述

说来惭愧,已经有很长时间没有更新技术文章了,最近面试了一些同学,对于一些知识点,不少候选人同学其实掌握的不够扎实,而在对于一些知识点逐渐深入的过程中,发现我自己也有些遗忘了,所以想重新梳理一下,把过程记录下来,给大家一些参考,如果能有帮助,那最好不过了。

这一篇就先从 View 开始。

对于安卓开发来说,我想除了 Activity 以外,就是 View 接触的最多了。这篇文章就以面试官的角度来讲讲 View 的一些知识点,看看问题是如何一层层的深入下去的。

2、View 题目层次

  • 我们以最常见的两个面试题目(View 的绘制流程 和 View 的事件分发)开始,逐层深入去看一下。

  • 先上 View 的绘制流程。

  • View 的绘制流程是 measure -> layout -> draw,这个大家都熟悉。

  • 不过由此引申的知识点还是有不少的:

  • 首次 View 的绘制流程是在什么时候触发的?

  • ViewRootImpl 创建的时机?

  • ViewRootImpl 和 DecorView 的关系是什么?

  • DecorView 的布局是什么样的?

  • DecorView 的创建时机?

  • setContentView 的流程

  • LayoutInflate 的流程

  • Activity、PhoneWindow、DecorView、ViewRootImpl 的关系?

  • PhoneWindow 的创建时机?

  • 如何触发重新绘制?

  • requestLayout 和 invalidate 的流程

  • requestLayout 和 invalidate 的区别

上面这些就是我想到的由 View 绘制流程引申的一系列问题,其实如果细想,还会有很多,这里就作为个引子。下面看看问题的详解(以下代码分析基于 SDK 28)。

如果上面的问题读者朋友们都能回答上来,也就没有必要往下看了~

学习思维脑图

《Android自定义组件开发笔记》


第一章 View 的绘图流程

第一次接触图形界面(GUI)的开发,很难想象展现在眼前的各种五花八门的组件是开发人员和美工通力合作共同付出的结果。开发平台成套定义出各类组件供我们使用,风格、色调、观感等外观表现等需要高度和谐统一,又要从技术上为用户ᨀ供一致的操控体验,这是一件繁重的工作,马虎不得。特别是手机 App,离用户眼睛的距离更近,可能一个像素就会影响用户的使用感受,因此对界面ᨀ出了更高的要求,所以,自定义组件成了 Android 开发人员掌握的一门必备技能。


第二章 Graphics2D API

在 Android 中,2D 图形由 Android SDK ᨀ供,本章我们将向大家介绍 Graphics2D 涉及到的常用类,如基本的数据结构类、位图类、绘图类等,并介绍和使用常见的绘图方法。


第三章 使用 Graphics2D 实现动态效果

本章将向您讲述如何通过绘图实现动态效果。动态包括两个方面,一是让画面动起来, 如实现游戏中的爆炸动画,地球仪的自转和公转,小鸟翅膀的摆动,手表时针分针秒针的转运等等,这一类动画可以通过周期性重画实现,二是实现和用户的互动, 用户通过手指在手机屏幕上移动,在绘图区绘制曲线、矩形、圆、文字等图案,如绘图软件就是这种类型。


第四章 双缓存技术

为什么叫“双缓存”?说白了就是有两个绘图区,一个是 Bitmap 的 Canvas,另一个就是当前View 的 Canvas。先将图形绘制在 Bitmap 上,然后再将 Bitmap 绘制在 View 上,也就是说,我们 在 View 上看到的效果其实就是 Bitmap 上的内容。这样做有什么意义呢?

第五章 阴影、渐变和位图运算

本章将向您介绍阴影、渐变和位图运算等技术。阴影只是一个狭义的说法,实际上也包括发光等效果;Android 也ᨀ供了强大的渐变功能,渐变能为物体带来更真实的质感,比如可以用渐变绘制一颗五子棋或一根金属圆棒;位图运算就更有趣了,Android 为 Bitmap 的运算ᨀ供了多达16 种运算方法,获得的结果也不尽相同。不过,主要还是在于灵活应用

第六章 自定义组件

Android SDK 为我们ᨀ供了一套完整的组件库,数量多、功能强,涉及到方方面面,但是,我们依然看到软件市场上的每个 App 都有自己独特的东西,绝不是千遍一律的,而且也会和 IOS相互借鉴,这就需要我们对组件进行定制,实现自己独树一帜的用户体验和界面风格。


结尾

本篇是结合我之前面试别人的经验,以及跟一些在大厂待过的朋友,讨论总结出的一份很全面的大公司需要用到的一些高端Android技术。这里也专门整理了一个文档,重点和难点都有详细解析。

这些题目有点技术含量,需要好点时间去研究一下的;

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
封面 1 序 2 捐助说明 5 目 录 7 第一章 View的绘图流程 12 1.1、概述 12 1.2、Activity的组成结构 13 1.3、View树的绘图流程 15 1.3.1 测量组件大小 16 1.3.2 确定子组件的位置 17 1.3.3 绘制组件 18 1.4、说点别的 22 1.5 练习作业 22 第二章 Graphics2D API 23 2.1、概述 23 2.2、Point类和PointF类 23 2.3、Rect类和RectF类 25 2.4、Bitmap类和BitmapDrawable类 32 2.5、Canvas类与Paint类 34 2.5.1 绘图概述 34 2.5.2 Paint类 34 2.5.3 Canvas类 39 2.6 练习作业 63 第三章 使用Graphics2D实现动态效果 64 3.1 概述 64 3.2 invalidate()方法 65 3.3 坐标转换 69 3.4 剪切区(Clip) 73 3.5 案例:指针走动的手表 82 3.6 练习作业 88 第四章 双缓存技术 89 4.1 双缓存 89 4.2 在屏幕上绘制曲线 90 4.3 在屏幕上绘制矩形 99 4.4 案例:绘图App 104 4.4.1 绘图属性 106 4.4.2 软件参数 108 4.4.3 绘图缓冲区 109 4.4.4 撤消操作 111 4.4.5 图形绘制 113 4.4.6 绘图区 118 4.4.7 主界面 119 4.5 练习作业 122 第五章 阴影、渐变和位图运算 123 5.1 概述 123 5.2 阴影 123 5.3 渐变 125 5.3.1 线性渐变(LinearGradient) 126 5.3.2 径向渐变(RadialGradient) 130 5.3.3 扫描渐变(SweepGradient) 135 5.3.4 位图渐变(BitmapShader) 138 5.3.5 混合渐变(ComposeShader) 140 5.3.6 渐变与Matrix 142 5.4 位图运算 143 5.4.1 PorterDuffXfermode 143 5.4.2 图层(Layer) 146 5.4.3 位图运算技巧 148 5.5 案例1:圆形头像 152 5.6 案例2:刮刮乐 156 5.7 练习作业 161 第六章 自定义组件 163 6.1 概述 163 6.2 自定义组件的基本结构 164 6.3 重写onMeasure方法 166 6.4 组件属性 175 6.4.1 属性的基本定义 175 6.4.2 读取来自style和theme中的属性 181 6.5 案例1:圆形ImageView组件 186 6.6 案例2:验证码组件CodeView 190 6.7 练习作业 202 第七章 自定义容器 204 7.1 概述 204 7.2 ViewGroup类 205 7.2.1 ViewGroup常用方法 205 7.2.2 ViewGroup的工作原理 208 7.2.3 重写onLayout()方法 213 7.3 CornerLayout布局 217 7.3.1 基本实现 217 7.3.2 内边距padding 224 7.3.3 外边距margin 228 7.3.4 自定义LayoutParams 238 7.4 案例:流式布局(FlowLayout) 246 7.5 练习作业 256 第八章 Scroller与平滑滚动 257 8.1 概述 257 8.2 认识scrollTo()和scrollBy()方法 258 8.3 Scroller类 264 8.4 平滑滚动的工作原理 271 8.5 案例:触摸滑屏 272 8.5.1 触摸滑屏的技术分析 272 8.5.2 速度跟踪器VelocityTracker 273 8.5.3 触摸滑屏的分步实现 274 8.6 练习作业 285 第九章 侧边栏 287 9.1 概述 287 9.2 使用二进制保存标识数据 289 9.2.1 位运算符 289 9.2.2 位运算的常用功能 292 9.3 继承自ViewGroup的侧边栏 293 9.4 继承自HorizontalScrollView的侧边栏 304 9.5 练习作业 312 第十章 加强版ListView 313 10.1 概述 313 10.2 ListView的基本使用 314 10.3 ListItem随手指左右滑动 318 10.4 向右滑动删除ListItem 326 10.5 滑动ListItem出现删除按钮 336 10.5.1 列表项专用容器ExtendLayout 337 10.5.2 列表项能滑出删除按钮的ListView 342 10.5.3 定义布局文件 350 10.5.4 显示ListView 351 10.6练习作业 353 案例代码说明 354

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值