Linux GTK窗口运动动画?

Linux GTK窗口运动动画?,linux,animation,gtk,Linux,Animation,Gtk,我想在屏幕上自动移动我的GTK_窗口。目前,我有一个绘制/移动循环,但这是可怕的起伏。我对GTK编程(以及一般的gui编程)非常陌生。我遗漏了什么?您还没有说希望窗口遵循什么样的路径。如果路径是时间的简单函数——也就是说,如果您有一种方法可以计算在任何给定时间窗口的位置——您可以尝试下面代码中说明的方法。对于示例中非常简单的菜单,它在我的Linux系统上运行正常,并产生相当平滑的运动 该方法的关键在于,它不会在每个计时器事件中将窗口移动给定的距离,而是找出当前时间并将窗口移动到它应该在的位置。因

我想在屏幕上自动移动我的GTK_窗口。目前,我有一个绘制/移动循环,但这是可怕的起伏。我对GTK编程(以及一般的gui编程)非常陌生。我遗漏了什么?

您还没有说希望窗口遵循什么样的路径。如果路径是时间的简单函数——也就是说,如果您有一种方法可以计算在任何给定时间窗口的位置——您可以尝试下面代码中说明的方法。对于示例中非常简单的菜单,它在我的Linux系统上运行正常,并产生相当平滑的运动

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

在本例中,路径重复地从窗口的左上角到左下角再到背面。timerEvent()中的常数“HalfTime”控制从一个角移动到另一个角所需的时间。g_timeout_add()调用中的常量3将计时器间隔设置为0.003秒,或大约每秒333次移动(MPS)。(您可能想尝试更合理的速率,例如20、30、40等MPS;我使用数字3是因为我在使用它之前没有查找,并且假设延迟是百分之一百秒,大约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);
}
/*$Id:app12.c$
Re:设置顶级Gtk窗口位置的动画
jiw 2011年7月-根据GPL v3提供,无保修
条款依据http://www.gnu.org/licenses/gpl.html  */
#包括
#包括
#包括
#包括
#包括
typedef结构数据{GTimer*计时器;GtkWidget*窗口;int w,h;}
数据结构;
gboolean timerEvent(无效*数据集){
枚举{HalfTime=8,CycTime=2*HalfTime};
古龙显微镜;
DataStruct*数据=数据集;
双t=fabs(fmod(g_定时器(数据->定时器和微秒),周期));
INTX=(t*数据->w)/中场休息,y=(t*数据->h)/中场休息;
gtk_窗口移动(gtk_窗口(数据->窗口),
tw-x,th-y);
返回TRUE;/*保持超时运行*/
}
int main(int argc,字符**argv){
GtkWidget*vbox,*b;
GDK屏幕*gds;
数据结构数据;
data.timer=g_timer_new();
gtk_init(&argc,&argv);
data.window=gtk_window_new(gtk_window_顶层);
gtk_窗口设置默认大小(gtk_窗口(data.window),200150);
g_信号连接(g_对象(数据窗口),“销毁”,
G_回调(gtk_main_quit),NULL);
vbox=gtk_vbox_new(FALSE,0);
gtk_容器添加(gtk_容器(data.window),vbox);
b=gtk_按钮_新建_,带有_标签(“单击退出”);
gtk_-box_-pack_-start(gtk_-box(vbox),b,真,真,真);
g_信号连接(b,“点击”,g_回调(gtk_主退出),空);
gtk_widget_show_all(data.window);
gds=gdk_screen_get_default();/*获取指向屏幕的指针*/
data.w=gdk_screen_get_width(gds);/*查找屏幕宽度*/
data.h=gdk_screen_get_height(gds);/*查找屏幕高度*/
printf(“屏幕大小=%d被%d\n”,data.w,data.h);fflush(stdout);
g_timeout_add(3,timerEvent和data);/*创建.003秒计时器*/
gtk_main();
返回(0);
}

没有人想回答我。悲伤的熊猫:’(我也不知道。我对你目前拥有的东西很感兴趣,你也能发布你的代码吗?这也可能会邀请其他人回答/更正你的代码。注:可能有关于的信息,请参阅。