多分辨率 LCD 的 GUI 架構設計與實現

1.1多分辨率顯示系統的挑戰與解決方案

1.1.1 分辨率適配的核心問題

在嵌入式系統中,同時支持不同分辨率的 LCD(如 240×160、320×480 等)面臨以下挑戰:

布局適配:同一界面元素在不同分辨率下需要調整大小和位置

字體顯示:小分辨率屏幕需要更小的字體,而大分辨率需要更清晰的字體

內存占用:高分辨率屏幕需要更多顯存,而低分辨率需要優化內存使用

渲染性能:高分辨率屏幕渲染壓力更大,需要優化渲染算法

針對這些問題, 采用以下解決方案:

抽象顯示接口:定義統一的顯示操作接口,屏蔽底層硬件差異

相對布局系統:使用百分比或相對單位定義界面元素位置和大小

字體動態縮放:根據屏幕分辨率動態調整字體大小

資源按需加載:根據當前屏幕分辨率選擇合適的圖片和字體資源

1.1.2 單色屏與彩屏的兼容性設計

同時支持單色屏和彩屏時,需要解決以下問題:

顏色表示:單色屏只有黑白兩色,而彩屏支持多種顏色

圖形渲染:彩屏支持漸變、陰影等復雜效果,單色屏需要簡化

交互反饋:彩屏可通過顏色變化提供反饋,單色屏需依賴對比度或閃爍

解決方案包括:

顏色抽象層:定義顏色映射表,將 RGB 顏色映射到單色屏的黑白值

渲染策略分離:為單色屏和彩屏分別實現不同的渲染算法

交互反饋統一:使用統一的交互反饋接口,底層根據屏幕類型實現

1.2 統一顯示抽象層設計

1.2.1 顯示接口定義

我們首先定義一個抽象的顯示接口,屏蔽不同分辨率和類型的 LCD 差異:

c

/**

 * 顯示抽象層接口定義

 * 支持不同分辨率和類型的LCD

 */

#ifndef DISPLAY_ABSTRACTION_H

#define DISPLAY_ABSTRACTION_H

#include <stdint.h>

#include <stdbool.h>

/* 顏色定義 - 采用RGB565格式 */

typedef uint16_t color_t;

/* 標準顏色常量 */

#define COLOR_BLACK       0x0000

#define COLOR_WHITE       0xFFFF

#define COLOR_RED         0xF800

#define COLOR_GREEN       0x07E0

#define COLOR_BLUE        0x001F

#define COLOR_YELLOW      0xFFE0

#define COLOR_CYAN        0x07FF

#define COLOR_MAGENTA     0xF81F

/* 顯示區域結構體 */

typedef struct

{

    uint16_t x;

    uint16_t y;

    uint16_t width;

    uint16_t height;

} rect_t;

/* 顯示設備能力結構體 */

typedef struct

{

    uint16_t width;              /* 屏幕寬度 */

    uint16_t height;             /* 屏幕高度 */

    uint8_t bits_per_pixel;      /* 每像素位數 */

    bool color_support;          /* 是否支持彩色 */

    uint16_t max_font_size;      /* 最大支持字體大小 */

    uint16_t min_font_size;      /* 最小支持字體大小 */

} display_capabilities_t;

/* 顯示接口函數指針結構體 */

typedef struct

{

    /* 基本操作 */

    void (*init)(void);

    void (*clear)(color_t color);

    void (*refresh)(void);

   

    /* 繪制基本圖形 */

    void (*draw_pixel)(uint16_t x, uint16_t y, color_t color);

    void (*draw_line)(uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2, color_t color);

    void (*draw_rect)(uint16_t x, uint16_t y, uint16_t width, uint16_t height, color_t color);

    void (*fill_rect)(uint16_t x, uint16_t y, uint16_t width, uint16_t height, color_t color);

    void (*draw_circle)(uint16_t x, uint16_t y, uint16_t radius, color_t color);

    void (*fill_circle)(uint16_t x, uint16_t y, uint16_t radius, color_t color);

   

    /* 文本繪制 */

    void (*set_font_size)(uint8_t size);

    void (*set_text_color)(color_t color, color_t background);

    void (*draw_char)(uint16_t x, uint16_t y, char c);

    void (*draw_string)(uint16_t x, uint16_t y, const char* str);

   

    /* 圖像繪制 */

    void (*draw_image)(uint16_t x, uint16_t y, uint16_t width, uint16_t height, const uint16_t* data);

   

    /* 獲取顯示能力 */

    void (*get_capabilities)(display_capabilities_t* caps);

} display_interface_t;

