linux - GTK 窗口运动动画?

标签 linux animation gtk

我想在屏幕上自动移动我的 GTK_WINDOW。目前我把它放在绘图/移动循环中,但这非常不稳定。我对 GTK 编程(以及一般的 gui 编程)非常陌生。我错过了什么?

最佳答案

您还没有说明您希望窗口遵循哪种路径。如果路径是一些简单的时间函数——也就是说,如果您有办法计算在任何给定时间您希望窗口所在的位置——您可以尝试以下代码中说明的方法。对于示例中非常简单的菜单,它在我的 Linux 系统上工作正常,并产生相当流畅的 Action 。

该方法的关键在于,它不是在每个计时器事件中将窗口移动给定的距离,而是找出当前时间并将窗口移动到当时它应该在的位置。因此,运动速度的时间导数应该是恒定的,即使定时器事件不规则地发生,也可以避免不规则或不连贯的运动。 (如 g-timeout-add() description 中所述,不规则很容易发生。)

在这个例子中,路径是从窗口的左上角到左下角再返回,如此反复。 timerEvent() 中的常量“HalfTime”控制从一个角移动到另一个角需要多长时间。 g_timeout_add() 调用中的常量 3 将计时器间隔设置为 0.003 秒,或大约每秒 333 次移动 (MPS)。 (您可能想尝试更合理的速率,例如 20、30、40 等 MPS;我使用数字 3,因为我在使用它之前没有查找 g-timeout-add(),并假设延迟为百分之一秒,大约 33 MPS,而不是毫秒,大约 333 MPS。)如果您的窗口内容相当复杂,那么较少的 MPS 将是实用的。此外,我尝试了一些较慢的速率,并得到了更多的波动印象。

/* $Id: app12.c $
 Re: animating position of a top-level Gtk window
 jiw July 2011 -- Offered without warranty under GPL v3
 terms per http://www.gnu.org/licenses/gpl.html  */
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <math.h>
#include <gtk/gtk.h>
typedef struct DATA { GTimer *timer; GtkWidget *window; int w, h; }
  DataStruct;

gboolean timerEvent(void *dataset) {
  enum { HalfTime=8, CycTime=2*HalfTime };
  gulong micros;
  DataStruct *data =dataset;
  double t = fabs(fmod (g_timer_elapsed (data->timer, &micros), CycTime));
  int x = (t*data->w)/HalfTime, y = (t*data->h)/HalfTime;
  gtk_window_move (GTK_WINDOW(data->window),
       t<HalfTime? x : 2*data->w-x, t<HalfTime? y : 2*data->h-y);
  return TRUE; /* Keep timeout running */
}

int main(int argc, char **argv) {
  GtkWidget *vbox, *b;
  GdkScreen *gds;
  DataStruct data;
  data.timer = g_timer_new();
  gtk_init (&argc, &argv);
  data.window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
  gtk_window_set_default_size (GTK_WINDOW(data.window), 200, 150);
  g_signal_connect (G_OBJECT(data.window), "destroy",
            G_CALLBACK(gtk_main_quit), NULL);
  vbox = gtk_vbox_new (FALSE, 0);
  gtk_container_add (GTK_CONTAINER(data.window), vbox);
  b = gtk_button_new_with_label ("Click to Exit");
  gtk_box_pack_start (GTK_BOX(vbox), b, TRUE, TRUE, TRUE);
  g_signal_connect (b, "clicked", G_CALLBACK(gtk_main_quit), NULL);
  gtk_widget_show_all (data.window);

  gds = gdk_screen_get_default ();  /* Get pointer to screen  */
  data.w = gdk_screen_get_width (gds);  /* Find out screen width  */
  data.h = gdk_screen_get_height (gds); /* Find out screen height */
  printf ("Screen size = %d by %d\n", data.w, data.h); fflush(stdout);
  g_timeout_add(3, timerEvent, &data);  /* Create .003 sec timer   */
  gtk_main();
  return (0);
}

关于linux - GTK 窗口运动动画?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3131497/

相关文章:

c - 如何将新应用程序从 Gnome/GTK 生成到 CLI 应用程序并将其输出读回 Gnome/GTK 应用程序?

python - 以编程方式更改 FileChooserDialog 以首先使用 Python 3.4 和 Gtk3 列出目录?

c - 如何从 gtktextview/gtksourceview 解析 C 中的文本

regex - 如何在shell脚本中使用 'sed'替换文件中的一行

linux - 如何在 Shell 脚本中测试 ant 命令的输出?

linux - 缺少 foo.c。在 Ubuntu 11.04 中使用 gcc 4.5

jquery - 让正方形网格慢慢改变大小

linux - 如何查看linux服务器的root/mnt/image文件?

Swift:UITableViewCell从右到左弹跳动画

ios - AVPlayer replaceCurrentItemWithPlayerItem 打破 UIViewAnimation