ScreenManager

ScreenManager는 여러 device에서 screen을 적절하게 조절할 수 있게 해준다.
multiple screen을 갖도록 해주며 screen간 switch를 쉽게 해준다.
ScreenManager는 항상 Screen widget을 가져아하고, 다른 Widget을 가질 수 없다.

Screen으로 사용되는 곳에도 명시가 필요하다. @Screen으로 상속해주어야 한다.
Screenmanager attribute를 갖고, 이를 통해 접근할 수 있다.

name property를 Screen에 명시하여 screen을 변경할 수 있다.

  • 예를 들어 root.current = 'comicscreen'을 통해 comicscreen으로 switch 함.
    • 여기서 root는 ScreenManager 이고, current는 active screen 임.
  • 유사하게 current = 'colorscreen'으로 colorscreen으로 switch 할 수 있음. comiccreator.kv에서 각 항목들에 대해 id, root를 부여하는 이유

ScreenManager를 사용하게 되면 ScreenManager가 Screen들을 통제하게 되는 구조가 되기 때문에 .py에서 kivyApp이 빌드하는 최상위가 Manager가 되야 한다.

Color

동적으로 coloring 하기 위한 방법이다.
canvas.addwith ---.canvas:를 통해 color를 추가할 수 있다.

canvas.add(Color(1,0,0,1))

with canvas:
    Color(1,0,0,1)

canvas.before.add를 사용하면 Color instruction이 Canvas에 추가한 다른 instructions보다 먼저 적용되도록 할 수 있다.

transision

screen을 switch 할 때 어떤 animation이 보이는가에 대한 것이다.

etc

load_file은 .kv를 include하는 것이며, 이와 유사하게 load_string으로 .kv를 python file에서 사용할 수 있다.

stencilView

특정 영역에만 이벤트를 처리하기 위해서 collide_points와 같은 방법을 사용했었는데, 이건 group mode나 resize 같은 상황에서 완벽하지 않다.
따라서 StencilView를 쓰는데, StencilView는 drawing area를 해당 view의 공간까지로 제한하며, 밖에 그려진 것들은 숨겨진다.

  • drawingspace를 제한하기 위해 StencilView를 상속하도록 함.
  • DrawingSpace(RelativeLayout)DrawingSpace(stencilView)로 변경.
    • 참 여기서 DrawingSpace는 예제에서 만들어낸 클래스!

StencilViewRelativeLayout이 아니므로, StencilView class는 relative coordinates를 사용할 수 없다. 즉, 여기서 사용한다면 상위의 RelativeLayout을 사용하게 되는 것이며, 일반적으로 drawing은 relative coordinates를 사용하는 것이 좋으므로 RelativeLayout안에 DrawingSpace을 사용하도록 한다.

  • DrawingSpace(RelativeLayout)와 같은 동작을 원한다면 RelativeLayout을 가질 수 있도록 RelativeLayout으로 DrawingSpace를 감싸도록 한다. 이렇게 되면 RelativeLayout이 원하는 위치와 사이즈를 갖도록 설정해주어야 한다.
      RelativeLayout:
      DrawingSpace:
    

scatter

scale, rotate와 같은 기능들을 가지고 있는 class. 두 손가락으로 scale과 rotate를 할 수 있도록 구현되어 있고, mobile에서도 사용가능하다.
scatterRelativeLayout처럼 relative coordinates를 사용한다.

scatter 적용

  1. DraggableWidget이 Scatter를 상속하도록 함.
  2. scatter가 event를 받을 수 있도록 on_touch_downsuper.on_touch_down를 추가 함.
  3. scatter가 pos property에 대한 on_pos method를 지원하므로 on_touch_move 대신 사용.
  4. scatter는 rotationscale property를 또한 지원하며, on_rotation, on_scale 사용.

property 활용

property의 활용은 하나의 변경이 다른 widget에 영향을 미칠 때 효과적으로 사용할 수 있다.
예를들어 하나의 widget이 rotation이 변경되면, on_rotation 함수가 호출되는데, 이 함수 내부에서 연관된 widget들의 rotation을 변경하여 on_rotation을 호출할 수 있다.

gesture

kivy 에서는 gesture를 저장할 수 있는데, gesture를 string으로 저장함.
on_touch_down, on_touch_move, on_touch_up 마다 point를 저장하여 string으로 변환하는 방식이다.

  1. gesture = Gesture()로 Gesture를 생성하고
  2. gesture.add_stroke(self.points)로 points를 넣고
    • self.points += [touch.pos]로 points가 기록되어 있음
  3. gesture.normalize()로 default number로 바꾸고
  4. GestureDatabase.gesture_to_str(gesture)로 string으로 출력하여 확인하도록 함.

kivy 에서 저장한 gesture를 활용하는 방식.

  1. str_to_gesture로 저장해둔 string gesture를 gesture로 바꿈
  2. GestureDataBase.add_gesture로 gesture를 database에 추가
  3. on_touch_down, on_touch_move, on_touch_up에 대한 함수 구현.
    • 각 함수에서 [touch.pos]를 저장하고, on_touch_up에서 GestureDatabase.find를 통해 database에서 저장된 gesture가 있는지 찾도록 함.
  4. 찾은 값과, database에 넣은 gesture가 일치하는지 확인하여 사용.
    • 여기서는 discriminate를 통해 해당 그림들을 그리도록 하였음.

behavior

특정 widget의 classic behavior를 다른 behavior에 사용할 수 있다.
예를 들어, ButtonBehavior(on_press, onRelease를 사용하기 위한)를 Label이나 Image widget에 사용할 수 있다.

behavior는 widget의 appearance를 바꾸는 것이 아니라, functionallity만 넣어주는 것이다.
multiple inheritance를 통해 사용할 수 있지만, touch가 중복되거나, 동일 property를 갖는 경우에 대해 조심해서 사용해야 한다.

현재는 아래의 Behavior만 사용할 수 있다.

  • ButtonBehavior
  • ToggleButtonBehavior
  • DragBehavior

style

Window: window를 import 하여, 몇 가지 application window와 global parameter, event를 설정할 수 있다. clearcolor property 를 통해 backgrond color를 설정할 수 있다.
bold: bold property로 폰트 설정할 수 있다.
background_normal, background_down: background_normal과 background_down property를 통해, Button의 background image를 설정할 수 있다.
<Label>, <Button>과 같이 widget에 대한 적용을 하면 코드 전체의 Label에 영향을 미칠 수 있다.

  • set할 때의 순서도 중요함. Button을 먼저 set하면, Label 것이 overwrite.

Factory

새로운 class를 등록할 수 있다. 말 그대로 정말 만들어내는 것.
Factory.register()으로, kivy에서 ‘name’으로 사용할 수 있는 class를 등록할 수 있다.
등록된 name은 .kv에서 사용 가능하다.
Factory.unregister()으로, 등록된 name을 해제할 수도 있다.

  • Line을 unregister로 해제하고, register로 새로만든 Line을 등록함으로써 Line을 재정의하는 방식으로도 사용할 수 있다.
    • kwargs parameter가 Line의 모든 property를 가지고 있는데, 여기서 kwargs['width']를 사용하여 Line의 두께를 바꿀 수 있음.