在BL808上增加宠物互动(实现图片旋转、图片上色、屏幕触摸功能)
[复制链接]
还记得在前几篇中提到LVGL的时候,说初始化的时候,除了初始化显示输出(lv_port_disp_init();)以外,还提到了初始化了输入功能(lv_port_indev_init();),本篇我们将配合输入功能实现通过点击按钮来逗宠物玩耍。
前几篇中,小狮子已经可以自由自在地跑来跑去了,本篇中希望增加狮子和蝴蝶的互动。
添加小狮子的动作,还是继续增加图片数组就行。
再增加一个蝴蝶数组,考虑到各种颜色蝴蝶的形状是一样的,干脆只设置一组蝴蝶飞舞的动作,再通过lv_obj_set_style_img_recolor(butterfly, butterfly_color, 0);修改蝴蝶颜色。
当然在设置颜色之前,还需要修改图片的透明度:
lv_obj_set_style_img_recolor_opa(butterfly, 200, 0);
使得可以使用特定颜色填充图片。
通过lv_obj_get_x(butterfly)、lv_obj_get_y(butterfly)、lv_obj_get_x(lion)、lv_obj_get_y(lion)计算狮子和蝴蝶的相对位置,再调用特定的动作数组,就可以实现其互动效果啦。
为了放飞蝴蝶,或者改变蝴蝶的颜色,我们需要增加屏幕触摸功能,但main()中初始化输入功能(增加lv_port_indev_init();)之后,会发现一件神奇的事情,那就是我们可以拖动“太阳”。这其实也正常,因为在上一篇中就是使用的lv_arc的LV_PART_KNOB作为太阳的,而LV_PART_KNOB本来就是让大家拖来拖去的。不仅仅是拖动,只要随便在屏幕上点击一下,就会发现太阳的角度发生了变化。这是因为为了让太阳在天空中活动,lv_arc占据了整个屏幕(上半部分是太阳可以活动的范围,下半部分虽然是没有显示,但lv_arc必须要按照一个完整圆来布局),当然敲击屏幕会引起angle的改变。
于是乎考虑把太阳换掉,换成一个lv_led。为了实现太阳按照弧线轨迹的运动效果,单纯使用lv_obj_set_pos似乎太过困难(计算x,y值就是一个很大的工作量啊,用函数查表也是不怎么现实),考虑使用旋转效果实现。首先设置旋转圆心:
lv_obj_set_style_transform_pivot_x(sun_led,135,0);
lv_obj_set_style_transform_pivot_y(sun_led,90,0);
然后通过lv_obj_set_style_transform_angle设置旋转角度
lv_obj_set_style_transform_angle(sun_led,sun_time,0);
就可以实现太阳使用弧线经过天空的效果。
这里的sun_time同样是角度的单位,但和之前lv_arc中设置旋转进度的百分比不同,这里是以0.1度为计量单位的。
经过触摸的屏幕,会留有一个小小LV_SYMOL_USB的图标,这是表示上一次触摸位置的,如果不需要,可以通过修改“/M1s_BL808_SDK/components/lvgl/port/lv_port_indev.c” 文件,去掉这个图标。
为了放飞蝴蝶,我们增加一个按钮组,并设置动作
当然,这里让小狮子喝点水的按钮功能还没开始做,先看看btns[0]吧。
188395f3bb089351cc0b78cc3679fdd8
点按btns[1]中水杯的图标没有效果,点击btns[0](蝴蝶)的图标,会出现一只“扑棱蛾子”,颜色是随机的,再次点击会变颜色。被狮子抓住了就没有了。当然手指的精度不太高,可能在这块开发板上还需要找一个触摸笔来配合。
|