awtk/docs/faq.md
2019-05-30 09:25:26 +08:00

115 lines
3.8 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# FAQ
#### 1.return\_value\_if\_fail作为AWTK中使用率排第一的宏它的功能、优点和注意事项都有哪些
**功能**
* 主要用于对函数的参数或函数的返回值进行检查(这是防御性编程的手段之一)。
> return\_value\_if\_fail这个宏并非是AWTK原创而是从GTK+(或者说glib)里拿来的。
**优点**
* 以简洁的方式对函数的参数或函数的返回值进行检查。
* Release模式和Debug模式可以做不同的处理。
> 在参数出现错误时悄无声息的返回一个错误码其实是对调用者的纵容很容易把错误隐藏起来。所以在Debug模式我们可以打出一条警告信息甚至直接assert掉这对于定位BUG非常有效。
**注意事项**
* 内部函数(static)一般不需要对参数进行检查。
* 只对异常的情况进行判断,对于正常的失败或无效参数,请不要使用本宏。
* 如果在返回之前有资源需要释放请不要用本宏。可以用goto\_error\_if\_fail跳到error出释放资源后再返回。
---
#### 2.每次在绘制图片前都要调用image\_manager\_load去加载图片这样做会不会很慢有什么优点
* 不会慢。因为image\_manager中有缓存不会每次都去解码。
**优点**
* 缓存有助于多个控件共享同一张图片。
* 外面不保存对bitmap的引用缓存管理更加灵活。比如可以清除最近没有被渲染的图片(即使某个隐藏的窗口还在使用该图片)。
---
#### 3.使用矢量字体,速度会慢吗?
* 几乎没有影响。因为有缓存,所以只需要渲染一次,之后和位图字体的并无不同。
---
#### 4.在16位LCD上显示PNG图片效果很差有什么办法吗
* 如果是不透明的图片可以将PNG转换成JPG文件转换过程中启用dithering算法做平滑处理。
可以用imagemagic转换
```
convert bg.png -ordered-dither o8x8,32,64,32 bg.jpg
```
> 参考http://www.imagemagick.org/Usage/quantize/
#### 5.在Windows平台SVG显示不正常如何解决
原因是Windows下OpenGL不支持非凸多边形所以要解决这个问题需要使用不同的NANOVG\_BACKEND。这可以在SConstruct文件中修改。如
```
#NANOVG_BACKEND='GL3'
#NANOVG_BACKEND='GLES2'
#NANOVG_BACKEND='GLES3'
#NANOVG_BACKEND='AGG'
#NANOVG_BACKEND='AGGE'
NANOVG_BACKEND='BGFX'
```
在PC上BGFX是推荐的NANOVG\_BACKEND但是需要进入3rd/bgfx目录手工下载bgfx相关源码
```
cd 3rd/bgfx
git clone https://github.com/bkaradzic/bx.git
git clone https://github.com/bkaradzic/bimg.git
git clone https://github.com/bkaradzic/bgfx.git
```
> 如果您不需要使用SVG仍然可以使用GL3作为NANOVG\_BACKEND。
#### 6.Ubuntu 14上无法启动有什么办法吗
Ubuntu 14上的OpenGL有问题请使用AGGE软件渲染。修改awtk_config.py
```
NANOVG_BACKEND='AGGE'
```
#### 7.如何实现半透明效果
* 在style中使用rgba格式可以指定半透明填充颜色。如
```xml
<normal bg_color="rgba(200,200,200,0.1)" />
```
* 图片半透明。在制作图片时使用PNG格式保留alpha通道。
* 整个控件(包括子控件)半透明。可以使用函数widget\_set\_opacity设置不透明度。
```c
/**
* @method widget_set_opacity
* 设置控件的不透明度。
*
*>在嵌入式平台,半透明效果会使性能大幅下降,请谨慎使用。
*
* @param {widget_t*} widget 控件对象。
* @param {uint8_t} opacity 不透明度(取值0-2550表示完全透明255表示完全不透明)。
*
* @return {ret_t} 返回RET_OK表示成功否则表示失败。
*/
ret_t widget_set_opacity(widget_t* widget, uint8_t opacity);
```
> opacity会影响包括字体在内的全部元素通常只适用于实现淡入淡出的动态效果。