void _lv_indev_read_task(lv_task_t * task)是定时执行的输入设备任务回调函数。会处理输入设备的数据。

按下的处理:

static void indev_proc_press(lv_indev_proc_t * proc)

{

……

*首先从layer_sys,layer_top,scr_act按优级查找当前的活动对象

/* bool lv_obj_is_point_on_coords(lv_obj_t * obj, const lv_point_t * point)*/

indev_obj_act = lv_indev_search_obj(lv_disp_get_layer_sys(disp),         &proc->types.pointer.act_point);

if(indev_obj_act == NULL) indev_obj_act =         lv_indev_search_obj(lv_disp_get_layer_top(disp),
                                                                          &proc->types.pointer.act_point);
        if(indev_obj_act == NULL) indev_obj_act = lv_indev_search_obj(lv_disp_get_scr_act(disp),
                                                                          &proc->types.pointer.act_point);
        new_obj_searched = true;

……

*如果按下时有throw动作手动停止。page drag后一般有throw动作。

/*The last object might have drag throw. Stop it manually*/
            if(new_obj_searched && proc->types.pointer.last_obj) {
                proc->types.pointer.drag_throw_vect.x = 0;
                proc->types.pointer.drag_throw_vect.y = 0;
                indev_drag_throw(proc);
            }

……

*如果当前的活动对与上一次的活动对象不一样。proc->types.pointer.act_obj是上一次的活动  对象,通知上一个活动对象PRESS_LOST(1次)。通知最近的对象被PRESSED(1次),并复位一些寄存器。

    /*If a new object was found reset some variables and send a pressed signal*/if(indev_obj_act != proc->types.pointer.act_obj) {/*刚选中的活动对象不产生坐标向量值,把last_point与act_point同步*/proc->types.pointer.last_point.x = proc->types.pointer.act_point.x;proc->types.pointer.last_point.y = proc->types.pointer.act_point.y;/*If a new object found the previous was lost, so send a signal*/if(proc->types.pointer.act_obj != NULL) {/*Save the obj because in special cases `act_obj` can change in the signal function*/lv_obj_t * last_obj = proc->types.pointer.act_obj;last_obj->signal_cb(last_obj, LV_SIGNAL_PRESS_LOST, indev_act);if(indev_reset_check(proc)) return;lv_event_send(last_obj, LV_EVENT_PRESS_LOST, NULL);if(indev_reset_check(proc)) return;}proc->types.pointer.act_obj  = indev_obj_act; /*Save the pressed object*/proc->types.pointer.last_obj = indev_obj_act;if(indev_obj_act != NULL) {/* Save the time when the obj pressed to count long press time.*/proc->pr_timestamp                 = lv_tick_get();proc->long_pr_sent                 = 0;proc->types.pointer.drag_limit_out = 0;proc->types.pointer.drag_in_prog   = 0;proc->types.pointer.drag_sum.x     = 0;proc->types.pointer.drag_sum.y     = 0;proc->types.pointer.drag_dir = LV_DRAG_DIR_BOTH;proc->types.pointer.gesture_sent   = 0;proc->types.pointer.gesture_sum.x  = 0;proc->types.pointer.gesture_sum.y  = 0;proc->types.pointer.vect.x         = 0;proc->types.pointer.vect.y         = 0;/*Search for 'top' attribute*/lv_obj_t * i        = indev_obj_act;lv_obj_t * last_top = NULL;while(i != NULL) {if(i->top) last_top = i;i = lv_obj_get_parent(i);}if(last_top != NULL) {/*Move the last_top object to the foreground*/lv_obj_move_foreground(last_top);}/*Send a signal about the press*/indev_obj_act->signal_cb(indev_obj_act, LV_SIGNAL_PRESSED, indev_act);if(indev_reset_check(proc)) return;lv_event_send(indev_obj_act, LV_EVENT_PRESSED, NULL);if(indev_reset_check(proc)) return;if(indev_act->proc.wait_until_release) return;/*Handle focus*/indev_click_focus(&indev_act->proc);if(indev_reset_check(proc)) return;}}

*构建drag_throw_vect(throw效果的向量)与vect(两次坐标输入向量)的相关性,方便释放时使用。

    ……/*Calculate the types.pointer.vector*/proc->types.pointer.vect.x = proc->types.pointer.act_point.x - proc->types.pointer.last_point.x;proc->types.pointer.vect.y = proc->types.pointer.act_point.y - proc->types.pointer.last_point.y;proc->types.pointer.drag_throw_vect.x = (proc->types.pointer.drag_throw_vect.x * 5) >> 3;proc->types.pointer.drag_throw_vect.y = (proc->types.pointer.drag_throw_vect.y * 5) >> 3;if(proc->types.pointer.drag_throw_vect.x < 0)proc->types.pointer.drag_throw_vect.x++;else if(proc->types.pointer.drag_throw_vect.x > 0)proc->types.pointer.drag_throw_vect.x--;if(proc->types.pointer.drag_throw_vect.y < 0)proc->types.pointer.drag_throw_vect.y++;else if(proc->types.pointer.drag_throw_vect.y > 0)proc->types.pointer.drag_throw_vect.y--;proc->types.pointer.drag_throw_vect.x += (proc->types.pointer.vect.x * 4) >> 3;proc->types.pointer.drag_throw_vect.y += (proc->types.pointer.vect.y * 4) >> 3;……

*处理拖动、手势、长按、重复长按。PRESSING信号会一直发送。

    /*If there is active object and it can be dragged run the drag*/if(indev_obj_act != NULL) {indev_obj_act->signal_cb(indev_obj_act, LV_SIGNAL_PRESSING, indev_act);if(indev_reset_check(proc)) return;lv_event_send(indev_obj_act, LV_EVENT_PRESSING, NULL);if(indev_reset_check(proc)) return;if(indev_act->proc.wait_until_release) return;indev_drag(proc);indev_gesture(proc);if(indev_reset_check(proc)) return;/*If there is no drag then check for long press time*/if(proc->types.pointer.drag_in_prog == 0 && proc->long_pr_sent == 0) {/*Send a signal about the long press if enough time elapsed*/if(lv_tick_elaps(proc->pr_timestamp) >                 indev_act->driver.long_press_time)                                  {indev_obj_act->signal_cb(indev_obj_act, LV_SIGNAL_LONG_PRESS, indev_act);if(indev_reset_check(proc)) return;lv_event_send(indev_obj_act, LV_EVENT_LONG_PRESSED, NULL);if(indev_reset_check(proc)) return;/*Mark the signal sending to do not send it again*/proc->long_pr_sent = 1;/*Save the long press time stamp for the long press repeat handler*/proc->longpr_rep_timestamp = lv_tick_get();}}/*Send long press repeated signal*/if(proc->types.pointer.drag_in_prog == 0 && proc->long_pr_sent == 1) {/*Send a signal about the long press repeat if enough time elapsed*/if(lv_tick_elaps(proc->longpr_rep_timestamp) > indev_act->driver.long_press_rep_time) {indev_obj_act->signal_cb(indev_obj_act, LV_SIGNAL_LONG_PRESS_REP, indev_act);if(indev_reset_check(proc)) return;lv_event_send(indev_obj_act, LV_EVENT_LONG_PRESSED_REPEAT, NULL);if(indev_reset_check(proc)) return;proc->longpr_rep_timestamp = lv_tick_get();}}}

*indev_drag有两个变量,proc->types.pointer.drag_limit_out全局变量开启拖累后会一直为1,切到新对象才到写0。drag_just_started局部变量与limit_out同时置位控制方向,DRAG_BEGIN信号发送。

static void indev_drag(lv_indev_proc_t * proc)
{lv_obj_t * drag_obj    = get_dragged_obj(proc->types.pointer.act_obj);bool drag_just_started = false;uint8_t drag_dir; //saimenif(drag_obj == NULL) return;if(lv_obj_get_drag(drag_obj) == false) return;lv_drag_dir_t allowed_dirs = lv_obj_get_drag_dir(drag_obj);/*Count the movement by drag*/if(proc->types.pointer.drag_limit_out == 0) {proc->types.pointer.drag_sum.x += proc->types.pointer.vect.x;proc->types.pointer.drag_sum.y += proc->types.pointer.vect.y;/*Enough move?*/bool hor_en = false;bool ver_en = false;if(allowed_dirs == LV_DRAG_DIR_HOR || allowed_dirs == LV_DRAG_DIR_BOTH) {hor_en = true;}if(allowed_dirs == LV_DRAG_DIR_VER || allowed_dirs == LV_DRAG_DIR_BOTH ||\allowed_dirs == LV_DRAG_DIR_VER_ONLY_UP || allowed_dirs == LV_DRAG_DIR_VER_ONLY_DOWN) {ver_en = true;}if(allowed_dirs == LV_DRAG_DIR_ONE) {if(LV_MATH_ABS(proc->types.pointer.drag_sum.x) > LV_MATH_ABS(proc->types.pointer.drag_sum.y)) {hor_en = true;drag_dir = 0x10;}else {ver_en = true;drag_dir = 0x20;}}/*If a move is greater then LV_DRAG_LIMIT then begin the drag*/if((hor_en && LV_MATH_ABS(proc->types.pointer.drag_sum.x) >= indev_act->driver.drag_limit) ||(ver_en && LV_MATH_ABS(proc->types.pointer.drag_sum.y) >= indev_act->driver.drag_limit)) {proc->types.pointer.drag_limit_out = 1;drag_just_started                   = true;if(drag_dir==0x10){if(proc->types.pointer.drag_sum.x>0){drag_dir |= 1;}else{drag_dir |= 2;}}else{if(proc->types.pointer.drag_sum.y>0){drag_dir |= 1;}else{drag_dir |= 2;}}}}/*If the drag limit is exceeded handle the dragging*/if(proc->types.pointer.drag_limit_out != 0) {/*Set new position if the vector is not zero*/if(proc->types.pointer.vect.x != 0 || proc->types.pointer.vect.y != 0) {lv_coord_t prev_x     = drag_obj->coords.x1;lv_coord_t prev_y     = drag_obj->coords.y1;lv_coord_t prev_par_w = lv_obj_get_width(lv_obj_get_parent(drag_obj));lv_coord_t prev_par_h = lv_obj_get_height(lv_obj_get_parent(drag_obj));/*Get the coordinates of the object and modify them*/lv_coord_t act_x = lv_obj_get_x(drag_obj);lv_coord_t act_y = lv_obj_get_y(drag_obj);if(allowed_dirs == LV_DRAG_DIR_BOTH) {if(drag_just_started) {proc->types.pointer.drag_dir = LV_DRAG_DIR_BOTH;act_x += proc->types.pointer.drag_sum.x;act_y += proc->types.pointer.drag_sum.y;}}else if(allowed_dirs == LV_DRAG_DIR_HOR) {if(drag_just_started) {proc->types.pointer.drag_dir = LV_DRAG_DIR_HOR;proc->types.pointer.drag_sum.y = 0;act_x += proc->types.pointer.drag_sum.x;}}else if(allowed_dirs == LV_DRAG_DIR_VER) {if(drag_just_started) {proc->types.pointer.drag_dir = LV_DRAG_DIR_VER;proc->types.pointer.drag_sum.x = 0;act_y += proc->types.pointer.drag_sum.y;}}else if(allowed_dirs == LV_DRAG_DIR_ONE) {if(drag_just_started) {if(LV_MATH_ABS(proc->types.pointer.drag_sum.x) > LV_MATH_ABS(proc->types.pointer.drag_sum.y)) {proc->types.pointer.drag_dir = LV_DRAG_DIR_HOR;proc->types.pointer.drag_sum.y = 0;act_x += proc->types.pointer.drag_sum.x;}else {proc->types.pointer.drag_dir = LV_DRAG_DIR_VER;proc->types.pointer.drag_sum.x = 0;act_y += proc->types.pointer.drag_sum.y;}}}else if (allowed_dirs == LV_DRAG_DIR_VER_ONLY_UP) {if (drag_just_started) {proc->types.pointer.drag_dir = LV_DRAG_DIR_VER;proc->types.pointer.drag_sum.x = 0;if (act_y + proc->types.pointer.drag_sum.y <= 0)act_y += proc->types.pointer.drag_sum.y;elseproc->types.pointer.drag_sum.y = 0;}}else if (allowed_dirs == LV_DRAG_DIR_VER_ONLY_DOWN) {if (drag_just_started) {proc->types.pointer.drag_dir = LV_DRAG_DIR_VER;proc->types.pointer.drag_sum.x = 0;if (act_y + proc->types.pointer.drag_sum.y >= 0)act_y += proc->types.pointer.drag_sum.y;elseproc->types.pointer.drag_sum.y = 0;}}/*Move the object*/if(allowed_dirs == LV_DRAG_DIR_HOR ||allowed_dirs == LV_DRAG_DIR_BOTH ||(allowed_dirs == LV_DRAG_DIR_ONE &&LV_MATH_ABS(proc->types.pointer.drag_sum.x) > LV_MATH_ABS(proc->types.pointer.drag_sum.y))) {act_x += proc->types.pointer.vect.x;}if(allowed_dirs == LV_DRAG_DIR_VER ||allowed_dirs == LV_DRAG_DIR_BOTH ||(allowed_dirs == LV_DRAG_DIR_ONE &&LV_MATH_ABS(proc->types.pointer.drag_sum.x) < LV_MATH_ABS(proc->types.pointer.drag_sum.y))) {act_y += proc->types.pointer.vect.y;}if (allowed_dirs == LV_DRAG_DIR_VER_ONLY_UP){if (act_y + proc->types.pointer.vect.y <= 0)act_y += proc->types.pointer.vect.y;}if (allowed_dirs == LV_DRAG_DIR_VER_ONLY_DOWN){if (act_y + proc->types.pointer.vect.y >= 0)act_y += proc->types.pointer.vect.y;}uint16_t inv_buf_size =lv_disp_get_inv_buf_size(indev_act->driver.disp); /*Get the number of currently invalidated areas*/lv_obj_set_pos(drag_obj, act_x, act_y);proc->types.pointer.drag_in_prog = 1;/*If the object didn't moved then clear the invalidated areas*/if(drag_obj->coords.x1 == prev_x && drag_obj->coords.y1 == prev_y) {/*In a special case if the object is moved on a page and* the scrollable has fit == true and the object is dragged of the page then* while its coordinate is not changing only the parent's size is reduced */lv_coord_t act_par_w = lv_obj_get_width(lv_obj_get_parent(drag_obj));lv_coord_t act_par_h = lv_obj_get_height(lv_obj_get_parent(drag_obj));if(act_par_w == prev_par_w && act_par_h == prev_par_h) {uint16_t new_inv_buf_size = lv_disp_get_inv_buf_size(indev_act->driver.disp);_lv_disp_pop_from_inv_buf(indev_act->driver.disp, new_inv_buf_size - inv_buf_size);}}/*Set the drag in progress flag*//*Send the drag begin signal on first move*/if(drag_just_started) {drag_obj->signal_cb(drag_obj, LV_SIGNAL_DRAG_BEGIN, indev_act);if(indev_reset_check(proc)) return;//lv_event_send(drag_obj, LV_EVENT_DRAG_BEGIN, NULL);lv_event_send(drag_obj, LV_EVENT_DRAG_BEGIN, &drag_dir);if(indev_reset_check(proc)) return;}}}
}

*indev_drag中的通过调用void lv_obj_set_pos()来改变坐标,触发滚动传输。第次坐标的改变都会通知到父、子对象还有自已。

释放的处理:

static void indev_proc_release(lv_indev_proc_t * proc)

等一下写

LVGL-输入设备LV_INDEV_TYPE_POINTER类型相关推荐

  1. MCUXpresso开发NXP RT1060(3)——移植LVGL到NXP RT1060

    目录 开发环境 目录 一.开发环境 二.准备工作 三.移植步骤 1.修改lv_conf.h 2.显示功能移植 3.触摸功能移植 4.tick及timer 四.结果展示 五.参考资料 一.开发环境 1. ...

  2. LVGL | LVGL移植之中文文档

    目录 系统总览 设置项目 获取图书馆 配置文件 初始化 显示界面 显示缓冲区 显示驱动程序 回转 应用程序接口 输入设备接口 输入设备的类型 触摸板.鼠标或任何指针 键盘或键盘 编码器 按钮 其他特性 ...

  3. PLC输入端口触点类型介绍

    plc的输入端口可以与输入设备不同类型的触点连接,但不同触点类型设计的梯形图程序不同. ①①PLC的外部输入触点可与常开触点或常闭触点连接.常闭触点外接时,梯形图中的触点状态与继电器接触器控制图中的相 ...

  4. 项目-Holocubic透明桌面站(基于STM32)

    基于STM32的Holocubic透明桌面站 简介 一.效果展示 二.硬件设计 1.设计思路 2.焊接成品 三.外壳设计 四.软件设计 五.待优化部分 总结 简介 本项目主控选型为STM32.电路设计 ...

  5. Azure认知服务之使用墨迹识别功能识别手写汉字

    前面我们使用Azure Face实现了人脸识别.使用Azure表格识别器提取了表格里的数据.这次我们试试使用Azure墨迹识别API来对笔迹进行识别. 墨迹识别 墨迹识别器认知服务提供基于云的 RES ...

  6. Android 系统(57)---深入理解Android输入系统

    <深入理解Android 卷III>第五章 深入理解Android输入系统 <深入理解Android 卷III>即将发布,作者是张大伟.此书填补了深入理解Android Fra ...

  7. 【Visual C++】游戏开发笔记四十二 浅墨DirectX教程之十 游戏输入控制利器 DirectInput专场

    分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! 本系列文 ...

  8. 操作系统实验六 设备管理

    实验六 设备管理 一.实验目的 1. 理解设备管理的概念和任务. 2. 掌握独占设备的分配.回收等主要算法的原理并编程实现. 二.实验内容与基本要求 1. 在Windows系统中,编写程序实现对独占设 ...

  9. 电脑组成部件介绍图解之电脑由哪些部件组成?各个部件作用又是什么 ?主要功能是什么?

    计算机的基本硬件-主板 1.什么是计算机主板? 主板,又叫主机板.系统板或母板:它安装在机箱内,是微机最基本的也是最重要的 部件之一. 主板一般为矩形电路板,上面安装了组成计算机的主要电路系统,一般有 ...

最新文章

  1. 凌晨三点,各类程序员都在干吗?
  2. 回京火车上编码是一种怎样的体验?
  3. MyBatis配置:在控制台打印SQL语句
  4. linux int64_t 头文件,这对int64_t的处理是GCC和Clang的错误吗?
  5. Python 自动化,Helium 凭什么取代 Selenium?
  6. Spring Boot基础学习笔记14:实现文件上传功能
  7. 用python画动态三维轨迹_python 画3维轨迹图并进行比较的实例
  8. Python求最大公约数和最小公倍数
  9. JavaScript学习(八)—属性节点和属性值的操作
  10. 【李宏毅NLP笔记】Tacotron 可以从哪些方面改进
  11. Spring的组件自动扫描机制
  12. mysql新建数据库并执行sql文件
  13. JAVA数组内存分析 面向对象 类和对象 创建对象的内存分析 成员变量 局部变量
  14. 【无极低码】手写一个低代码平台之二次开发Java
  15. java es nested_关于nested类型的使用
  16. 学习html的心得总结
  17. 学python多大年龄可以学车_考驾照的最小年龄,多少岁可以考驾照
  18. 生日快乐app(从无到有)
  19. 缺陷特征描述及特征选择
  20. 2019中国(深圳)IT领袖峰会大咖云集 引爆IT朋友圈...

热门文章

  1. 华为nova6计算机历史在哪可以看,写在华为nova6发布前:一文看出nova手机使用芯片的变迁历程...
  2. torch.bmm 函数
  3. tensorrt遇到torch.bmm的解决
  4. 牛客动态规划习题:Min酱要旅行(背包变种)
  5. python爬虫超时重试_python爬虫怎么处理异常和超时?
  6. s3c2440A操作24C08
  7. 学习数据结构的意义和作用
  8. 鸿蒙开发板Hi3861模拟SPI驱动JLX12864_LCD(UC1701X)_基于code-2.0
  9. 计算机cpu最高温度,详解电脑cpu温度过高几种常用处理方法
  10. Docker/Podman使用提高---docker-compose基础(python3)