TouchGFX之Drawable

TouchGFX框架中的所有控件均为Drawable类的子类。 该类别包含控制大小和位置的一般方法。

#ifndef TOUCHGFX_DRAWABLE_HPP
#define TOUCHGFX_DRAWABLE_HPP
#include <touchgfx/Bitmap.hpp>
#include <touchgfx/events/ClickEvent.hpp>
#include <touchgfx/events/DragEvent.hpp>
#include <touchgfx/events/GestureEvent.hpp>
#include <touchgfx/hal/Types.hpp>namespace touchgfx
{
/* 可绘制类抽象接口 */
class Drawable
{
public:/* 构造函数 */Drawable(): rect(),cachedVisibleRect(),parent(0),nextSibling(0),nextDrawChainElement(0),cachedAbsX(0),cachedAbsY(0),touchable(false),visible(true){}/* 析构函数 */virtual ~Drawable(){}/* 绘制该图。仅绘制包含在矩形内部分。以相对于其父节点的坐标表示(例如,对于完全重绘,invalidatedArea将是(0, 0, width, height) */virtual void draw(const Rect& invalidatedArea) const = 0;/* 获取可以保证为实心的(不透明的)最大矩形。任何在这个实心区域下方的Drawable都不需要被绘制。   返回的矩形相对于Drawable,完全实心的widget应该返回Rect(0, 0, getWidth(), getHeight()) */virtual Rect getSolidRect() const = 0;/* 请求重绘此Drawable的一个区域,以相对坐标表示 */ virtual void invalidateRect(Rect& invalidatedArea) const;/* 整个Drawable重新绘制。与调用invalidateRect()并传递Rect(0, 0, getWidth(), getHeight())相同 */  virtual void invalidate() const;/* Drawable的内容重新绘制。如果Drawable是不可见的,则什么也不会发生 */  virtual void invalidateContent() const{if(visible){invalidate();}}/* 获取父级容器中的下一个Drawable指针 */Drawable *getNextSibling(){return nextSibling;}/* 获取父级容器中的第一个Drawable指针 */virtual Drawable *getFirstChild(){return 0;}/* 获取Drawable的最大的实心矩形,并将其转换为绝对坐标 */virtual Rect getSolidRectAbsolute();/* 获取此绘图所在容器中最上面与指定点相交的子项(以相对于父对象的坐标表示的交点)用于输入事件处理,以确定应接收事件的适当Drawable */virtual void getLastChild(int16_t x, int16_t y, Drawable **last) = 0;/* 查找此Drawable的可见部分。如果Drawable在父节点的“边缘之外”,切掉此区域外的部分返回rect:绝对坐标 */virtual void getVisibleRect(Rect& rect) const;/* 获取此Drawable覆盖的矩形区域,坐标相对于其父Drawable */ const Rect& getRect() const{return rect;}/* 获取此Drawable覆盖的矩形区域,并将其转换为绝对坐标 */ Rect getAbsoluteRect() const;/* 将此Drawable的一个区域转换为绝对坐标 @param [in,out] r 要转换的矩形区域 */virtual void translateRectToAbsolute(Rect& r) const;/* 设置此Drawable的大小和位置,相对于其父Drawable(不会重绘) */ void setPosition(int16_t x, int16_t y, int16_t width, int16_t height){setXY(x, y);setWidthHeight(width, height);}/* 扩展此Drawable,使其与父Drawable具有相同的大小,并在边缘周围具有给定的边距。如果没有父Drawable,则位置被设置为整个显示屏的大小。  @param margin (可选)边距 */void expand(int margin = 0);/* 在其父Drawable内居中此Drawable */void center(){centerX();centerY();}/* 在其父Drawable内水平居中此Drawable */void centerX(){assert(parent && "Cannot center a Drawable with no parent");setX((parent->getWidth() - getWidth()) / 2);}/* 在其父Drawable内垂直居中此Drawable */void centerY(){assert(parent && "Cannot center a Drawable with no parent");setY((parent->getHeight() - getHeight()) / 2);}/* 获取此Drawable的x坐标,相对于其父Drawable */int16_t getX() const{return rect.x;}/* 获取此Drawable的y坐标,相对于其父Drawable */int16_t getY() const{return rect.y;}/* 获取此Drawable的宽度 */int16_t getWidth() const{return rect.width;}/* 获取此Drawable的高度 */int16_t getHeight() const{return rect.height;}/* 设置此Drawable的x坐标,相对于其父对象(允许负值)(不会重绘) */virtual void setX(int16_t x){rect.x = x;}/* 设置此Drawable的y坐标,相对于其父对象(允许负值)(不会重绘) */virtual void setY(int16_t y){rect.y = y;}/* 同时设置此Drawable的x和y坐标,相对于其父对象(允许负值)(不会重绘) */void setXY(int16_t x, int16_t y){setX(x);setY(y);}/* 设置此Drawable的宽度(不会重绘) */virtual void setWidth(int16_t width){rect.width = width;}/* 设置此Drawable的高度(不会重绘) */virtual void setHeight(int16_t height){rect.height = height;}/* 此函数可以在父节点上调用,以信号表示其一个或多个子节点的大小或位置已更改  当前仅在ScrollableContainer中使用,以在滚动内容的大小更改时重绘滚动条 */virtual void childGeometryChanged(){}/* 定义用于处理ClickEvents的事件处理程序接口  只有在Drawable可触摸且可见时,才会收到该事件 */virtual void handleClickEvent(const ClickEvent& event){(void)event;}/* 定义用于处理GestureEvents的事件处理程序接口  只有在Drawable可触摸且可见时,才会收到该事件 */virtual void handleGestureEvent(const GestureEvent& event){(void)event;}/* 设置此Drawable的宽度和高度(不会重绘) */void setWidthHeight(int16_t width, int16_t height){setWidth(width);setHeight(height);}/* 将Drawable的位置设置为与给定的Drawable相同。这将复制x,y,宽度和高度(不会重绘) */void setPosition(const Drawable& drawable){setPosition(drawable.getX(), drawable.getY(), drawable.getWidth(), drawable.getHeight());}/* 将Drawable的x,y设置为与给定的Drawable相同(不会重绘) */void setXY(const Drawable& drawable){setXY(drawable.getX(), drawable.getY());}/* 将Drawable的宽度和高度设置为与给定的Drawable相同(不会重绘) */void setWidthHeight(const Drawable& drawable){setWidthHeight(drawable.getWidth(), drawable.getHeight());}/* 将bitmap的宽度和高度设置为与给定的Drawable相同(不会重绘) */void setWidthHeight(const Bitmap& bitmap){setWidthHeight(bitmap.getWidth(), bitmap.getHeight());}/* 将矩形的宽度和高度设置为与给定的Drawable相同(不会重绘) */void setWidthHeight(const Rect& other){setWidthHeight(other.width, other.height);}/* 定义处理DragEvent的事件处理器接口只有当Drawable是可触摸的和可见的时,才会接收到事件 */ virtual void handleDragEvent(const DragEvent& event){(void)event;}/* Drawable定时事件处理接口  Application::registerTimerWidget 用于注册计时器小部件的应用程序函数 */  virtual void handleTickEvent(){}/* 设置此Drawable是否可见。只有可见的Drawable才会调用其绘制函数(不会重绘)另外,不可见的Drawable不会接收输入事件 */  void setVisible(bool vis){visible = vis;}/* 设置此Drawable是否接收触摸事件@param  touch 如果为true,它将接收触摸事件;如果为false,则不接收 */ void setTouchable(bool touch){touchable = touch;}/* 获取此Drawable是否可见 */bool isVisible() const{return visible;}/* 获取此Drawable是否接收触摸事件 */bool isTouchable() const{return touchable;}/* 返回父节点。对于根容器,返回值为0 */Drawable* getParent() const{return parent;}/**  * 移动Drawable。  *  * @param  x 要移动到的相对位置。  * @param  y 要移动到的相对位置。  *  * @see moveTo, setXY 用于绝对定位的函数。  *  * @note 将重绘屏幕的适当区域。  */virtual void moveRelative(int16_t x, int16_t y);/**  * 移动Drawable。  *  * @param  x 要移动到的绝对位置。  * @param  y 要移动到的绝对位置。  *  * @see moveRelative, setXY 另一个用于绝对定位的函数。  *  * @note 将重绘屏幕的适当区域。  */ virtual void moveTo(int16_t x, int16_t y){moveRelative(x - rect.x, y - rect.y);}/* 将Drawable对象渲染到动态位图中 */ void drawToDynamicBitmap(BitmapId id);protected:Rect rect;	//此Drawable覆盖的矩形区域,坐标相对于其父DrawableRect cachedVisibleRect; //当前可见区域的缓存表示。供TouchGFX内部使用Drawable* parent;      	//指向此drawable的父级的指针Drawable* nextSibling; 	//指向下一个Drawable的指针。由容器维护Drawable* nextDrawChainElement; //绘制链中的下一个元素。供TouchGFX内部使用int16_t cachedAbsX;             //绝对x坐标的缓存值。供TouchGFX内部使用int16_t cachedAbsY;             //绝对y坐标的缓存值。供TouchGFX内部使用bool touchable; //如果此drawable应接收触摸事件,则为truebool visible;   //如果此drawable应被绘制,则为truestatic const int16_t UNCACHED_INDICATOR = -1; //表示未缓存值的常量。供TouchGFX内部使用/* 重置缓存的坐标数据。这是TouchGFX内部使用的 */void resetDrawChainCache(){// Resetting the cached indicatorscachedVisibleRect.x = UNCACHED_INDICATOR;cachedAbsX = UNCACHED_INDICATOR;cachedAbsY = UNCACHED_INDICATOR;}/* 获取缓存的可见矩形版本。只计算一次。这是TouchGFX内部使用的 */Rect& getCachedVisibleRect(){if (cachedVisibleRect.x == UNCACHED_INDICATOR){Rect visibleRect(0, 0, getWidth(), getHeight());getVisibleRect(visibleRect);cachedVisibleRect = visibleRect;}return cachedVisibleRect;}/* 获取缓存的绝对X坐标版本。只计算一次。这是TouchGFX内部使用 */int16_t getCachedAbsX(){if (cachedAbsX == UNCACHED_INDICATOR){Rect absRect = getAbsoluteRect();cachedAbsX = absRect.x;cachedAbsY = absRect.y;}return cachedAbsX;}/* 获取缓存的绝对Y坐标版本。只计算一次。这是TouchGFX内部使用 */int16_t getCachedAbsY(){if (cachedAbsY == UNCACHED_INDICATOR){Rect absRect = getAbsoluteRect();cachedAbsX = absRect.x;cachedAbsY = absRect.y;}return cachedAbsY;}/* 配置绘制链的链表。这是TouchGFX内部使用的 */virtual void setupDrawChain(const Rect& invalidatedArea, Drawable** nextPreviousElement){(void)invalidatedArea; // Unused variableresetDrawChainCache();nextDrawChainElement = *nextPreviousElement;*nextPreviousElement = this;}friend class Container;friend class Screen;
};}#endif

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/772590.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

