这是我参与[第四届青训营]笔记创作的第 27 天
UI:User Interface
UI界面由多个不同功能的UI组件构成
Android SDK提供了大量的UI组件
常规UI组件大多由Android Framework中的android widge这个package提供\
一.UI组件
常规UI组件的使用
gravity:子元素在该容器内的对齐方式
layout_gravity:组件相对于父容器对齐方式
二.布局
线性布局(LinearLayout)
android:orientation布局内组件的排列方向
android:layout_weight:布局内组件的大小权重
android:divider:布局内组件间分割线
android:showDividers:布局内组件间分割线位置
android:dividerPadding:布局内分割线padding
以水平、垂直方向排列,所有子视图在单个方向(垂直、水平)保持对齐,适用于线性排列场景
相对布局(RelativeLayout)
android:layout_centerInParent组件位于父容器中央位置
android:layout_centerHorizontal组件位于父容器水平中央位置
android:layout_centerVertical组件位于父容器垂直中央位置
android:layout_alignParentTop组件位于父容器顶部对齐
android:layout_alignParentLeft组件位于父容器左部对齐
android:layout_alignParentRight组件位于父容器右部对齐
android:layout_alignParentBottom组件位于父容器低部对齐
android:layout_above组件位于某组件上部
android:layout_below组件位于某组件下部
android:layout_toLeftOf组件位于某组件左部
android:layout_toRightOf组件位于某组件右部
android:layout_aglinTop组件与某组件顶部对齐
android:layout_aglinLeft组件与某组件左部对齐
android:layout_aglinRight组件与某组件右部对 齐
android:layout_aglinBottom组件与某组件低部对齐\
通过相对父容器、兄弟组件位置排列组件,可以消除嵌套试图组并使布局层次结构保持扁平化,从而提高性能,一个RelativeLayout可以替换多个LinearLayout组,适用于复杂场景
层级布局(FrameLayout)
android:foreground 设置前景图像
android:foregroundGravity 设置前景图像Gravity
前景图像:永远处于FrameLayout最上层,不会被覆盖的图片 以层级叠加的方式排列组件,适用于层级排列场景
(ConstraintLayout)
layout_constraintLeft_toLeftOf组件左部与某组件左部对齐
layout_constraintLeft_toRightOf 组件左部与某组件右部对齐
layout_constraintRight_toLeftOf组件右部与某组件左部对齐
layout_constraintRight_toRightOf组件右部与某组件右部对齐
layout_constraintTop_toTopOf组件顶部与某组件顶部对齐
layout_constraintTop_toBottomOf组件顶部与某组件低部对齐
layout_constraintBottom_toTopOf组件低部与某组件顶部对齐
layout_constraintBottom_toBottomOf组件低部与某组件低部对齐
layout_constraintBaseline_toBaselineOf组件基线与某组件基线对齐
layout_constraintStart_toEndOf组件首部与某组件尾部对齐
layout_constraintEnd_toEndOf组件尾部与某组件尾部对齐
layout_constraintEnd_toStartOf组件尾部与某组件首部对齐
app:
通过约束组件位置排列组件,扩展布局方式,所有的试图均根据同级试图与父布局之间的关系进行布局,可使用扁平视图层次结构(无嵌套视图组)创建复杂的大型布局,为获得更好的性能和工具支持,推进使用ConstraintLayout,适用于复杂场景
三.渲染
布局加载(setContentView):创建了DecorView,最终由LayoutInflater来加载XML文件
布局解析(LayoutInflater):LayoutInflater解析了XML文件,并根据XML文件生成View实例,并将View实例添加到了ViewGroup中
布局解析(createView):根据XML中View类名来找相应View,并将XML中的描述属性解析为AttributeSet,并作为第二个参数传给了View构造器
页面绘制起点:onCreate():setContentView()创建了DecorView,并将layout中的view添加到DecorView中
onResume():ActivityThread.handleResumeActivity()
1,WindowManagerImpl.addView
2,创建ViewRootImpl,(继承了VIEW但没有添加到布局里,只是借阅VIEW能力进行绘制)
3,ViewRootImpl.setView
4,ViewRootImpl.requestLayout(),触发页面绘制
Vsync信号(时钟同步信号)
四.交互
findViewById:
常用事件监听器
onClick():点击事件
onLongChange():长按事件
所有的交互事件都来自对屏幕触摸信号的处理,view.OnClickListener()等常用点击事件对交互事件的二次分装
当用户触摸屏幕时,系统将建立一系列的MotionEvent对象,MotionEvent包含关于发生触摸的位置和时间等细节信息,MotionEvent对象被传递到相应的捕获函数中,例如:onTouchEvent().
触摸事件的分发
boolean onInterceptTouchEvent(MotionEvent ev):事件拦截
boolean dispatchTouchEvent(MotionEvent ev):事件分发
boolean onTouchEvent(MotionEvent ev):事件响应
五.动画
帧动画(View动画)
作用于视图动画(view)如imageView,textView,不作用于View的属性,宽度,高度。类比GIF,按指定顺序和间隔播放一组图片,优点:使用简单方便,缺点:功能单一,容易OOM。用于连续性动画。
补间动画(View动画)
在帧动画的基础上可以对图片进行操作,旋转,缩小。作用于视图动画(view)如imageView,textView,不作用于View的属性,宽度,高度。原理:通过确定开始视图样式和结束视图样式,中间样式由系统样式根据差值器确定来形成完整动画。动画类型:透明度动画(0-1),旋转动画,缩放动画,平移动画,(可以叠加)。优点:使用简单方便,缺点:只能控制试图效果,无法控制属性。用于:转场动画,视图基础动画
差值器
Interpolator:接口,设置属性值过渡到结束值的变化规律
属性动画
作用对象:任意JAVA对象,不再局限于视图控件(View)原理:在指定时间间隔里,通过不断对值的改变和不断将值赋给对象的属性,从而实现该对象在该属性上的动画效果。特点:不限于View对象,动画效果丰富。应用场景:与属性相关,复杂的动画。
六.自定义UI
自定义View(创建View--处理View布局--处理绘制--处理用户交互--处理动画)