编辑

编辑

最近我在 Gedit 中看到了这个小部件:

在此处输入图片描述

按下 时它就会出现Ctrl + F。我感兴趣的是如何获得滑动效果。任何建议都将不胜感激。

答案1

我已经使用以下方法实现了淡出效果纯的GTK 和 CSS。

它只在 GTK 3.6 中工作,我不确定是否可以实现滑入/滑出效果,但是,如果你愿意,你可以查看 launchpad.net/uberwriter 上的源代码

它通过状态改变然后是 GTK 转换来工作...也许使用高度//宽度也是可能的。

编辑

因为人们显然对我投了反对票,所以这里还有另一个更详细的解释:

这是我使用的 CSS:

GtkLabel:insensitive {
    color: rgba(255,255,255,0);
    transition: 500ms ease-in-out;
}

如果你将其用作 CSS(我希望可以引用我自己的解释,如何做到这一点:http://wolfvollprecht.de/blog/gtk-python-and-css-are-an-awesome-combo/),然后您可以使用Gtk.StateFlags淡出标签。

例如:

label.set_state_flags(Gtk.StateFlags.INSENSITIVE, True)

然后你就会得到零不透明度的转变。

然而,正如我所注意到的,使用 CSS 影响位置/宽度的选项并不多,所以我猜它仅限于颜色/不透明度等。

享受。

PS:请注意仅有的从 Ubuntu 12.10 开始,可以在 Gtk 3.6 中使用

答案2

纯 GTK+ 无法实现此类动画。没有机制可以处理它。

我快速浏览了 gedit 的源代码,很明显,它们自己处理这个动画。我没有深入研究细节,因为与动画相关的代码相当丰富,但我注意到它们为动画搜索小部件整合了 Cairo 绘图功能。小部件很可能通过逐帧移动其位置并将其重新绘制在单个文本显示区域上使用的覆盖层中的不同位置来实现动画。

这似乎是最简单的解决方案。(gedit 的代码似乎是为共享相同代码库的许多动画准备的,因此在简单的应用程序中使用它的精确方法可能有点过度。)

要重现此效果,您需要:

  • 使用自定义小部件作为您想要滑入/滑出的 UI 部分。
  • 使其做出反应事件和定期超时(重新绘制动画的每一帧)
  • 在其余小部件(或任何必须看起来像位于滑动小部件下方的区域)上创建透明覆盖层
  • 在这样的覆盖层上手动绘制动画小部件。

我想不出任何更简单的解决方案。但是,考虑到 gedit 开发人员对 GTK+ 的了解可能很少,可能没有比这更简单的技巧来实现这种效果了。

答案3

您可以使用 Gtk.fixed()、GObject.timeout_add 和函数 move 的组合,下面是 Python 中的一个示例:

/usr/bin/python* #!
从 gi.repository 导入 Gtk、GObject

类测试窗口(Gtk.Window):
     def animateImage(自身):
        GObject.timeout_add(150,self.slideImage)

     def slideImage(自身):
        自身.positionX += 50;
        如果(self.positionX> 800):
          self.fixedWidget.move(self.logo,self.positionX,200)
          返回 True        
        别的:
          返回 False

     def __init__(self):
        Gtk.Window.__init__(self, title='注册')

        自身位置X = 500
        self.fixedWidget = Gtk.Fixed()
        self.fixedWidget.set_size_request(1920,1080)
        自我.fixedWidget.显示()

        self.logo = Gtk.Image.new_from_file('picture.png')
        self.logo.show()
        self.fixedWidget.put(self.logo,self.positionX,200)

        self.button1 = Gtk.Button('点击我来滑动图像!')
        self.button1.显示()
        self.button1.connect('点击',self.animateImage)
        self.button1.设置大小请求(75,30)
        self.fixedWidget.put(self.button1,750,750)
        自我添加(自我固定小部件)

测试窗口 = 测试窗口()
testWindow.set_size_request(1920,1080)
testWindow.set_name('测试窗口')
测试窗口.显示()

Gtk.main()

答案4

如今,这个问题终于有了答案。自从最初提出并回答以来,显示窗口小部件的代码libgd(我推测当时 GEdit 正在使用的代码)已上传到 GTK+ 中,如下所示GtkRevealer

https://developer.gnome.org/gtk3/stable/GtkRevealer.html

GtkRevealer支持各种形式的过渡,包括滑动的基本方向和不透明度的淡入淡出。

因此,现在,它就像添加您想要转换的小部件GtkRevealer并使用其:transition-(type|duration)属性一样简单:reveal-child

相关内容