DECLARE_HANDLER(setCircle) { lv_obj_t *image = get_lvgl_from_jsclass_obj(ctx, this_value, js_image_class_id); if (image) { OPLUS_WF_ERROR_LOG("Image address: %p\n", image); lv_coord_t w = lv_obj_get_width(image); lv_coord_t h = lv_obj_get_height(image); OPLUS_WF_ERROR_LOG("Original size: %d x %d\n", w, h); lv_coord_t size = LV_MIN(w, h); lv_obj_set_size(image, size, size); OPLUS_WF_ERROR_LOG("New size: %d x %d\n", size, size); lv_area_t mask_area; lv_obj_get_coords(image, &mask_area); OPLUS_WF_ERROR_LOG("Mask area: x1=%d, y1=%d, x2=%d, y2=%d\n", mask_area.x1, mask_area.y1, mask_area.x2, mask_area.y2); lv_draw_mask_radius_param_t radius_param; lv_draw_mask_radius_init(&radius_param, &mask_area, size/2, false); int16_t mask_id = lv_draw_mask_add(&radius_param, NULL); OPLUS_WF_ERROR_LOG("Mask ID: %d\n", mask_id); // 必须 >= 0 lv_obj_invalidate(image); } return JS_UNDEFINED; }
时间: 2025-04-07 07:09:33 浏览: 30
这段代码是一个 JavaScript 引擎绑定的 C/C++ 函数声明,主要用于处理将图像对象设置为圆形的操作。它基于 LVGL 图形库实现了一些核心逻辑步骤。以下是详细的解析:
---
### **代码分析**
1. **获取 LVGL 对象引用**
```c
lv_obj_t *image = get_lvgl_from_jsclass_obj(ctx, this_value, js_image_class_id);
```
这段代码从当前上下文中提取了一个指向 LVGL 图像对象 (`lv_obj_t`) 的指针。
2. **记录调试信息**
```c
OPLUS_WF_ERROR_LOG("Image address: %p\n", image);
```
记录了该图像对象的内存地址用于调试目的。
3. **计算原始尺寸并裁剪成正方形**
```c
lv_coord_t w = lv_obj_get_width(image);
lv_coord_t h = lv_obj_get_height(image);
lv_coord_t size = LV_MIN(w, h);
lv_obj_set_size(image, size, size);
```
获取图像宽度和高度后取较小值作为新边长,并将其大小设为正方形。
4. **生成遮罩区域坐标**
```c
lv_area_t mask_area;
lv_obj_get_coords(image, &mask_area);
```
获得图像的实际绘制范围坐标存储到 `mask_area` 中。
5. **初始化半径遮罩参数**
```c
lv_draw_mask_radius_param_t radius_param;
lv_draw_mask_radius_init(&radius_param, &mask_area, size / 2, false);
int16_t mask_id = lv_draw_mask_add(&radius_param, NULL);
```
创建一个圆角遮罩参数结构体,指定中心点、半径等属性并通过 `lv_draw_mask_add` 添加至全局遮罩列表返回唯一标识符(ID)。
6. **刷新 UI 组件内容使其生效**
```c
lv_obj_invalidate(image);
```
7. **结束函数调用**
返回 `JS_UNDEFINED` 表明此方法无明确结果反馈给 JavaScript 层面使用。
---
### **关键知识点解释**
- **LVGL 基本概念**:
LVGL 是一款轻量级嵌入式 GUI 库,广泛应用于资源受限设备上构建复杂用户界面的应用场景之中。
- **Lv Draw Mask Radius Init():**
此 API 可帮助开发者轻松构造任意形状边界框约束效果例如椭圆弧度过渡渐变填充等等非常实用强大的工具!
- **Invalidation Mechanism:**
当修改某个控件外观特性之后需要通知渲染引擎重新布局或者重绘受影响部分这就是所谓的“失效”机制原理所在之处啦~
---
###
阅读全文
相关推荐