WEB测试之兼容性测试

1. 软件兼容性测试 兼容性测试是指待测试项目在特定的硬件平台上&#xff0c;不同的应用软件之间&#xff0c;不同的操作系统平台上&#xff0c;在不同的网络等环境中能正常的运行的测试。 兼容性测试的目的&#xff1a;待测试项目在不同的操作系统平台上正常运行&#xff0c…

[蓝桥杯 2023 省 A] 颜色平衡树:从零开始理解树上莫队 一颗颜色平衡树引发的惨案

十四是一名生物工程的学生&#xff0c;他已经7年没碰过信息学竞赛了&#xff0c;有一天他走在蓝桥上看见了一颗漂亮的颜色平衡树&#xff1a; ​​​​​​​[蓝桥杯 2023 省 A] 颜色平衡树 - 洛谷 十四想用暴力解决问题&#xff0c;他想枚举每个节点&#xff0c;每个节点代表…

Word通配符替换章节序号

这里写自定义目录标题 通配符替换章节序号切换域通配符替换内容插入编号切换域代码 通配符替换章节序号 碎片化学习word通配符知识 切换域 切换域&#xff1a;Alt F9 域都变成静态文字&#xff1a;Ctrl/Command Shift F9 通配符 内容通配符单个数字[0-9]多个数字&#…

