这是我参与「第四届青训营 」笔记创作活动的的第4天
一、前言
今天学习到的是Android的UI编程渲染交互部分,其中交互部分我加入自己的一个项目为例,加深对本节课知识点的掌握。
今日份的边学边练中,交互这里我以自己之前做的2048项目为例: 在这个2048游戏APP中,当玩家点击最下方文字5次的时候,会跳转到一个菜单界面:如图所示
核心代码与注释在文章中会有说明;
二、本节课知识点大纲:
1. Android UI渲染
2. Android UI交互
三、Android UI渲染:
布局渲染
UI渲染流程
渲染流程
四、Android UI交互
常用交互事件监听器
触摸事件
当用户触摸屏幕时,系统将建立一系列的MotionEvent对象,MotionEvent包含关于发生触摸的位置和时间等细节信息,MotionEvent对象被传递到相应的捕获函数中,例如onTouchEvent()。
交互这里我以自己项目为例: 在这个2048游戏APP中,当玩家点击最下方文字5次的时候,会跳转到一个菜单界面:如图所示
对于这一功能的实现是加入了一个onClick监听,其效果原理类似Android手机中,点击5次(且间隔小于2500ms)进入Android版本界面一样,通过加入一个监听,当检测该文字被点击5次时触发跳转;
代码如下:(其中bt.eggs是做了一个button组件,Eggs.class是彩蛋界面)
public class MainActivity extends Activity implements View.OnClickListener{
long[] counts= new long[9]; //彩蛋按钮触发条件,使用数组记录点击次数
private static MainActivity mainActivity = null;
public MainActivity(){
mainActivity = this;
}
public static MainActivity getMainActivity() {
return mainActivity;
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
bteggs = findViewById(R.id.bt_eggs);
bteggs.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
System.arraycopy(counts, 1, counts, 0, counts.length - 1);//源数组 源数组要复制的起始位置 目的数组 目的数组放置的起始位置 复制的长度
counts[counts.length - 1] = SystemClock.uptimeMillis();
if (counts[0] > SystemClock.uptimeMillis() - 2500) {
Intent intent = new Intent(MainActivity.this,Eggs.class);
startActivity(intent);
}
}
});
}
五、课外补充:
渲染与 CPU 和 GPU 的关系
由于 CPU 和 GPU 的设计不同,CPU 更擅长复杂逻辑控制,而 GPU 得益于大量 ALU 和并行结构设计,更擅长数学运算。在 Android 中,页面由各种基础元素(DisplayList)构成,渲染时需要进行大量浮点运算,这些工作更适合交给 GPU 来做。Android 为了提高视图渲染的性能,在 Android 3.0 中引入了硬件加速。这样,Android 就有两种绘制模型:基于软件的绘制模型、硬件加速绘制模型。
在 Android 系统中,CPU 与 GPU 的分工不同,CPU 主要负责包括 Measure,Layout,Record,Execute 的计算操作,GPU 主要负责 Rasterization(栅格化)操作。栅格化是指将向量图形格式表示的图像转换成位图(像素)以用于显示设备输出的过程,简单来说就是将我们要显示的视图,转换成用像素来表示的格式。栅格化是一个非常耗时的工作。
CPU 对 GPU 渲染对比
CPU 产生的问题:不必要的布局和失效
在 CPU 方面,最常见的性能问题是不必要的布局和失效,这些内容必须在视图层次结构中进行测量、清除并重新创建。引发这种问题通常有两个原因:一是重建显示列表的次数太多,二是花费太多时间作废视图层次并进行不必要的重绘,这两个原因在更新显示列表或者其他缓存 GPU 资源时导致 CPU 工作过度。
GPU 产生的问题:过度绘制(overdraw)
在 GPU 方面,最常见的问题是我们所说的过度绘制(overdraw),通常是在像素着色过程中,通过其他工具进行后期着色时浪费了 GPU 处理时间。下面我们对 GPU 和 CPU 产生的两大问题进行优化。
六、引用参考:
- 课外补充引用:Android 渲染机制——原理篇(显示原理全过程解析)
- 文章学习来源: 【Android 客户端专场 学习资料一】第四届字节跳动青训营(第三节:常规 & 高级 UI 编程)
感谢以上作者的文章,今天的学习收获满满!!Thanks and HappyCoding!