/* 獲取當前顯示接口實例 */

display_interface_t* get_display_interface(void);

/* 設置當前顯示接口實例 */

void set_display_interface(display_interface_t* display);

#endif /* DISPLAY_ABSTRACTION_H */

1.2.2 顯示接口實現

下面是顯示接口的基礎實現,提供了統一的操作入口:

/**

 * 顯示抽象層實現

 */

#include "display_abstraction.h"

/* 當前顯示接口實例 */

static display_interface_t* current_display = NULL;

/* 獲取當前顯示接口實例 */

display_interface_t* get_display_interface(void)

{

    return current_display;

}

/* 設置當前顯示接口實例 */

void set_display_interface(display_interface_t* display)

{

    current_display = display;

}

/* 通用繪制函數 - 使用當前顯示接口 */

void display_clear(color_t color)

{

    if (current_display && current_display->clear)

    {

        current_display->clear(color);

    }

}

void display_refresh(void)

{

    if (current_display && current_display->refresh)

    {

        current_display->refresh();

    }

}

void display_draw_pixel(uint16_t x, uint16_t y, color_t color)

{

    if (current_display && current_display->draw_pixel)

    {

        current_display->draw_pixel(x, y, color);

    }

}

// 其他通用繪制函數實現...

1.3 相對布局系統設計

1.3.1 布局管理器設計

為了實現跨分辨率的 GUI 適配,我們設計一個相對布局管理器:


 

/**

 * 相對布局管理器

 * 支持基于百分比的界面元素布局

 */

#ifndef LAYOUT_MANAGER_H

#define LAYOUT_MANAGER_H

#include "display_abstraction.h"

/* 對齊方式枚舉 */

typedef enum

{

    ALIGN_LEFT,

    ALIGN_CENTER,

    ALIGN_RIGHT,

    ALIGN_TOP,

    ALIGN_MIDDLE,

    ALIGN_BOTTOM

} alignment_t;

/* 相對位置結構體 */

typedef struct

{

    float x_percent;     /* X坐標百分比 (0.0-1.0) */

    float y_percent;     /* Y坐標百分比 (0.0-1.0) */

    float width_percent; /* 寬度百分比 (0.0-1.0) */

    float height_percent; /* 高度百分比 (0.0-1.0) */

    alignment_t h_align; /* 水平對齊方式 */

    alignment_t v_align; /* 垂直對齊方式 */

} relative_position_t;

/* GUI元素基類 */

typedef struct gui_element

{

    char* id;                      /* 元素ID */

    relative_position_t position;  /* 相對位置 */

    bool visible;                  /* 是否可見 */

   

    /* 繪制函數 */

    void (*draw)(struct gui_element* element);

   

    /* 事件處理函數 */

    bool (*handle_event)(struct gui_element* element, void* event);

   

    /* 布局計算函數 */

    void (*calculate_layout)(struct gui_element* element, rect_t* parent_rect);

   

    /* 實際屏幕位置 */

    rect_t screen_rect;

   

    /* 指向下一個元素的指針 */

    struct gui_element* next;

} gui_element_t;

/* 布局管理器 */

typedef struct

{

    gui_element_t* elements;       /* 元素鏈表 */

    display_interface_t* display;  /* 顯示接口 */

    rect_t root_rect;              /* 根區域 */

} layout_manager_t;

/* 初始化布局管理器 */

void layout_manager_init(layout_manager_t* manager, display_interface_t* display);

/* 添加GUI元素 */

void layout_manager_add_element(layout_manager_t* manager, gui_element_t* element);

/* 移除GUI元素 */

