这是我参与「第四届青训营 」笔记创作活动的第4天
该笔记主要是对青训营第三课知识点的简单总结和自己的小思考。
UI组件
UI:User Interface
安卓——图形用户界面
UI界面由多个不同功能的UI组件构成
Android SDK提供了大量的UI组件
UI组件:输入框组件、按钮组件、文本组件、播放器组件、图片组件、列表组件、复选框组件、单选按钮等
常规UI组件大多有对应的Java类,且由Android Framework中的android.widget这个package提供
常规view具有通用的属性和方法也有自己特定的属性和方法
常规UI组件的使用
可以设置ID、文本和背景(及字号和颜色)、原点(左上角)、与其他组件、父容器的间距、对齐方式等
高级UI组件
滑动组件、列表组件、下拉刷新组件、分页组件、布局组件【包含对应的Java类】
常规UI组件大多是View,高级UI组件大多是ViewGroup、比常规UI组件有多的功能
ViewGroup中可以包含ViewGroup和View
布局
【针对不同的布局诉求,考虑每种布局方式的合理性及简便性】
LinearLayout
【线性排布,类似文本编排时的方式】
以水平/垂直方向排列组件
所有子视图在单个方向(水平或垂直)保持对齐
适用于线性排列场景
RelativeLayout
组件根据父容器或者兄弟组件进行定位
可以消除嵌套试图组并使布局层次结构保持扁平化,从而提高性能
一个RelativeLayout就可以替换多个嵌套的LinearLayout组
适用于复杂场景
FrameLayout
以层级叠加的方式排列组件
适用于层级排列场景
【层级从前往后看】
前景图像:永远处于FrameLayout最上层,不会被覆盖的图片
ConstraintLayout
通过约束组件位置排列组件
扩展布局方式
所有的视图均根据同级视图与父布局之间的关系进行布局
可使用扁平视图层次结构(无嵌套视图组)创建复杂的大型布局
为获得更好的性能和工具支持,推进使用它ConstraintLayout
适用于复杂场景
【组件某部与某组件某部对齐(某部:左部、右部、顶部、底部、基线、首部、尾部)】
渲染
布局页面是如何渲染出来的
1布局加载-setContentView
- 编写布局文件
- 注册Manifest
- 设置布局文件
2布局解析
XML里描述的View是怎么绘制到屏幕上的?
创建了DecorView,最终由LayoutInflater加载了XML文件
LayoutInflater解析了XML文件,并根据XML文件生成了View示例,并将View实例添加到了ViewGroup中
根据XML文件中View类名来找到相应View,并将XML中的描述属性解析为AttributeSet,并作为第二个参数传递给了View构造器
【Activity在onResume()之后才显示】
3UI渲染
交互
将触摸事件传递到某个具体View&处理的整个过程
解决的问题:触摸事件由哪个对象发出、经过哪些对象、最终到达那个对象
1获取View实例
findViewByld
迭代查找View
2添加相应监听器
常用交互事件监听器
onClick():用户轻触项目
onLongClick():用户轻触并按住项目(长按)
onFocusChange():焦点改变
onKey():按钮(硬件相关)
onTouch():触摸
所有的交互时间都来自于对屏幕触摸信号的处理,View.OnClickListener()等常用点击事件是对交互事件的二次封装
触摸事件——MotionEvent(ACTION_XXX)
当用户触摸屏幕时,系统将建立一系列的MotionEvent对象,MotionEvent包含关于发生触摸的位置和时间等细节信息,MotionEvent对象被传递到相应的捕获函数中,例如onTouchEvent()
捕获触摸事件
1Activity和View都是onTouchEvent(),用于处理触摸事件
2当用户触摸屏幕时,会回调触摸视图上的onTouchEvent()。对于最终被识别为手势的每个轻触事件序列,onTouchEvent()都会多次多次被处罚
触摸事件分发核心方法
boolean dispatchTouchEvent 事件分发
boolean onInterceptTouchEvent 事件拦截
boolean onTouchEvent 事件响应
事件处理流程
顺序 Activity->ViewGroup->View
【事件可能源码里会互斥不会被同时被响应(点击和长按)】
动画
帧动画
作用对象:视图控件(View)(不可作用与View的属性,如宽度、高度等)
原理:
将动画分解为每一帧的图片形式
按指定顺序和间隔播放一组图片
优点:使用简单、方便
缺点:功能单一、容易OOM(性能问题)
应用场景:连续性动画
【相当于GIF更加可控且方便调整】
补间动画
作用对象:视图控件(View)(不可作用与View的属性,如宽度、高度等)
原理:通过确定开始视图样式和结束视图样式,中间样式由系统根据插值器确定来形成完整动画
动画类型:透明度动画、旋转动画、缩放动画、平移动画、以上几种动画的组合(AnimationSet)
优点:简单、方便
缺点:只能控制视图效果、无法控制属性
应用场景:转场动画、视图基础动画
【插值器Interpolator:是一个接口,设置属性值从初始值过渡到结束值得变化规律】
属性动画
作用对象:任意Java对象
原理:在指定时间间隔内,通过不断对值得改变&不断将值赋给对象的属性,从而实现该对象在该属性上的动画效果
特点:作用对象进行了扩充、动画效果丰富
应用场景:与属性相关、复杂的动画
自定义UI
1涉及UI组件 2涉及布局 3设计渲染 4涉及交互 5涉及动画 6涉及自定义View
【不要改变构造器的参数顺序】
通过核心类Paint、Canvas中的核心方法即可绘制View
根据交互事件的操作逻辑去处理用户交互
接着1设置属性动画,同时添加监听器
2在动画监听器中,根据属性值更新UI状态值并出发UI绘制
总结