像绘画那样写代码

很久不写代码,发现写代码的习惯有点变化了。以前基本都是把一个类(或者功能)写好了,并测试通过了,再去写另一个类。至于两者如何交互的,事先要考虑清楚,也就是要做设计,画UML图等。至少是先写的功能,要充分考虑未来调用者的各种使用场景。就像在一张白纸上作画,第一笔总是很难的,所以往往也是最苦闷的时候,写代码的进度也很慢。现在不一样了,根本不等把细节考虑,就开始写代码。先是大概把代码框架写了,想到什么就先写下什么,还没有确定的细节,就用伪代码,文字说明或者不完整的代码来大意示意一下。就这样,东一下子西一下的就把几个相关的类(功能)的框架给勾勒出来。虽然还无法编译通过,但是却让我对整个结构有了更多的认识,细节不断变得清晰,然后不断填充。这边的细节确定了,那边也就确定了,就这样来来回回的填充,很快所有的伪代码或者不完整代码就都变成了真正的代码。等到所有空白都填上了,就可以F5编译了。这时候,编译器还会发现一些错误,继续修补直至编译通过。最后是运行调试,直至得到预期结果。

 

于是就想到,绘画的时候,我们会首先用简单的几笔勾勒出大致的轮廓,然后不断的补充细节。刚开始的时候,看不出是什么东西,但随着细节的不断加入,就越来越生动了。你不可能说画一个人的肖像的时候,先把每一根头发都描绘出来,然后才是画眼睛,画鼻子......你当然会先勾勒出发型,眼睛和鼻子的位置,然后再来回细描,每一次都会力图保证所有的部位在细节的细密程度是一致的,而不能说头发很细致而眼睛很粗陋。我不懂绘画,但我觉得这是要力图保证协调,保证全局观。看电影里的大师作画,开场总是随便在纸上随便点上几笔,甚至是随意的泼墨,然后就着这些墨迹,这里加一笔,那里加一笔,一幅栩栩如生的画就诞生了,让人叹为观止。还有另一种绘画方式,就是打印。纸从一头进入,从另一头出来,画面是一行行的绘制出来的,细节也是一次性完成的,并不是来回补充上去的。

 

手绘和打印的区别就是,手绘前不需要考虑细节,只要胸中有一个大概的轮廓和思路即可,细节可以在绘画过程中不断补充。而打印,需要在一开始就把所有细节都考虑清楚,并在一开始就把细节做好。如果开始时没有把细节考虑清楚,那么打印结果是无法挽回的。手绘则可以通过再加入更多的细节来平衡以达到修补的目的,因为关注的是整体,而不是某一个局部。而且因为细节是不断加入的,所以发现错误的时候还有时间补救。不过,如果设计图(即底稿)很好的话,打印则可以得到更好的效果。所以,手绘具有灵活的特点。而打印则可以保证质量。

 

想想看,敏捷开发方式和瀑布型开发方式,不正好是跟手绘和打印类似?

要在LVGL中实现手绘画功能,你需要编一段代码来监听用户的触摸事件,然后在屏幕上绘制线条。以下是一个简化版的代码流程示例(假设使用C++和LVGL框架): 1. **设置基本环境**: - 引入必要的LVGL头文件,并初始化LVGL库。 ```cpp #include "lvgl.h" lv_obj_t *disp = lv_disp_create(); // 创建显示设备 lv_scr_t *scr = lv_scr_create(disp); // 创建屏幕 ``` 2. **创建画笔工具**: - 可能需要自定义一个触摸事件处理器,用于跟踪触摸位置。 ```cpp lv_event_cb_t touch_event_cb = NULL; touch_event_cb = lv_event_get_sys_handler(LV_EVENT_Touch.BEGAN); lv_event_register_with_type(scr, LV_EVENT_Touch.BEGAN, touch_event_cb); ``` 3. **绘制函数**: - 当触摸开始时,记录初始点,并在每次触摸移动时添加新的线段。 ```cpp void draw_line(lv_point_t start, lv_point_t end) { lv_draw_line(scr, &start, &end, lv_color_hex(0xabcdef)); // 线的颜色可以根据需求调整 } ``` 4. **触碰事件处理器**: - 在这个回调中获取当前触摸的位置,并调用`draw_line`函数。 ```cpp static void touch_began(lv_event_t *e) { lv_touch_t *touch = lv_event_get_source(e); if (!touch->pressed) return; if (touch_event_cb != NULL) { touch_event_cb(e); // 获取触摸位置 lv_point_t pos = {touch->pt.x, touch->pt.y}; draw_line(start_pos, pos); // start_pos需要预先声明并存储之前的点 } } lv_event_set_handler(scr, LV_EVENT_Touch.BEGAN, touch_began); ``` 5. **清理**: - 用户完成手后,记得关闭资源和清除状态。 ```cpp //... lv_obj_del(&disp); lv_scr_delete(scr); ``` 这只是一个基础框架,实际应用中可能还需要处理更多细节,比如防止多次绘制线段,保存绘制历史以便撤销等功能。同时,如果你想要实现更复杂的识别功能,还需要结合图像处理和机器学习库,这部分超出了LVGL的原生能力范围。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值