office办公技能|word中的常见使用问题解决方案2.0

一、设置多级列表将表注从0开始&#xff0c;设置为从1开始 问题描述&#xff1a;word中插入题注&#xff0c;出来的是表0-1&#xff0c;不是1-1&#xff0c;怎么办&#xff1f; 写论文时&#xff0c;虽然我设置了“第一章”为一级标题&#xff0c;但是这三个字并不是自动插入的…

【C语言】【Leetcode】70. 爬楼梯

文章目录 题目思路&#xff1a;简单递归 > 动态规划 题目 链接: link 思路&#xff1a;简单递归 > 动态规划 这题类似于斐波那契数列的算法&#xff0c;结果其实就是到达前一步和到达前两步的方法之和&#xff0c;一直递归到n1和n2时就行了&#xff0c;但是这种算法有个…

解决vllm推理框架内在开启多显卡时报错问题

前言 vLLM在开启多显卡并行模式下&#xff0c;-tp 2 或者 --tensor-parallel-size 2&#xff0c;运行报错提示如下&#xff1a; The above exception was the direct cause of the following exception:Traceback (most recent call last): File "/usr/lib/python3.8/ru…

【echart】数据可视化

什么是数据可视化&#xff1f; 数据可视化主要目的:借助于图形化手段&#xff0c;清晰有效地传达与沟通信息。 数据可视化可以把数据从冰冷的数字转换成图形&#xff0c;揭示蕴含在数据中的规律和道理。 如何绘制&#xff1f; echarts 图表的绘制&#xff0c;大体分为三步:…

数据湖与湖仓一体是如何演变而来的?详谈大数据存储架构的变迁

在大数据存储架构的发展历程中&#xff0c;可以划分为三个显著的演进阶段。首先&#xff0c;随着Hadoop和Hive等初期项目的出现&#xff0c;数据仓库&#xff08;Data Warehouse&#xff09;的概念得以确立&#xff1b;随着数据仓库的不断演化&#xff0c;同时有了云与对象存储…

