您当前的位置: 首页 >  华为

LVGL使用华为鸿蒙字体

发布时间:2021-06-20 18:53:46 ,浏览量:7

转换工具下载
  • 链接: 工具下载 提取码:kzlc
华为鸿蒙字体

字体下载

打开工具生成外部汉字bin文件,这里选择鸿蒙黑体HarmonyOS_Sans_SC_Black.ttf

在这里插入图片描述

加入所有汉字及ascii字符

在这里插入图片描述

转换生成MyFont.c和MyFont.bin两个文件,将MyFont.c文件加入到工程中,实现__user_font_getdata的文件读取驱动
static uint8_t __g_font_buf[364];//如bin文件存在SPI FLASH可使用此buff static uint8_t *__user_font_getdata(int offset, int size){ //如字模保存在SPI FLASH, SPIFLASH_Read(__g_font_buf,offset,size); //如字模已加载到SDRAM,直接返回偏移地址即可如:return (uint8_t*)(sdram_fontddr+offset); lv_fs_file_t file; lv_fs_res_t result; result = lv_fs_open(&file, "P:/test/myFont.bin", LV_FS_MODE_RD); if (result != LV_FS_RES_OK) return NULL; lv_fs_seek(&file, offset); uint32_t len; lv_fs_read(&file, __g_font_buf, size, &len); lv_fs_close(&file); return __g_font_buf; } 
lvgl文件系统驱动匹配
/**
 * @file lv_tutorial_images.h
 *
 */ /*
 * -------------------------------------------------------------------------------------------
 * Learn how to use images stored internally (in a variable) or externally (e.g. on an SD card)
 *-------------------------------------------------------------------------------------------
 *
 *
 * The basic object to display images is 'lv_img'. The displayed image is called 'image source'.
 *
 * IMAGE SOURCES
 * -----------------
 *
 * 1. IMAGE CONVETED TO C ARRAY
 *  With the online image converter tool you can convert your images into C arrays:
 *  https://littlevgl.com/image-to-c-array
 *
 *  If you have the converted file:
 *    - Copy the result C file into your project
 *    - Declare the image variable with 'LV_IMG_DECLARE(image_name);'
 *    - Set it for an image object: 'lv_img_set_src(img1, &image_name);'
 *
 *  In this case you don't need to think about color format because
 *  all color formats are included in the C file and the currently active
 *  (according to 'LV_COLOR_DEPTH' in 'lv_conf.h') will be enabled.
 *
 * 2. IMAGE FROM FILE
 *  With the above mentioned online image converter tool you can convert images to binary files too.
 *  Now you should choose the right color format.
 *  The result of the conversion should be a *.bin file which can be copied to any external device (e.g. SD card)
 *
 *  To read this file you need to provide some functions for LittlevGL. You will see it in the example below.
 *
 *  To set a file for an image object use: 'lv_img_set_src(img, "S:path/to/image.bin")'
 *
 * 3. IMAGE FROM SYMBOL FONT
 *  The symbol fonts are letters however they look like small images.
 *  To set symbols for an image object use: 'lv_img_set_src(img, LV_SYMBOL_CLOSE)'
 *
 * TRANSPARENCY
 * ---------------
 *
 * The images have 2 features related to pixel level transparency:
 *
 * 1. CHROMA KEYING
 *  The LV_COLOR_TRANSP (lv_conf.h) pixels will be transparent.
 *  This feature can be enabled individually in the images in the online image converter tool.
 *  Because Chroma keying can only show/hide a pixel edges on the image might be jagged.
 *  On the other hand it dosn't mean extra memory usage.
 *
 * 2. ALHPA BYTE
 *  It will add an extra byte to every pixel to show its opacity.
 *  This feature also can be enabled in the online converter tool.
 *  In case of 8 and 16 bit images it means extra 8 bit for every pixel.
 *  The 24 bit images are stored on 32 bit independently from Alpha byte settings.
 *  Alpha byte results very smooth edges and high quality images.
 */ /*********************
 *      INCLUDES
 *********************/ #include "lv_tutorial_images.h" #if LV_USE_TUTORIALS #include "lvgl/lvgl.h" #include  #include  /*********************
 *      DEFINES
 *********************/ #define PC_FILES    1 /*If you are on PC you can add PC file function to 'lv_fs'*/ /**********************
 *      TYPEDEFS
 **********************/ typedef FILE * pc_file_t; /**********************
 *  STATIC PROTOTYPES
 **********************/ #if PC_FILES && LV_USE_FILESYSTEM /*Interface functions to standard C file functions (only the required ones to image handling)*/ static lv_fs_res_t pcfs_open(lv_fs_drv_t * drv, void * file_p, const char * fn, lv_fs_mode_t mode); static lv_fs_res_t pcfs_close(lv_fs_drv_t * drv, void * file_p); static lv_fs_res_t pcfs_read(lv_fs_drv_t * drv, void * file_p, void * buf, uint32_t btr, uint32_t * br); static lv_fs_res_t pcfs_seek(lv_fs_drv_t * drv, void * file_p, uint32_t pos); static lv_fs_res_t pcfs_tell(lv_fs_drv_t * drv, void * file_p, uint32_t * pos_p); static lv_fs_res_t pcfs_size(struct _lv_fs_drv_t* drv, void* file_p, uint32_t* size_p); static lv_fs_res_t pcfs_write(struct _lv_fs_drv_t* drv, void* file_p, const void* buf, uint32_t btw, uint32_t* bw); #endif /**********************
 *  STATIC VARIABLES
 **********************/ /*Declare the "source code image" which is stored in the flash*/ LV_IMG_DECLARE(red_flower) LV_IMG_DECLARE(red_rose_16); LV_IMG_DECLARE(flower_icon_alpha); /**********************
 *      MACROS
 **********************/ /**********************
 *   GLOBAL FUNCTIONS
 **********************/ void init_fs_config(void) { lv_fs_drv_t pcfs_drv; /*A driver descriptor*/ memset(&pcfs_drv, 0, sizeof(lv_fs_drv_t)); /*Initialization*/ pcfs_drv.file_size = sizeof(pc_file_t); /*Set up fields...*/ pcfs_drv.letter = 'P'; pcfs_drv.write_cb = pcfs_write; pcfs_drv.open_cb = pcfs_open; pcfs_drv.close_cb = pcfs_close; pcfs_drv.read_cb = pcfs_read; pcfs_drv.seek_cb = pcfs_seek; pcfs_drv.tell_cb = pcfs_tell; pcfs_drv.size_cb = pcfs_size; lv_fs_drv_register(&pcfs_drv); } /**
 * Create images from variable and file
 */ void lv_tutorial_image(void) { lv_obj_t * scr = lv_disp_get_scr_act(NULL); /*Get the current screen*/ /*************************
     * IMAGE FROM SOURCE CODE
     *************************/ #if 0 lv_obj_t * img_var = lv_img_create(scr, NULL); /*Crate an image object*/ lv_img_set_src(img_var, &red_flower); /*Set the created file as image (a red flower)*/ lv_obj_set_pos(img_var, 10, 10); /*Set the positions*/ lv_obj_set_drag(img_var, true); img_var = lv_img_create(scr, NULL); /*Crate an image object*/ lv_img_set_src(img_var, &red_rose_16); /*Set the created file as image (a red rose)*/ lv_obj_set_pos(img_var, 10, 100); /*Set the positions*/ lv_obj_set_drag(img_var, true); static lv_style_t style_red; lv_style_copy(&style_red, &lv_style_plain); style_red.image.color = LV_COLOR_RED; img_var = lv_img_create(scr, NULL); /*Crate an image object*/ lv_img_set_src(img_var, &flower_icon_alpha); /*Set the created file as image (a red flower icon)*/ lv_img_set_style(img_var, LV_IMG_STYLE_MAIN, &style_red); lv_obj_set_pos(img_var, 10, 200); /*Set the positions*/ lv_obj_set_drag(img_var, true); #endif #if PC_FILES && LV_USE_FILESYSTEM /**************************
     * IMAGE FROM BINARY FILE
     **************************/ /* Add a simple drive to open images from PC*/ lv_fs_drv_t pcfs_drv; /*A driver descriptor*/ memset(&pcfs_drv, 0, sizeof(lv_fs_drv_t)); /*Initialization*/ pcfs_drv.file_size = sizeof(pc_file_t); /*Set up fields...*/ pcfs_drv.letter = 'P'; pcfs_drv.open_cb = pcfs_open; pcfs_drv.close_cb = pcfs_close; pcfs_drv.read_cb = pcfs_read; pcfs_drv.seek_cb = pcfs_seek; pcfs_drv.tell_cb = pcfs_tell; pcfs_drv.size_cb = pcfs_size; lv_fs_drv_register(&pcfs_drv); //    lv_obj_t * img_bin = lv_img_create(scr, NULL); /*Create an image object*/ /* Set the image's file according to the current color depth
     * a blue flower picture*/ #if LV_COLOR_DEPTH == 8 lv_img_set_src(img_bin, "P:/lv_examples/lv_tutorial/6_images/blue_flower_8.bin"); #elif LV_COLOR_DEPTH == 16 && LV_COLOR_16_SWAP == 0 //lv_img_set_src(img_bin, "P:/lv_examples/lv_tutorial/6_images/blue_flower_16.bin"); #elif LV_COLOR_DEPTH == 16 && LV_COLOR_16_SWAP == 1 //  lv_img_set_src(img_bin, "P:/lv_examples/lv_tutorial/6_images/blue_flower_16_swap.bin"); #elif LV_COLOR_DEPTH == 32 //   lv_img_set_src(img_bin, "P:/lv_examples/lv_tutorial/6_images/blue_flower_32.bin"); #endif //  lv_obj_set_pos(img_bin, 150, 10);     /*Align next to the source image*/ //   lv_obj_set_drag(img_bin, true); lv_obj_t* img_bin = lv_img_create(scr, NULL); /*Crate an image object*/ // lv_img_set_src(img_bin, "P:/lv_examples/lv_tutorial/6_images/blue_rose_16.bin");  /*Set the created file as image (a red rose)*/ lv_img_set_src(img_bin, "P:/watch1.bin"); lv_obj_set_pos(img_bin, 0, 0); /*Set the positions*/ lv_obj_set_drag(img_bin, true); //   static lv_style_t style_blue; //  lv_style_copy(&style_blue, &lv_style_plain); //  style_blue.image.color = LV_COLOR_BLUE; // //  img_bin = lv_img_create(scr, NULL); /*Crate an image object*/ //   lv_img_set_src(img_bin, "P:/lv_examples/lv_tutorial/6_images/flower_icon_alpha.bin");  /*Set the created file as image (a red flower icon)*/ //   lv_img_set_style(img_bin, LV_IMG_STYLE_MAIN, &style_blue); //   lv_obj_set_pos(img_bin, 150, 200);      /*Set the positions*/ //  lv_obj_set_drag(img_bin, true); #endif // lv_obj_t * img_symbol = lv_img_create(scr, NULL); //   lv_img_set_src(img_symbol, LV_SYMBOL_OK); //  lv_obj_set_drag(img_symbol, true); //  lv_obj_set_pos(img_symbol, 300, 10);      /*Set the positions*/ } /**********************
 *   STATIC FUNCTIONS
 **********************/ #if PC_FILES && LV_USE_FILESYSTEM /**
 * Open a file from the PC
 * @param drv pointer to the current driver
 * @param file_p pointer to a FILE* variable
 * @param fn name of the file.
 * @param mode element of 'fs_mode_t' enum or its 'OR' connection (e.g. FS_MODE_WR | FS_MODE_RD)
 * @return LV_FS_RES_OK: no error, the file is opened
 *         any error from lv_fs_res_t enum
 */ static lv_fs_res_t pcfs_open(lv_fs_drv_t * drv, void * file_p, const char * fn, lv_fs_mode_t mode) { (void) drv; /*Unused*/ errno = 0; const char * flags = ""; if(mode == LV_FS_MODE_WR) flags = "wb"; else if(mode == LV_FS_MODE_RD) flags = "rb"; else if(mode == (LV_FS_MODE_WR | LV_FS_MODE_RD)) flags = "a+"; /*Make the path relative to the current directory (the projects root folder)*/ char buf[256]; sprintf(buf, "./%s", fn); pc_file_t f = fopen(buf, flags); if(f == NULL) return LV_FS_RES_UNKNOWN; else { fseek(f, 0, SEEK_SET); /* 'file_p' is pointer to a file descriptor and
         * we need to store our file descriptor here*/ pc_file_t * fp = file_p; /*Just avoid the confusing casings*/ *fp = f; } return LV_FS_RES_OK; } static lv_fs_res_t pcfs_write(struct _lv_fs_drv_t* drv, void* file_p, const void* buf, uint32_t btw, uint32_t* bw) { (void)drv; /*Unused*/ pc_file_t* fp = file_p; /*Just avoid the confusing casings*/ *bw = (uint32_t)fwrite(buf, 1, btw, *fp); return LV_FS_RES_OK; } /**
 * Close an opened file
 * @param drv pointer to the current driver
 * @param file_p pointer to a FILE* variable. (opened with lv_ufs_open)
 * @return LV_FS_RES_OK: no error, the file is read
 *         any error from lv__fs_res_t enum
 */ static lv_fs_res_t pcfs_close(lv_fs_drv_t * drv, void * file_p) { (void) drv; /*Unused*/ pc_file_t * fp = file_p; /*Just avoid the confusing casings*/ fclose(*fp); return LV_FS_RES_OK; } /**
 * Read data from an opened file
 * @param drv pointer to the current driver
 * @param file_p pointer to a FILE variable.
 * @param buf pointer to a memory block where to store the read data
 * @param btr number of Bytes To Read
 * @param br the real number of read bytes (Byte Read)
 * @return LV_FS_RES_OK: no error, the file is read
 *         any error from lv__fs_res_t enum
 */ static lv_fs_res_t pcfs_read(lv_fs_drv_t * drv, void * file_p, void * buf, uint32_t btr, uint32_t * br) { (void) drv; /*Unused*/ pc_file_t * fp = file_p; /*Just avoid the confusing casings*/ *br = (uint32_t)fread(buf, 1, btr, *fp); return LV_FS_RES_OK; } /**
 * Set the read write pointer. Also expand the file size if necessary.
 * @param drv pointer to the current driver
 * @param file_p pointer to a FILE* variable. (opened with lv_ufs_open )
 * @param pos the new position of read write pointer
 * @return LV_FS_RES_OK: no error, the file is read
 *         any error from lv__fs_res_t enum
 */ static lv_fs_res_t pcfs_seek(lv_fs_drv_t * drv, void * file_p, uint32_t pos) { (void) drv; /*Unused*/ pc_file_t * fp = file_p; /*Just avoid the confusing casings*/ fseek(*fp, pos, SEEK_SET); return LV_FS_RES_OK; } /**
 * Give the position of the read write pointer
 * @param drv pointer to the current driver
 * @param file_p pointer to a FILE* variable.
 * @param pos_p pointer to to store the result
 * @return LV_FS_RES_OK: no error, the file is read
 *         any error from lv__fs_res_t enum
 */ static lv_fs_res_t pcfs_tell(lv_fs_drv_t * drv, void * file_p, uint32_t * pos_p) { (void) drv; /*Unused*/ pc_file_t * fp = file_p; /*Just avoid the confusing casings*/ *pos_p = ftell(*fp); return LV_FS_RES_OK; } static lv_fs_res_t pcfs_size(struct _lv_fs_drv_t* drv, void* file_p, uint32_t* size_p) { (void)drv; /*Unused*/ pc_file_t* fp = file_p; /*Just avoid the confusing casings*/ fseek(*fp, 0L, SEEK_END); *size_p = ftell(*fp); fseek(*fp, 0L, SEEK_SET); return LV_FS_RES_OK; } #endif #endif /*LV_USE_TUTORIALS*/ 
鸿蒙字体展示
#pragma execution_character_set("utf-8") LV_FONT_DECLARE(myFont) int main(int argc, char** argv) { /*Initialize LittlevGL*/ lv_init(); init_fs_config(); /*Initialize the HAL for LittlevGL*/ hal_init(); lv_obj_t* scr = lv_scr_act(); lv_obj_t* cont = lv_cont_create(scr, NULL); lv_obj_set_size(cont, LV_HOR_RES_MAX, LV_VER_RES_MAX); lv_obj_t* label = lv_label_create(cont, NULL); lv_obj_align(label, NULL, LV_ALIGN_CENTER, 0, 0); lv_obj_set_auto_realign(label, true); lv_obj_set_style_local_text_font(label, LV_LABEL_PART_MAIN, \
	  LV_STATE_DEFAULT, &myFont); lv_obj_set_style_local_text_color(label, LV_LABEL_PART_MAIN, \
	LV_STATE_DEFAULT, LV_COLOR_MAKE(0XFF,0X00,0XFF)); lv_label_set_text(label, "华为鸿蒙字体!\r\nHuawei Hongmeng font!"); while (1) { /* Periodically call the lv_task handler.
		* It could be done in a timer interrupt or an OS task too.*/ lv_task_handler(); Sleep(10); /*Just to let the system breathe */ } return 0; } 
运行效果图

在这里插入图片描述

关注
打赏
1688896170
查看更多评论

暂无认证

  • 7浏览

    0关注

    105695博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文
立即登录/注册

微信扫码登录

0.0536s