LVGL扩大按钮点击范围

这是一个很常见的需求,取决于UI设计,按钮太小,用户可点击的区域就小,对于一些手指比较大的用户就会提出这样的一些需求,扩大按钮的点击区域。

在LVGL中,有现成的接口直接可以使用。

//LVGL7
void lv_obj_set_ext_click_area(lv_obj_t * obj, lv_coord_t left, lv_coord_t right, lv_coord_t top, lv_coord_t bottom);

//LVGL8
void lv_obj_set_ext_click_area(lv_obj_t * obj, lv_coord_t size);

LVGL7版本,可以对上下左右的点击区域分别做扩充,但是LVGL8版本就直接简化成对四个方向统一扩充一样的单位。

炬芯平台使用的LVGL版本是8.3,现在有个按钮只需要加大上下方向的点击范围,LVGL提供的接口用不了,就有点难受了。

那怎么办,只能自己实现了(这里简单的提供下思路,仅供参考)。

1.增加一个接口,判断用户点击的范围是否在扩充的位置上

#define EXTEND_SIZE  (20)

static void btn_is_press(lv_obj_t *obj, lv_point_t *point)
{
    // 获取对象的绝对坐标和尺寸
    lv_coord_t obj_x = lv_obj_get_x(obj);
    lv_coord_t obj_y = lv_obj_get_y(obj);
    lv_coord_t obj_width = lv_obj_get_width(obj);
    lv_coord_t obj_height = lv_obj_get_height(obj);
    //printf("BTN x,y = %d,%d w,h = %d,%d\n", obj_x, obj_y, obj_width, obj_height);
    

    // 上下扩展区域大小设置
    lv_coord_t top_extend = EXTEND_SIZE;
    lv_coord_t bottom_extend = EXTEND_SIZE;

    // 判断点击是否在扩展后的上下区域内
    if ((point->x >= obj_x) && (point->x <= obj_x + obj_width)  // X轴在按钮宽度内
        && (point->y >= obj_y - top_extend) && (point->y <= obj_y + obj_height + bottom_extend))   // Y轴扩展上下
    {
        // 触发按钮点击事件
        lv_event_send(obj, LV_EVENT_CLICKED, NULL);
    }
}

2.页面增加点击回调函数

#define BTN_Y_START   (300)
#define BTN_Y_END     (360)

static void page_event_handler(lv_event_t * e)
{
    lv_point_t point;
    lv_indev_t *indev = lv_indev_get_act();

    // 获取当前点击坐标
    lv_indev_get_point(indev, &point);  
    //printf("Click x = %d, y = %d\n",point.x, point.y);

    //与按钮坐标对比
    if( point.y >= (BTN_Y_START - EXTEND_SIZE) 
        &&  point.y <= (BTN_Y_END + EXTEND_SIZE) )
    {
        btn_is_press(page->btn, &point);
    }
}


void page_show(lv_obj_t *scr)
{
    ...
    lv_obj_add_flag(scr, LV_OBJ_FLAG_CLICKABLE);
    lv_obj_add_event_cb(scr, page_event_handler, LV_EVENT_SHORT_CLICKED, NULL);
    ...
}

通过给页面增加点击回调函数来判断当前用户点击的坐标,跟按钮扩充后的点击范围做对比,在点击范围内,手动触发按钮回调事件。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值