我可以更改现有 Evas_Object 的图像文件吗?

Can I change the image file of an existing Evas_Object?

我正在使用 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;
}

我想稍后根据需要更改一些现有对象的图像。这可能吗?我知道我还可以将所有可能的变体作为单个对象加载,并相应地 show/hide 对象。但我发现仅更改现有对象的图像更简单、更优雅。另外,这也可能使用更少的资源。

我试过这样做:

elm_image_file_set(<part_I_want_to_change_its_image>, "images/newimage.png", NULL));

但是对象并没有变成正确的图像,而是直接消失了。有什么想法吗?

是的,elm_image支持图片转换。 但是普通图像包含在容器小部件中或作为布局的一个区域,但在您的示例中,它似乎是 canvas.

上的孤立和绘制图像

在这种情况下,如果更改了图像文件,旧的几何图形就没有意义了,因此需要设置一个新的几何图形值。在调用 elm_image_file_set 后执行以下操作。

evas_object_move(parts, position_x, position_y);
evas_object_resize(parts, size_w, size_h);

为了让其他人能够理解,我正在对包含的示例之一 "Chronograph Watch" 进行测试。在文件 view.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);