web-dev-qa-db-ja.com

スライドウィジェットを作成する方法(GTK +、すばやく)

最近、私はGeditでこのウィジェットを見ました:

enter image description here

Ctrl + Fを押すと表示されます。私が興味を持っているのは、スライド効果を得る方法です。ご提案をいただければ幸いです。

8
Angel Araya

pureGTKと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)以降、これはonlyがGtk 3.6で機能することに注意してください

7
wolfv

このようなアニメーションは、純粋なGTK +では実現できません。それを処理するメカニズムはありません。

私はgeditのソースコードを簡単に見てきました。彼らがこのアニメーションを独自に処理していることは明らかです。アニメーションに関連するコードは非常に拡張されているため、詳細は検討していませんが、アニメーション検索ウィジェット用のCairo描画機能が組み込まれていることに注意しました。ほとんどの場合、ウィジェットはフレームごとに位置を移動し、単一のテキスト表示領域で使用されるオーバーレイの別の場所に再描画することでアニメーション化されます。

それが最も簡単な解決策のようです。 (geditのコードは、同じコードベースを共有する多くのアニメーション用に準備されているようです。したがって、単純なアプリケーションで正確なアプローチを使用するのはやり過ぎかもしれません。)

この効果を再現するには、以下が必要です。

  • スライドイン/スライドアウトするUIピースにカスタムウィジェットを使用します。
  • drawイベントと定期的なタイムアウトに反応させる(アニメーションの各フレームを再描画する)
  • 残りのウィジェット(またはスライドウィジェットの下にあるかのように表示する必要がある領域)の上に透明なオーバーレイを作成します。
  • そのようなオーバーレイにアニメーションウィジェットを手動で描画します。

もっと簡単な解決策は思いつきません。ただし、gedit開発者がGTK +を知っている可能性が非常に低いことを考えると、そのような効果を達成するための簡単なトリックはないかもしれません。

3
Rafał Cieślak

Gtk.fixed()、GObject.timeout_addと関数moveの組み合わせを使用できます。これはpythonの例です:

#!/ usr/bin/python * 
 from from gi.repository import Gtk、GObject 
 
 class TestWindow(Gtk.Window):
 def animateImage(self):
 GObject.timeout_add(150、self.slideImage)
 
 def slideImage(self):
 self.positionX + = 50; 
 if(self.positionX> 800):
 self.fixedWidget.move(self.logo、self.positionX、200)
 return True 
 else:
 return False 
 
 def __init __(self):
 Gtk.Window .__ init __(self、title = 'Registration')
 
 self.positionX = 500 
 self.fixedWidget = Gtk.Fixed()
 self.fixedWidget.set_size_request(1920,1080)
 self.fixedWidget.show()
 
 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.show()
 self.button1.connect( 'clicked'、self.animateImage)
 self.button1。 set_size_request(75,30)
 self.fixedWidget.put(self.button1,750,750)
 self.add(self.fixedWidget)
 
 testWindow = TestWindow( )
 testWindow.set_size_request(1920,1080)
 testWindow.set_name( 'testWindow')
 testWindow.show()
 
 Gtk.main ()
1
Brahim Ayari

今日、この質問に対する本当の答えがあります。もともと質問と回答があったので、libgdからウィジェットを表示するためのコードは、その時点でGEditが使用していたものと推測されますが、GtkRevealerとしてGTK +にアップストリームされました。

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

GtkRevealerは、スライドの基本的な方向や不透明度のフェードなど、さまざまな形式の遷移をサポートします。

そのため、最近では、GtkRevealerに移行するウィジェットを追加し、その:transition-(type|duration)および:reveal-childプロパティを使用するのと同じくらい簡単です。

0
underscore_d