Android培训班(22)
在初始化过程里,会显示一个LOGO图片,那么它是怎么实现显示这个图片的呢?它的代码如下:
#001 /* 565RLE image format: [count(2 bytes), rle(2 bytes)] */
#002
#003 int load_565rle_image(char *fn)
#004 {
这段代码是加载565RLE格式的LOGO图片,函数的参数是图片路径。
#005 struct FB fb;
#006 struct stat s;
#007 unsigned short *data, *bits, *ptr;
#008 unsigned count, max;
#009 int fd;
#010
#011 if (vt_set_mode(1))
#012 return -1;
这段代码是设置显示输出为图片模式。
#013
#014 fd = open(fn, O_RDONLY);
#015 if (fd < 0) {
#016 ERROR("cannot open '%s'/n", fn);
#017 goto fail_restore_text;
#018 }
这段代码是打开要显示的图片。
#019
#020 if (fstat(fd, &s) < 0) {
#021 goto fail_close_file;
#022 }
这段代码是获取打开文件的信息,比如文件的大小。
#023
#024 data = mmap(0, s.st_size, PROT_READ, MAP_SHARED, fd, 0);
#025 if (data == MAP_FAILED)
#026 goto fail_close_file;
这段代码是映射图片文件到内存。
#027
#028 if (fb_open(&fb))
#029 goto fail_unmap_data;
这段代码是打开显示缓存内存,以便把图片数据放到显示缓存里。
#030
#031 max = fb_width(&fb) * fb_height(&fb);
#032 ptr = data;
#033 count = s.st_size;
#034 bits = fb.bits;
#035 while (count > 3) {
#036 unsigned n = ptr[0];
#037 if (n > max)
#038 break;
#039 android_memset16(bits, ptr[1], n << 1);
#040 bits += n;
#041 max -= n;
#042 ptr += 2;
#043 count -= 4;
#044 }
这段代码是把图片数据填入显示缓存。
#045
#046 munmap(data, s.st_size);
#047 fb_update(&fb);
这段代码是更新显示缓存,并把LOGO显示出来。
#048 fb_close(&fb);
#049 close(fd);
#050 unlink(fn);
这段代码关闭上面打开的资源,并删除LOGO图片文件,由于android把LOGO图片加载到内存里,并且LOGO显示完成后,再没有作用了,及时回收资源。如果想不删除这个图片,就需要把这行代码删除掉,或者每次显示前动态地拷贝到这里。
#051 return 0;
#052
#053 fail_unmap_data:
#054 munmap(data, s.st_size);
#055 fail_close_file:
#056 close(fd);
#057 fail_restore_text:
#058 vt_set_mode(0);
#059 return -1;
这段代码是处理失败情况。
#060 }
相关文章
- android studio不能输入中文_Android模拟器
- android scaleanimation动画,【Android动画九章】-RotateAnimation(旋转动画)和ScaleAnimation(尺寸动画)…[通俗易懂]
- android onresume方法,Android onActivityResult()和onResume()的执行顺序
- android deeplink流程,Android Deeplink探究[通俗易懂]
- android 安装p12证书,如何在Android中使用p12证书(客户端证书)
- android declare-styleable 和style,Android 关于declare-styleable属性的写法….
- android sdk安装过程,图文详解Android 3.0 SDK安装教程
- [译] 将通用 Android 音乐播放器转化为 instant 应用
- Android FFmpeg系列07--音画同步
- android activitymanager 系统api_Android view
- android线程间通信的几种方法_Android进程间和线程间通信方式
- android 横向滑动分类效果实现
- 【错误记录】Android Studio 的 Flutter 代码界面没有 Logcat 面板 ( 2021年08月28日最新解决方案 )
- 【错误记录】Android Studio 编译报错 ( Could not find com.android.tools.build:gradle:4.2.1. )
- 【Android 逆向】Android 中常用的 so 动态库 ( 拷贝 /system/lib/ 中的 Android 系统 so 动态库 )
- 【错误记录】编译 Android 版本的 ijkplayer 报错 ( ./init-android.sh: 第 37 行: cd: android/contrib/: 没有那个文件或目录 )
- 【ijkplayer】编译 Android 版本的 ijkplayer ③ ( 执行 compile-ffmpeg.sh clean 命令 | 下载并配置 android-ndk-r10e )
- 【错误记录】Android Studio 编译报错 ( Could not resolve com.android.tools.build:gradle:7.4.2. )
- Android Framework层看硬件加速详解手机开发
- android判断横竖屏详解编程语言
- 七个让你意想不到的Android系统应用领域
- Rowhammer:针对物理内存的攻击可以取得 Android 设备的 root 权限
- 安卓编年史(25):Android 4.4,奇巧——更完美,更少的内存占用(2)
- Android颜色编辑器的制作中遇到的问题分析
- Android中的android:layout_weight使用详解
- 解析Android横竖屏切换的问题
- android使用ExpandableListView控件实现小说目录效果的例子