void layout_manager_remove_element(layout_manager_t* manager, gui_element_t*

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/83639.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/83639.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/83639.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

11. MySQL事務管理(上)

1. CURD不加控制&#xff0c;會有什么問題&#xff1f; 火車票售票系統tickets表 id name nums 10 西安<->蘭州 1 客戶端A 客戶端B if (nums > 0) { if (nums > 0) { 賣票 賣票 // update numsnums - 1 update numsnums - 1 } } 當客戶端A檢查還有一張票時&#xf…

Beta分布Dirichlet分布

目錄 Beta分布Dirichlet分布Beta分布&Dirichlet分布從Dirichlet分布生成Beta樣本Beta分布&Dirichlet分布應用 Beta分布 Beta分布是定義在區間 [ 0 , 1 ] [0, 1] [0,1]上的連續概率分布&#xff0c;通常用于模擬概率或比例的隨機變量。Beta分布的概率密度函數&#xff…

嵌入式系統中常用的開源協議

目錄 1、GNU通用公共許可證&#xff08;GPL&#xff09; 2、GNU寬松通用公共許可證&#xff08;LGPL&#xff09; 3、MIT許可證 4、Apache許可證2.0 5、BSD許可證 6、如何選擇合適的協議 在嵌入式系統開發中&#xff0c;開源軟件的使用已成為主流趨勢。從物聯網設備到汽車…

告別延遲,擁抱速度:存儲加速仿真應用的解決方案【1】

需求分析 現代仿真&#xff08;如CFD流體動力學、FEA結構分析、電磁仿真、氣候模擬、自動駕駛場景仿真、芯片設計等&#xff09;會產生PB級甚至EB級的數據。海量數據的生成、處理和存儲&#xff0c;主要體現在以下幾個關鍵方面&#xff1a; 數據量爆炸式增長&#xff1a;高分…

vue封裝gsap自定義動畫指令

1、指令文件封裝 import { gsap } from gsap;// 動畫類型配置 const ANIMATION_TYPES {// 縮放scale: {from: { scale: 0.5, opacity: 0 },to: { scale: 1, opacity: 1 },hide: { scale: 0.5, opacity: 0 },},// 透明度fade: {from: { opacity: 0 },to: { opacity: 1, ease: …

HTTP 如何升級成 HTTPS

有一個自己的項目需要上線&#xff0c;域名解析完成后&#xff0c;發現只能使用 http 協議&#xff0c;這在瀏覽器上會限制&#xff0c;提示用戶不安全&#xff0c;所以需要把 HTTP 升級成 HTTPS 協議&#xff0c;但又不想花錢。 前提條件&#xff1a; 已經配置好 Nginx 服務器…

測試面試題總結一

目錄 列表、元組、字典的區別 nvicat連接出現問題如何排查 mysql性能調優 python連接mysql數據庫方法 參數化 pytest.mark.parametrize 裝飾器 list1 [1,7,4,5,5,6] for i in range(len(list1): assert list1[i] < list1[i1] 這段程序有問題嘛&#xff1f; pytest.i…

[藍橋杯]密文搜索

密文搜索 題目描述 福爾摩斯從 X 星收到一份資料&#xff0c;全部是小寫字母組成。 他的助手提供了另一份資料&#xff1a;許多長度為 8 的密碼列表。 福爾摩斯發現&#xff0c;這些密碼是被打亂后隱藏在先前那份資料中的。 請你編寫一個程序&#xff0c;從第一份資料中搜…

打卡第36天:模型可視化以及推理

知識點回顧&#xff1a; 1.三種不同的模型可視化方法&#xff1a;推薦torchinfo打印summary權重分布可視化 2.進度條功能&#xff1a;手動和自動寫法&#xff0c;讓打印結果更加美觀 3.推理的寫法&#xff1a;評估模式 作業&#xff1a;調整模型定義時的超參數&#xff0c;對…

8天Python從入門到精通【itheima】-68(元組)

目錄 65節——元組的定義和操作 1.學習目標 2.為什么要學習元組 3.元組的定義 4.定義元組的注意事項 5.元組的嵌套 6.元組的相關操作 【1】index方法 【2】count方法 【3】len方法 7.元組的遍歷 【1】while循環進行元組的遍歷 【2】for循環進行元組的變量 Python …

鏈表題解——環形鏈表【LeetCode】

141. 環形鏈表 方法一 核心思想&#xff1a; 使用一個集合 seen 來記錄已經訪問過的節點。遍歷鏈表&#xff0c;如果當前節點已經存在于集合中&#xff0c;說明鏈表存在環&#xff1b;否則&#xff0c;將當前節點添加到集合中&#xff0c;繼續遍歷。如果遍歷結束&#xff08;h…

【免費數據】1980-2022年中國2384個站點的水質數據

水&#xff0c;是生命之源&#xff0c;關乎著地球上每一個生物的生存與發展。健康的水生生態系統維持著整個水生態的平衡與活力&#xff1b;更是確保人類能持續獲得清潔水源的重要保障。水質數據在水質研究、海洋生物量測算以及生物多樣性評估等諸多關鍵領域都扮演著舉足輕重的…

分享推薦高精度磁阻式磁編碼器芯片

磁編碼器其通過感應旋轉磁場來實現角度、轉速的測量&#xff0c;因此&#xff0c;相較于傳統的光編碼器&#xff0c;磁編碼器對粉塵、污垢和油脂等污染物有很強的耐受性&#xff0c;即使在較為惡劣的環境中仍能夠保持高分辨率與檢測精度&#xff0c;安裝和維護簡捷方便&#xf…

Spring AI 項目實戰(四):Spring Boot + AI + DeepSeek 超參數優化——智能化機器學習平臺(附完整源碼)

系列文章 序號文章名稱1Spring AI 項目實戰&#xff08;一&#xff09;&#xff1a;Spring AI 核心模塊入門2Spring AI 項目實戰&#xff08;二&#xff09;&#xff1a;Spring Boot AI DeepSeek 深度實戰&#xff08;附完整源碼&#xff09;3Spring AI 項目實戰&#xff08…

高效VLM:VisionZip

論文&#xff1a;[2412.04467] VisionZip: Longer is Better but Not Necessary in Vision Language Models github&#xff1a;https://github.com/dvlab-research/VisionZip LLaVA論文&#xff1a;https://arxiv.org/abs/2310.03744 LLaVA倉庫&#xff1a;https://github.…

華為設備OSPF配置與實戰指南

一、基礎配置架構 sysname HUAWEI-ABR ospf 100 router-id 1.1.1.1area 0.0.0.0network 10.1.1.0 0.0.0.255 # 將接口加入區域0 interface GigabitEthernet0/0/1ospf enable 100 area 0.0.0.0 # 華為支持點分十進制區域號bandwidth-reference 10000 # 設置10Gbps參考帶寬…

區塊鏈架構深度解析:從 Genesis Block 到 Layer 2

# 區塊鏈架構深度解析&#xff1a;從 Genesis Block 到 Layer 2 目錄 一、Genesis Block&#xff1a;區塊鏈的起點 二、Layer 0&#xff1a;區塊鏈的底層網絡架構 三、Layer 1&#xff1a;核心協議層 &#x1f680; 四、Layer 2&#xff1a;擴展性解決方案 五、未來展望&a…

【位運算】丟失的數字(easy)

34. 丟失的數字&#xff08;easy&#xff09; 題?描述&#xff1a;方法一&#xff1a;排序解法&#xff08;位運算&#xff09;&#xff1a;C 算法代碼&#xff1a;Java 算法代碼&#xff1a; 題?鏈接&#xff1a; 268. 丟失的數字 題?描述&#xff1a; 給定?個包含 [0, n…

如何通過RL真正提升大模型的推理能力?NVIDIA提出長期強化學習訓練框架ProRL

原文&#xff1a;https://mp.weixin.qq.com/s/QLFKvb8Ol3CX9uWKBXSrow 論文&#xff1a;ProRL: Prolonged Reinforcement Learning Expands Reasoning Boundaries in Large Language Models Abs&#xff1a;https://arxiv.org/abs/2505.24864 權重下載&#xff1a;https://hugg…

ORM 框架的優缺點分析

ORM 框架的優缺點分析 一、ORM 框架概述 ORM(Object-Relational Mapping)是一種將關系型數據庫與面向對象編程進行映射的技術框架。它通過將數據庫表映射為編程語言中的類,將記錄映射為對象,將字段映射為屬性,實現了用面向對象的方式操作數據庫。 核心價值:ORM 在數據庫和…