awtk/docs/lcd_rotation.md

71 lines
2.7 KiB
Markdown
Raw Normal View History

2021-07-12 08:56:30 +08:00
## LCD 旋转(横屏与竖屏)
2018-06-14 18:04:42 +08:00
2021-07-12 08:56:30 +08:00
有时开发板上接的 LCD 方向和我们需要的不同,比如 LCD 缺省是横屏显示的但我们需要竖屏的效果。如果无法通过修改硬件来实现旋转就只能用软件来实现了。AWKT 目前对双帧缓冲的情况有完善的支持,对基于寄存器的 LCD 需要在驱动中进行配置。
2018-06-14 18:04:42 +08:00
2020-04-25 16:52:17 +08:00
> 旋转最好由硬件或驱动来做,否则性能会有大弧度下降。本文档提供的方案,主要用于开发前期使用。
2018-06-14 18:04:42 +08:00
### 一、使用方法
2021-07-12 08:56:30 +08:00
1. 首先在初始化时,用 tk\_init 指定 LCD 的大小(这里 LCD 的大小是实际大小,不是旋转之后的大小)。
2018-06-14 18:04:42 +08:00
```
/**
* @method tk_init
2021-07-12 08:56:30 +08:00
* 初始化 TK。
2018-06-14 18:04:42 +08:00
* @global
* @scriptable no
2021-07-12 08:56:30 +08:00
* @param {wh_t} w LCD 宽度。
* @param {wh_t} h LCD 高度。
2018-06-14 18:04:42 +08:00
*
2021-07-12 08:56:30 +08:00
* @return {ret_t} 返回 RET_OK 表示成功,否则表示失败。
2018-06-14 18:04:42 +08:00
*/
ret_t tk_init(wh_t w, wh_t h);
```
2021-07-12 08:56:30 +08:00
2. 然后用 tk\_set\_lcd\_orientation 来设置 LCD 的旋转角度。
2018-06-14 18:04:42 +08:00
```
/**
* @method tk_set_lcd_orientation
2021-07-12 08:56:30 +08:00
* 设置屏幕的旋转方向 (XXX: 目前仅支持 0 度和 90 度)。
2018-06-14 18:04:42 +08:00
* @global
*
2021-07-12 08:56:30 +08:00
* @return {ret_t} 返回 RET_OK 表示成功,否则表示失败。
2018-06-14 18:04:42 +08:00
*/
ret_t tk_set_lcd_orientation(lcd_orientation_t orientation);
```
> 参考demos/demo_main.c
_____
2021-07-12 08:56:30 +08:00
AWTK 目前支持 3 种 LCD 实现方式,不同的实现方式对旋转的支持有所不同,下面我们一一介绍。
2018-06-14 18:04:42 +08:00
2021-07-12 08:56:30 +08:00
### 二、基于寄存器的 LCD(lcd\_reg)
2018-06-14 18:04:42 +08:00
2021-07-12 08:56:30 +08:00
基于寄存器的 LCD(lcd\_reg),调用 tk\_set\_lcd\_orientation 只是做了两件事:
2018-06-14 18:04:42 +08:00
2021-07-12 08:56:30 +08:00
* 1. 对触摸事件的坐标进行转换。
2018-06-14 18:04:42 +08:00
2021-07-12 08:56:30 +08:00
* 2. 设置窗口管理器的大小为旋转之后的大小。
2018-06-14 18:04:42 +08:00
2021-07-12 08:56:30 +08:00
一般的 LCD 器件可以在驱动中设置像素的扫描顺序,在初始化时设置一下即可(驱动我不太熟悉,没有测试过),所以 AWTK 并没有对像素进行相应旋转。
2018-06-14 18:04:42 +08:00
> 参考http://www.cnblogs.com/amanlikethis/p/3872515.html
2021-07-12 08:56:30 +08:00
### 二、基于 FrameBuffer 的 LCD(lcd\_mem)
2018-06-14 18:04:42 +08:00
2021-07-12 08:56:30 +08:00
基于 FrameBuffer 的 LCD(lcd\_mem)AWTK 对旋转 90/180/270 度做了支持。调用 tk\_set\_lcd\_orientation 后 AWTK 会做以下几件事:
2018-06-14 18:04:42 +08:00
2021-07-12 08:56:30 +08:00
* 1. 对触摸事件的坐标进行转换。
2018-06-14 18:04:42 +08:00
2021-07-12 08:56:30 +08:00
* 2. 设置窗口管理器的大小为旋转之后的大小。
2018-06-14 18:04:42 +08:00
2021-07-12 08:56:30 +08:00
* 3.offline fb 为旋转之后的大小online fb 为原始大小。在 lcd flush 时需要进行旋转(在没有硬件旋转减速的情况下,会增加一点性能开销)。
2018-06-14 18:04:42 +08:00
2021-07-12 08:56:30 +08:00
* 4. 在进行平移窗口动画时。AWTK 将图片直接贴到 online fb 上,处于性能的考虑,在截图时进行旋转,在贴图时直接拷贝。所以在 lcd\_mem\_draw\_image 和 lcd\_mem\_take\_snapshot 两个函数中做了处理。
2018-06-14 18:04:42 +08:00
2021-07-12 08:56:30 +08:00
### 三、基于 VGCanvas 的 LCD(lcd\_vgcanvas)
2018-06-14 18:04:42 +08:00
2020-09-30 09:33:36 +08:00
> 最新版本已经支持旋转。