Unity DOTS中的baking(四)blob assets

Unity DOTS中的baking&#xff08;四&#xff09;blob assets blob assets表示不可变的二进制数据&#xff0c;在运行时也不会发生更改。由于blob assets是只读的&#xff0c;这意味着可以安全地并行访问它们。此外&#xff0c;blob assets仅限于使用非托管类型&#xff0c;这意…

C++引用学习day2

思维导图 定义一个矩形类&#xff08;Rectangle&#xff09;&#xff0c;包含私有成员&#xff1a;长(length)、宽&#xff08;width&#xff09;, 定义成员函数&#xff1a; 设置长度&#xff1a;void set_l(int l) 设置宽度&#xff1a;void set_w(int w) 获取长度&#…

STL和泛型编程

STL和泛型编程 一.STL六大部件"前开后闭"区间 二.容器(1)顺序容器1.array源码剖析 2.vector源码剖析vector的迭代器 3.list源码剖析迭代器的设计规则关于重载操作符关于重载->和*操作符 4.forward_list源码剖析 5.deque源码剖析底层数据结构操作实现deque的设计de…

设置定时闹钟,语音播报

widget.h #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include<QTime>//时间类 #include<QtTextToSpeech>//文本转语音类 QT_BEGIN_NAMESPACE namespace Ui { class Widget; } QT_END_NAMESPACEclass Widget : public QWidget {Q_OBJECTpublic:W…

【MATLAB源码-第13期】基于matlab的4ASK的误码率BER和误符号率SER理论和实际对比仿真。

操作环境&#xff1a; MATLAB 2022a 1、算法描述 "4ASK" 是一种数字调制技术&#xff0c;代表4级振幅移移键控&#xff08;4-Level Amplitude Shift Keying&#xff09;调制。它是一种数字通信中常用的调制方式之一&#xff0c;用于将数字信号转换为模拟信号以便传…

分享全栈开发医疗小程序 -带源码课件(课件无解压密码),自行速度保存

课程介绍 分享全栈开发医疗小程序 -带源码课件&#xff08;课件无解压密码&#xff09;&#xff0c;自行速度保存&#xff01;看到好多坛友都在求SpringBoot2.X Vue UniAPP&#xff0c;全栈开发医疗小程序 - 带源码课件&#xff0c;我看了一下&#xff0c;要么链接过期&…

GPT2从放弃到入门(四)

引言 体验地址&#xff1a;https://huggingface.co/spaces/greyfoss/gpt2-chatbot 上篇文章我们通过Gradio作为前端轻松地连接到训练好的Chatbot&#xff0c;本文介绍如何分享你创建好的模型给你的朋友。 当你训练好的模型推送到Huggingface Hub上后&#xff0c;其实还可以进一…

大数据Hadoop生态圈体系视频课程

课程介绍 熟悉大数据概念&#xff0c;明确大数据职位都有哪些&#xff1b;熟悉Hadoop生态系统都有哪些组件&#xff1b;学习Hadoop生态环境架构&#xff0c;了解分布式集群优势&#xff1b;动手操作Hbase的例子&#xff0c;成功部署伪分布式集群&#xff1b;动手Hadoop安装和配…

codeforces div4 Double Strings

#include<iostream> #include<algorithm> #include<cstring> #include<map> using namespace std; int T, n; string s[900005]; map<string, int>mm;//存放每一个字符串是否出现过 int main() {cin >> T;while (T--){mm.clear();//每次清…

服务端测试开发必备技能:Mock测试

什么是mock测试 Mock 测试就是在测试活动中&#xff0c;对于某些不容易构造或者不容易获取的数据/场景&#xff0c;用一个Mock对象来创建以便测试的测试方法。 Mock测试常见场景 无法控制第三方系统接口的返回&#xff0c;返回的数据不满足要求依赖的接口还未开发完成&#…

linux 离线安装 dotnet tool

1. 在官网下载对应的nuget包,比如: dotnet-dump NuGet Gallery | dotnet-dump 3.1.57502 注意文件名称: dotnet-dump.3.1.57502.nupkg 我犯了一个错误,下载比较慢,然后通过迅雷来下载,结果没有后缀名称. 2. 然后拷贝到linux上,比如: 拷贝到dp文件夹下, 在dp文件夹上级执行命…

mfc140.dll丢失的解决方法,快速修复win10系统dll问题

在Windows 10操作系统环境下&#xff0c;如果发现系统中关键的动态链接库文件mfc140.dll丢失&#xff0c;可能会引发一系列运行问题。mfc140.dll是Microsoft Foundation Class Library&#xff08;微软基础类库&#xff09;的重要组成部分&#xff0c;对于许多基于该库开发的应…