最近,在LVGL项目中需要实现一个文字旋转的功能。在这个时代,有什么需求直接丢给AI,让AI先给一个demo。我也不例外,看看AI给的demo。
lv_obj_set_style_clip(lv_scr_act(), false, 0);
/* 1. 先创建一个测试用的大Label,确保视觉明显 */
lv_obj_t *title_rotate_obj = lv_label_create(lv_scr_act());
lv_label_set_text(title_rotate_obj, "R");
lv_obj_set_style_text_font(title_rotate_obj, &lv_font_montserrat_48, 0); // 用大字体
lv_obj_center(title_rotate_obj); // 先放屏幕中间,方便观察
/* 2. 【关键】必须设置旋转中心到对象正中心(50% x 50%) */
lv_obj_set_style_transform_pivot_x(title_rotate_obj, lv_pct(50), 0);
lv_obj_set_style_transform_pivot_y(title_rotate_obj, lv_pct(50), 0);
/* 3. 你的旋转逻辑(修正了0度的单位注释,0度写0没问题) */
if(user_set_image.rotation_status == 0)
{
lv_obj_set_style_transform_angle(title_rotate_obj, 0, 0); // 0.1度单位,0=0°
}
else if(user_set_image.rotation_status == 90)
{
lv_obj_set_style_transform_angle(title_rotate_obj, 900, 0); // 900=90°
}
else if(user_set_image.rotation_status == 180)
{
lv_obj_set_style_transform_angle(title_rotate_obj, 1800, 0); // 1800=180°
}
else if(user_set_image.rotation_status == 270)
{
lv_obj_set_style_transform_angle(title_rotate_obj, 2700, 0); // 2700=270°
}
}
直接就是报错,原因是因为我的版本和他想的不兼容。 好吧,再换一个AI。使用D老师。 D老师开始也是猛猛忽悠我,给的代码全是报错。甚至给出了一个正方形旋转90度,让我判断他是不是旋转成功了,旋转成功了告诉他。拜托,大哥,我怎么可能看得出来正方形旋转呢?
void test_rotate_basic(void)
{
lv_obj_t * obj = lv_obj_create(lv_scr_act()); // 创建一个基础对象
lv_obj_set_size(obj, 100, 100);
lv_obj_set_style_bg_color(obj, lv_color_hex(0x00FF00), 0);
lv_obj_set_style_bg_opa(obj, LV_OPA_COVER, 0);
lv_obj_add_flag(obj, LV_OBJ_FLAG_SNAPPABLE);
lv_obj_set_style_transform_angle(obj, 900, LV_PART_MAIN); // 90°
lv_obj_center(obj);
}
不过D老师的推理能力确实很不错,当知道我使用lv_obj_set_style_transform_angle函数不生效之后,他采用截图+图片旋转的方式来达到文字旋转的效果。 具体的内容如下
#include "lvgl.h"
void create_rotated_label(void)
{
// 1. 创建一个临时的 Label 作为截图源
lv_obj_t * label = lv_label_create(lv_scr_act());
lv_label_set_text(label, "WWWWWWWWWWWWWWWWWW");
lv_obj_set_style_text_align(label, LV_TEXT_ALIGN_CENTER, 0);
// 关键修复1: 设置更大的尺寸,确保文字不会被裁剪
lv_obj_set_size(label, 220, 50);
// 关键修复2: 强制LVGL立即计算并更新布局,这是lv_snapshot_take能正常工作的前提
lv_obj_update_layout(label);
// 关键修复3: 添加短暂延时,确保布局更新已应用
lv_timer_handler();
lv_tick_inc(5);
// 2. 对 Label 截图
// 关键修复4: 必须使用 lv_snapshot_take 支持的 LV_IMG_CF_TRUE_COLOR_ALPHA 格式
lv_img_dsc_t * snapshot = lv_snapshot_take(label, LV_IMG_CF_TRUE_COLOR_ALPHA);
// 关键修复5: 检查截图是否成功,这是最直接的诊断方法
if(snapshot == NULL) {
// 如果在这里暂停,说明lv_snapshot_take失败了。
// 需要在 lv_conf.h 中确认 #define LV_USE_SNAPSHOT 1
LV_LOG_ERROR("Snapshot failed! Enable LV_USE_SNAPSHOT in lv_conf.h?");
while(1); // 调试时在此处设置断点
}
// 删除原 Label,释放资源
lv_obj_del(label);
// 3. 创建图片对象并设置截图
lv_obj_t * img = lv_img_create(lv_scr_act());
lv_img_set_src(img, snapshot);
// 4. 设置旋转角度 (900 = 90度)
lv_img_set_angle(img, 900);
// 关键修复6: 显式设置图片对象的尺寸,确保它有足够的空间来旋转
lv_obj_set_size(img, lv_obj_get_width(label), lv_obj_get_height(label));
// 5. 居中显示
lv_obj_center(img);
// 关键修复7: 强烈建议将截图内存的释放与图片对象的生命周期绑定
// 你可以在适当的时候(如切换屏幕时)调用 lv_snapshot_free(snapshot)
}
其实原理很简单:设置不了文字的旋转,那么我就先把文字设置为图片再进行旋转,间接达到文字旋转的效果