我正在使用EFL库开发Tizen Native表盘。创建许多对象后:
Evas_Object *view_create_parts(Evas_Object *parent, const char *image_path,
int position_x, int position_y, int size_w, int size_h) {
Evas_Object *parts = NULL;
parts = elm_image_add(parent);
elm_image_file_set(parts, image_path, NULL);
evas_object_move(parts, position_x, position_y);
evas_object_resize(parts, size_w, size_h);
evas_object_show(parts);
return parts;
}
我想稍后根据需要更改一些现有对象的图像。这可能吗?我知道我还可以将所有可能的变体加载为单个对象,并相应地显示/隐藏对象。但我发现改变现有对象的图像更简单、更优雅。另外,这可能也会使用更少的资源。
我试图这样做:
elm_image_file_set(<part_I_want_to_change_its_image>, "images/newimage.png", NULL));
但是,对象不会更改为正确的图像,而是消失了。有什么想法吗?
是的,elm_image支持图像转换。 但是普通图像包含在容器小部件中或用作布局的一个区域,但在您的示例中,它似乎是画布上孤立和绘制的图像。
在这种情况下,如果更改了图像文件,则旧的几何图形将毫无意义,因此您需要设置新的几何图形值。 调用后执行以下操作elm_image_file_set。
evas_object_move(parts, position_x, position_y);
evas_object_resize(parts, size_w, size_h);
为了让有人能够跟随,我正在其中一个样品"计时表"上进行测试。在文件视图中.c中,有函数view_chronograph_create_parts()
。在这里,我所做的只是将代码从:
case PARTS_TYPE_HANDS_HOUR:
s_info.hand_hour = part; // at this point, the image is already set
break;
自:
case PARTS_TYPE_HANDS_HOUR:
s_info.hand_hour = part; // at this point, the image is already set
elm_image_file_set(s_info.hand_hour, "images/chrono_hand_min.png", NULL);
// I tried these two lines as well, but no change
evas_object_move(s_info.hand_hour, 166, 0);
evas_object_resize(s_info.hand_hour, 28, 360);
break;
这个想法是在最初设置小时针后更改时针的图像,以查看elm_image_file_set()
是否成功更改图像。但我得到的只是时针根本看不见。
我终于发现我做错了什么。我不知道图像路径必须如何形成。非工作方法:
elm_image_file_set(s_info.hand_hour, "images/new_image.png", NULL);
工作方法:
char image_path[PATH_MAX] = { 0, };
data_get_resource_path("images/new_image.png", image_path, sizeof(image_path));
elm_image_file_set(s_info.hand_hour, image_path, NULL);