有时开发板上接的 LCD 方向和我们需要的不同,比如 LCD 缺省是横屏显示的,但我们需要竖屏的效果。如果无法通过修改硬件来实现旋转,就只能用软件来实现了。AWKT 目前对双帧缓冲的情况有完善的支持,对基于寄存器的 LCD 需要在驱动中进行配置。
注:旋转最好由硬件或驱动来做,否则性能会有大幅度下降。本文档提供的方案,主要用于开发前期使用。
在 AWTK Designer 左下角点击"项目设置",在"LCD 旋转设置"一栏中选择旋转角度后点击"确认"即可。
在 src/main.c
文件中定义一个宏,示例与宏的取值如下:
宏 | 作用 |
---|---|
LCD_ORIENTATION_90 | 逆时针旋转90° |
LCD_ORIENTATION_180 | 逆时针旋转180° |
LCD_ORIENTATION_270 | 逆时针旋转270° |
/* 逆时针旋转90° */
#define APP_LCD_ORIENTATION LCD_ORIENTATION_90
该宏需要在"#include "awtk_main.inc""前进行定义。
AWTK 内部还提供了快速旋转模式,该机制能在旋转时保持较高的效率(和没有旋转时的运行效率几乎一样),但是兼容性比较差,具体如何使用请参考 如何使用高效的屏幕旋转
AWTK 目前支持 3 种 LCD 实现方式,不同的实现方式对旋转的支持有所不同,下面我们一一介绍。
- 对触摸事件的坐标进行转换。
- 设置窗口管理器的大小为旋转之后的大小。
一般的 LCD 器件可以在驱动中设置像素的扫描顺序,在初始化时设置一下即可(未测试过),所以 AWTK 并没有对像素进行相应旋转。
- 对触摸事件的坐标进行转换。
- 设置窗口管理器的大小为旋转之后的大小。
- offline fb 为旋转之后的大小,online fb 为原始大小。在 lcd flush 时需要进行旋转(在没有硬件旋转减速的情况下,会增加一点性能开销)。
- 在进行平移窗口动画时。AWTK 将图片直接贴到 online fb 上,处于性能的考虑,在截图时进行旋转,在贴图时直接拷贝。所以在 lcd_mem_draw_image 和 lcd_mem_take_snapshot 两个函数中做了处理。
- 对触摸事件的坐标进行转换。
- 矢量画布绘制时,旋转坐标。