슬라이딩 위젯을 만드는 방법 (GTK +, Quickly)


8

최근 Gedit 에서이 위젯을 보았습니다.

여기에 이미지 설명을 입력하십시오

를 누르면 나타납니다 Ctrl + F. 내가 관심있는 것은 슬라이딩 효과를 얻는 방법에 있습니다. 모든 제안을 부탁드립니다.


효과 "효과 수단을 슬라이딩"무엇을 명확히 슬라이딩 이해하지
twister_void

@Gaurav_Java 상단 패널 아래에서 미끄러 져 보입니다. Gedit에서 보시면 'Ctrl + F'를 누르십시오
Ángel Araya

효과는 종종 "드롭 다운"이라고하며, 때로는 메뉴가 같은 방식으로 애니메이션됩니다.
Steve Kroon

1
CSS 전환 속성을 사용할 수 있다고 생각했지만 CSS에서 위치를 변경하는 방법을 모르겠습니다. 의 gedit 코드를 통해 찾고, 그들은 검색 상자에 대한에 사용자 정의 viewframe 사용하는 것 bazaar.launchpad.net/~vcs-imports/gedit/master-git/view/head:/... 그들이 어떤 연극 모듈을 통해 애니메이션 (보기 bzr에서). 그래도 C 코드를 파싱하는 데별로 좋지 않습니다.
Ian B.

1
BTW,이 위젯은 Chrome (및 Chromium)에도 있습니다
Ian B.

답변:


7

순수한 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)

그런 다음 불투명도가 0으로 전환됩니다.

그러나 내가 알았 듯이 CSS를 사용하여 배치 / 너비에 영향을 줄 수있는 옵션이 많지 않으므로 색상 / 불투명도 등으로 제한됩니다.

즐겨.

추신 : 우분투 12.10 이후 Gtk 3.6 에서만 작동합니다.


질문에 슬라이딩 애니메이션이 필요했기 때문에 사람들은 아마도 다운 투표를 받았지만 완전히 다른 다른 불투명도 전환을했기 때문에 다른 많은 사람들이 왜 투표를 했는지 모르겠습니다 . 어쨌든 요즘에는 GtkRevealer둘 다 할 수 있습니다. 내 대답을 참조하십시오 .
underscore_d

3

순수한 GTK +에서는 이러한 애니메이션을 얻을 수 없습니다. 처리 할 메커니즘이 없습니다.

gedit의 소스 코드를 간략히 살펴 보았지만이 애니메이션을 자체적으로 처리하는 것이 분명합니다. 애니메이션과 관련된 코드가 상당히 확장 되었기 때문에 자세한 내용을 살펴 보지 않았지만 애니메이션 검색 위젯에 대한 카이로 그리기 기능이 통합되어 있습니다. 위젯은 위치를 프레임 단위로 이동하고 단일 텍스트 표시 영역에서 사용되는 오버레이의 다른 위치에 다시 그려서 애니메이션을 만듭니다.

가장 간단한 해결책 인 것 같습니다. (gedit의 코드는 동일한 코드 기반을 공유하는 많은 애니메이션에 대해 준비된 것으로 보이므로 간단한 응용 프로그램에서 정확한 접근 방식을 사용하는 것은 과도한 일이 될 수 있습니다.)

이 효과를 재현하려면 다음이 필요합니다.

  • 슬라이드 인 / 아웃하려는 UI 피스에 대한 사용자 정의 위젯을 사용하십시오.
  • 그리기 이벤트 및 주기적 시간 초과 에 반응하게합니다 (애니메이션의 각 프레임을 다시 그 립니다 )
  • 나머지 위젯 (또는 슬라이딩 위젯 아래에있는 것처럼 표시되어야하는 영역) 위에 투명한 오버레이를 만듭니다.
  • 이러한 오버레이에 애니메이션 위젯을 수동으로 그립니다.

더 쉬운 해결책을 찾지 못했습니다. 그러나 gedit 개발자들이 GTK +에 대해 거의 아는 바가 없다는 사실을 고려할 때 그러한 효과를 얻는 간단한 방법은 없을 것입니다.


"가장 단순한"아이디어입니다. CSS 해킹으로 할 수 있다고 생각했지만 Gedit의 코드를 읽는 것은 하드 코딩과 비슷하고 간단한 검색 상자 항목 이상을 준비하는 것처럼 보입니다. 따라서 사용자 정의 위젯을 만들고 먼저 특정 이벤트에서 (적어도 가능한 경우) 이동시켜 보겠습니다. 제안 해 주셔서 감사합니다.
Ángel Araya

1

Gtk.fixed (), GObject.timeout_add와 함수 이동 사이의 조합을 사용할 수 있습니다. 파이썬의 예는 다음과 같습니다.

#! / usr / bin / python *
gi.repository에서 가져 오기 Gtk, GObject

TestWindow (Gtk.Window) 클래스 :
     데프 애니메이션 이미지 (자체) :
        GObject.timeout_add (150, self.slideImage)

     데프 슬라이드 이미지 (자체) :
        self.positionX + = 50;
        if (self.positionX> 800) :
          self.fixedWidget.move (self.logo, self.positionX, 200)
          True를 반환        
        그밖에:
          False를 반환 

     데프 __init __ (self) :
        Gtk.Window .__ init __ (자체, 제목 = '등록')

        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

요즘에는이 질문에 대한 진정한 대답이 있습니다. 원래 질문과 답변을 libgd받았으므로 위젯을 표시하는 코드 는 GEdit이 당시 사용했던 것으로 가정합니다 .GTK +에 다음과 같이 업스트림되었습니다 GtkRevealer.

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

GtkRevealer 슬라이드의 기본 방향 및 불투명도의 페이드를 포함하여 다양한 형태의 전환을 지원합니다.

요즘에는 전환하려는 위젯을 추가 GtkRevealer하고 :transition-(type|duration):reveal-child속성을 사용 하는 것만 큼 간단 합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.