Изображение, плавающее над другим - PullRequest
1 голос
/ 03 марта 2011

Я хочу иметь возможность динамически размещать изображения поверх другого изображения в моем приложении, используя функции Cairo или GTK.Представьте, например, море, в которое пользователь кладет рыбу и морских животных: это будет так.

Как я могу это сделать?Если вы не знаете, но помните какую-либо простую программу или демонстрацию, которая делает это, это также будет очень кстати!

Спасибо!

Ответы [ 4 ]

2 голосов
/ 16 марта 2011

Вы можете использовать GtkDrawingArea и рисовать на нем изображения, используя Каир :

Пример:

#include <cairo.h>
#include <gtk/gtk.h>

cairo_surface_t * sea_surface;
cairo_surface_t * fish_surface;

gboolean on_expose_event(GtkWidget * widget, GdkEventExpose * event, gpointer data) {
    // Create the cairo instance.
    cairo_t * cr = gdk_cairo_create(widget->window);
    // Draw the sea background.
    cairo_set_source_surface(cr, sea_surface, 0.0, 0.0);
    cairo_paint(cr);
    // Draw the fish.
    cairo_set_source_surface(cr, fish_surface, 50.0, 50.0);
    cairo_paint(cr);
    // Destroy the cairo instance.
    cairo_destroy(cr);
    return FALSE;
}

int main(int argc, char * argv[]) {
    gtk_init(&argc, &argv);

    // Load images.
    sea_surface = cairo_image_surface_create_from_png("sea.png");
    fish_surface = cairo_image_surface_create_from_png("fish.png");

    // Create window.
    GtkWidget * window;
    window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
    g_signal_connect(G_OBJECT(window), "destroy", G_CALLBACK(gtk_main_quit), NULL);
    gtk_window_set_default_size(GTK_WINDOW(window), 320, 240);  

    // Create drawing area where we're going to draw our images.
    GtkWidget * drawing_area = gtk_drawing_area_new();
    g_signal_connect(G_OBJECT(drawing_area), "expose-event", G_CALLBACK(on_expose_event), NULL);
    gtk_container_add(GTK_CONTAINER(window), drawing_area);

    // Show window and start gtk main loop.
    gtk_widget_show_all(window);
    gtk_main();

    // Clean-up.
    cairo_surface_destroy(fish_surface);
    cairo_surface_destroy(sea_surface);
    return 0;
}

Чтобы скомпилировать его наИспользование Linux:

gcc -Wall -g images.c -o images `pkg-config --cflags --libs gtk+-2.0`

Документация:

Примеры:


РЕДАКТИРОВАТЬ: Если вам нужно иметь возможностьсделать это из Java, вы можете использовать java-gnome , который обеспечивает привязки для GTK и cairo .

1 голос
/ 16 марта 2011

Вы также можете использовать GtkDrawingArea с Gdk примитивами для рисования

1 голос
/ 03 марта 2011

Я бы использовал беспорядок , для деталей используйте примеры беспорядка, они довольно хороши.

Редактировать:

Если вы не можетеиспользуйте беспорядок, вы можете взглянуть на cairo , который также имеет несколько интересных примеров на данной домашней странице

0 голосов
/ 18 марта 2011

Лучший способ сделать это - использовать холст типа goocanvas , который предназначен для работы с GTK и рисования с помощью cairo.Однако, похоже, что в настоящее время он имеет привязки только для C ++ и python, поэтому, если вы используете Java, вам придется найти что-то еще ...

...