Android必备知识点之View体系及自定义View

复习思路:反问学习法
what?
与用户交互,将内容展示给用户,通过一个个view实现的,Android所有控件的基类,我们平常所用的TextView和ImageView都是继承自View的。

why?
面试主要围绕这四个模块回答:
1.View的滑动
2.View 的事件分发
3. View 的工作流程
4. 自定义View

where?
这里可以对应why的四个模块举例说明即可

一.基础概念回顾

1.1 View与ViewGroup的关系

ViewGroup 可以理解为 View 的组合,它可以包含很多 View 以及ViewGroup,而它包含的 ViewGroup又可以包含View和ViewGroup,依此类推,形成一个View树

1.2 坐标系

1.2.1 View自身的坐标

通过如下方法可以获得View到其父控件(ViewGroup)的距离。

• getTop():获取View自身顶边到其父布局顶边的距离。

• getLeft():获取View自身左边到其父布局左边的距离。

• getRight():获取View自身右边到其父布局左边的距离。

• getBottom():获取View自身底边到其父布局顶边的距离。

1.2.2 MotionEvent获取焦点坐标的各种方法。

• getX():获取点击事件距离控件左边的距离,即视图坐标。

• getY():获取点击事件距离控件顶边的距离,即视图坐标。

• getRawX():获取点击事件距离整个屏幕左边的距离,即绝对坐标。

• getRawY():获取点击事件距离整个屏幕顶边的距离,即绝对坐标。

二.View的滑动

当点击事件传到View时,系统记下触摸点的坐标,手指移动时系统记下移动后触摸的坐标并算出偏移量,并通过偏移量来修改View的坐标。

2.1 滑动方法

实现View滑动有很多种 方法,主要用到6种滑动方法,分别是layout()、offsetLeftAndRight()与 offsetTopAndBottom()、LayoutParams、动画、scollTo 与 scollBy,以及Scroller。

2.1.1 layout

View进行绘制的时候会调用onLayout()方法来设置显示的位置,因此我们同样也可以通过修改View 的left、top、right、bottom这4种属性来控制View的坐标。

2.1.2 LayoutParams

LayoutParams主要保存了一个View的布局参数,因此我们可以通过LayoutParams来改变View的布局参 数从而达到改变View位置的效果。

2.1.3 scrollTo与scollBy

scrollTo(x,y)表示移动到一个具体的坐标点,而scrollBy(dx,dy)则表示移动的增量为dx、dy。

1.MeasureSpec

在测量过程中,系统会将View的LayoutParams根据父容器所施加的规则转换成对应的MeasureSpec,然后再根据这个measureSpec来测量出View的宽高

32位int值,高2位为SpecMode,低30位为SpecSize

SpecMode有三种类型:

①UNSPECIFIED:父容器不对View有任何限制

②EXACTLY:View指定精确大小

③AT_MOST:父容器指定大小,View不能超过

如果从代码上来看view.measure(int widthMeasureSpec, int heightMeasureSpec) 的两个MeasureSpec是父类传递过来的,但并不是完全是父View的要求,而是父View的MeasureSpec和子View自己的LayoutParams共同决定的,而子View的LayoutParams其实就是我们在xml写的时候设置的layout_width和layout_height 转化而来的。父View的measure的过程会先测量子View,等子View测量结果出来后,再来测量自己

###2.View的工作流程

主要指measure(测量)、layout(布局)、draw(绘制)三个过去,measure确定View的测量宽高,layout确定View的最终宽高和四个顶点的位置,draw将View绘制到屏幕上

measure()是一个final方法,子类不能重写,所以在View中调用View的onMeasure方法,其他类似,这里不展开复习了。。。

这篇博文写的很不错,这里就不多去赘述了:https://www.jianshu.com/p/5a71014e7b1b

全部评论

相关推荐

面试官全程关摄像头1.自我介绍一下2.React和Vue哪个更熟悉一点3.你在之前那段实习经历中有没有什么技术性的突破(我只是实习了44天工作28天,我把我能说的都说了)4.你封装的哪个表单组件支不支持动态传值5.自己在实习阶段Vue3项目封装过hook吗6.hook有什么作用7.Vue2和Vue3的响应式区别(我说一个是proxy是拦截所有的底层操作,Object.defineProperty本身就是一个底层操作,有些东西拦截不了,比如数组的一些操作还有等等,面试官就说实在要拦截能不能拦截????我心想肯定不行呀,他的底层机制就不允许吧)8.pinia和vuex的区别(这个回答不出来是我太久没用了)9.pinia和zustand的区别,怎么选(直接给我干懵了)(我说react能用pinia吗  他说要用的话也可以)10.渲染一万条数据,怎么解决页面卡顿问题(我说分页、监听滚轮动态加载,纯数据展示好像还可以用canvas画)(估计是没说虚拟表单,感觉不满意)11.type和interface的区别12.ts的泛型有哪些作用(我就说了一个结构相同但是类型不同的时候可以用,比如请求响应的接口,每次的data不同,这里能用一个泛型,他问我还有什么)13.你项目用的是React,如果让你再写一遍你会选择什么14.pnpm、npm、yarn的区别15.dependencies和devdependencies的区别总而言之太久没面试了,上一段实习的面试js问了很多。结果这次js一点没问,网络方面也没考,表现得很一般,但是知道自己的问题了  好好准备,等待明天的影石360和周四的腾讯了  加油!!!
解zj:大三的第一段面试居然是这样的结局
查看15道真题和解析
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务