- 这是我参与「第四届青训营 」笔记创作活动的第二天。第一篇文章主要介绍了前两节课的内容,客户端是什么,想要做个好的客户端开发需要什么技能,然后简单介绍了安卓系统的组成及四大组件,本文接着写剩下的内容及第三次课程内容。
- 首先是第二次课的剩余部分,安卓通信组件。只使用四大组件并不能完成我们想实现的需求,不同组件需要配合,那么组件之间的配合就需要通信组件来实现通信。
-
- 通信组件主要分为两种,一种是handler,另一种是binder。handler负责处理组件之间通信的信息,使用时需要先创建对应消息的handleMessage类,然后在类中构造message,子线程调用handlemessage.sendmeassage发送消息,主线程中handlemessage类接收消息并更新UI,处理过程如下图所示:
binder主要实现数据的绑定,即在不同的组件中共享数据,通过管程实现,为什么不用共享内存呢?由于Linux的进程隔离机制,不同进程使用共享内存的数据并非同一个数据,而是复制后副本,及修改的并非同一个数据,各自修改后,再写回内存。这中间的过程会出现一定的问题,可能会造成信息泄露,因此binder使用管程来实现数据共享,在服务端定义一个AIDL文件,实现描述的接口,编写service,并提供可能需要的实体类(以jar包形式),客户端拿到这个AIDL文件,绑定服务,获得描述的对象,流程如下图:
总结如图:
接着就该第三次课的内容,UI,也叫用户接口,或者叫用户图形界面,简而言之,我们在使用客户端时看到的画面就是UI,有不同的UI功能组件组成,Android SDK提供了很多种UI组件。常见的UI组件有文本组件,输入框组件,按钮组件,复选框组件,单选框组件。图片组件等,通常用Android Framework中Android.widget包提供,这些组件有通用的属性也有自己所特有的属性,如下:
其中要注意的是,安卓UI布局的位置坐标与数学中的做标记并不一致,其原点在左上角,如图:
常见组件一般是View组件,一些高级的则为ViewGroup组件,在ViewGroup中可以嵌套使用View,也可以再嵌套一个viewGroup
下图是一个常规的线性布局的构造代码,可以看到,里面有width,height,orientation等属性
接着要谈的是布局,布局可以理解为内容的呈现形式,重要的影响因素就三个,大小,位置和层级。
以此为分类可以分为LinearLayout,ReleativeLayout,FrameLayout,constrainLayout等,这里主要介绍列举的四种。
LinearLayout即线性布局,可根据orientation设置线性的布局方向水平或垂直,其特殊属性如下:
样式示例如下:
releativeLayout即相对布局,即根据父容器或兄弟容器确定自己的位置,因此其特殊属性也有所不同,如下所示:
样式示例如下:
frameLayout则是层级布局使可以是不同的布局叠加,使其显示出想要的效果,其特殊属性有前景图像和前景权重等,样式示例如图所示:
constrainlayout是约束布局,即给每个组件的位置加约束,因此该布局多了很多位置约束相关的属性,如图:
示例如下所示:
还有种布局gridlayout,网格式布局,这里没有提,和linear layout十分相似,只是多了布局行和列的设置,常见实例如计算器等。
各种布局的特点及适用场景总结如下图:
谈完布局,接下来就到了渲染,手机将我们设计的界面展现出来的过程就叫做渲染,整个过程大致有三步,布局加载-布局解析-UI渲染。布局加载的过程很简单,首先我们要编写布局文件,并在Manifest.xml文件里注册相关的布局,做好相关设置后,通过setcontentview来加载相关布局,创建decorView,最终由layoutflater加载和解析布局文件,生成实例,将其添加到相应的viewgroup中,再根据相应的view类名找到相应view,将xml中的描述属性解析为attributeset,并作为参数传给view构造器,做成流程图如下所示:
view绘制的流程如下所示:
整个页面的绘制流程图如图:
然后硬件设备接收Vsync信号,开始进行UI渲染,最终经过渲染总结形成我们最终看到的界面。
上面讲了这么多,布局也罢,组件也罢都是静态的,那么我们再点击之后跳转到我们想要的界面又是怎么回事呢,这就是交互,简而言之就是对触碰事件的反馈。交互的代码实现流程大致就是:1,通过findviewByid方法获取view实例。2,给对应的事件(按钮,按压)添加监听器,在监听器里添加相应的事件处理逻辑,常见的事件监听器如下所示:
对于手机来说,所有的交互都来自于对屏幕触摸信号的处理,View.onclickListener是对交互时间的二次封装。常见的触摸事件如下所示:
用户触摸屏幕时,建议一系列的motionevent对象,该对象包含触摸位置,时间等细节信息,这些信息被传到相应的捕获参数中,事件处理流程如下
交互的总结如图:
讲完了渲染,就来到动画了,从我们触碰屏幕到事件被响应并不是一下子就完成的,这中间就需要用动画去填充,动画分为帧动画,补间动画和属性动画三种。其作用对象,原理,特点和应用场景如图所示:
帧动画示例:
补间动画:
示例:
这其中动画的速度可通过插值器设定,安卓系统提供了interpolator接口来设定属性值从初始值过度到结束值的变化规律,提供的接口如下所示:
对view动画的总结如图:
帧动画和补间动画由于作用对象的缺陷,不能完全满足需求,因此又产生了属性动画,属性动画的介绍如下:
代码示例:
效果示例:
上述内容的总结:
安卓系统已经为我们提供了丰富的UI组件,但这还不能满足我们的个性化需求,因此我们又引入了自定义UI,
自定义UI其实就是定制符合需求的View,主要操作还是一样的:创建view-处理view布局-绘制view-处理交互-处理动画,详细流程如图:
通过本节课的学习,我们已经可以做到一些肉眼可见的变化,可根据喜好,创建自己喜欢的view,处理一些小事件,虽然客户端开发工作过程中并不会让自己去设计UI,但掌握方法去留一些自己的印记还是没有问题的。期待下一次课的学习