33![ ] ( http://img.youtube.com/vi/CjiRZjiSqgA/0.jpg )
44[ Youtube] [ youtube ]
55
6- ` kivy_garden.draggable ` はdrag&dropの機能を実現するための拡張機能で以下の三つの部品で構成される 。
6+ ` kivy_garden.draggable ` はdrag&dropの機能を実現するための拡張機能で以下の三つの部品で構成されます 。
77
88- ` KXDraggableBehavior ` ... dragできるようにしたいwidgetが継承すべきclass
99- ` KXDroppableBehavior ` と` KXReorderableBehavior ` ... dragされているwidgetを受け入れられるようにしたいwidgetが継承すべきclass
1515このmoduleのminor versionが変わった時は何らかの重要な互換性の無い変更が加えられた可能性が高いので、使う際はminor versionまでを固定してください。
1616
1717```
18- poetry add kivy_garden.draggable@~0.1
19- pip install "kivy_garden.draggable>=0.1 ,<0.2 "
18+ poetry add kivy_garden.draggable@~0.2
19+ pip install "kivy_garden.draggable>=0.2 ,<0.3 "
2020```
2121
2222## dragが始まる条件
2323
24- dragは長押しによって引き起こされる。より具体的には利用者の指がdraggable内に降りてから` draggable.drag_distance ` pixel以上動かずに` draggable.drag_timeout ` ミリ秒以上指が離れなかった場合のみ引き起こされる。このためscroll操作(指がすぐさま動き出す)やtap動作(指がすぐに離れる)として誤認されにくい。
24+ dragは長押しによって引き起こされます。より具体的には利用者の指がdraggable内に降りてから` draggable.drag_distance ` pixel以上動かずに` draggable.drag_timeout ` ミリ秒以上指が離れなかった場合のみ引き起こされます。
25+ このためscroll操作(指がすぐさま動き出す)やtap動作(指がすぐに離れる)として誤認されにくいです。
2526
2627## dragが始まった後の処理の流れ
2728
28- ユーザーがdraggableの上に指を降ろしてdragが始まった後の流れは以下のようになる 。
29+ ユーザーがdraggableの上に指を降ろしてdragが始まった後の流れは以下のようになります 。
2930
3031``` mermaid
3132stateDiagram-v2
@@ -60,26 +61,26 @@ stateDiagram-v2
6061## 受け入れるdragの選別
6162
6263図に書かれているように利用者の指が離れた時にdragが受け入れられるか否かの判断がなされ、
63- 指がdroppableの上じゃない所で離れた場合や` draggable.drag_cls ` が` droppable.drag_classes ` に含まれていない場合はまず即drag失敗となる 。
64+ 指がdroppableの上じゃない所で離れた場合や` draggable.drag_cls ` が` droppable.drag_classes ` に含まれていない場合はまず即drag失敗となります 。
6465
65- その選別をくぐり抜けたdraggableは` droppable.accepts_drag() ` へ渡され、そこでdragが受け入れられるか否かの最終判断が下される 。例えばmethodが
66+ その選別をくぐり抜けたdraggableは` droppable.accepts_drag() ` へ渡され、そこでdragが受け入れられるか否かの最終判断が下されます 。例えばmethodが
6667
6768``` python
6869class MyDroppable (KXDroppableBehavior , Widget ):
6970 def accepts_drag (self , touch , draggable ) -> bool :
7071 return not self .children
7172```
7273
73- という風に実装されていたら、このdroppableは自分が子を持っている間は例え適切な` drag_cls ` を持つdraggableであっても受け付けない 。
74+ という風に実装されていたら、このdroppableは自分が子を持っている間は例え適切な` drag_cls ` を持つdraggableであっても受け付けません 。
7475
7576## dragの中止
7677
77- アプリが次のシーンに移りたい時にまだdrag中のwidgetがあると不都合かもれしない 。そのような事態に備えて
78+ アプリが次のシーンに移りたい時にまだdrag中のwidgetがあると不都合かもしれません 。そのような事態に備えて
7879
7980- 現在進行中のdragを列挙する` ongoing_drags() ` と
80- - dragを中止する` draggable.drag_cancel() ` がある 。
81+ - dragを中止する` draggable.drag_cancel() ` があります 。
8182
82- これらを用いる事で以下のように進行中のdragを全て中止できる 。
83+ これらを用いる事で以下のように進行中のdragを全て中止できます 。
8384
8485``` python
8586from kivy_garden.draggable import ongoing_drags
@@ -92,17 +93,17 @@ def cancel_all_ongoing_drags():
9293## dragを引き起こすwidgetとdragされるwidgetを別にする
9394
9495上で述べたようにdragはdraggableを長押しすることで引き起こされるので、
95- dragを引き起こすwidgetとdragされるwidgetは基本同じである 。
96- でも例えばcard gameを作っているとして画面上に山札があったとする。
97- そしてdrag操作によって山札から札を引けるようにしたいとする 。
96+ dragを引き起こすwidgetとdragされるwidgetは基本同じです 。
97+ でも例えばcard gameを作っているとして画面上に山札があったとして
98+ drag操作によって山札から札を引けるようにしたいとします 。
9899具体的には利用者が山札に指を触れた時に札を作り出し、
99- そのまま指の動きに沿って札を追わせたいとする 。
100+ そのまま指の動きに沿って札を追わせたいとします 。
100101このような
101102
102103- dragを引き起こすwidget(山札)と
103104- dragされるwidget(山札から引かれた札)
104105
105- が別である状況では` draggable.start_dragging_from_others_touch() ` が使える 。
106+ が別である状況では` draggable.start_dragging_from_others_touch() ` が使えます 。
106107
107108``` python
108109class Card (KXDraggableBehavior , Widget ):
@@ -117,23 +118,24 @@ class Deck(Widget):
117118
118119## 自由に振る舞いを変える
119120
120- dragが失敗/成功/中止した時に何をするかは完全にあなたに委ねられている。例えばdrag失敗時は既定ではアニメーションしながら元の場所に戻るが、これをアニメーション無しで瞬時に戻したいなら以下のようにdefault handlerを上書きすれば良い。
121+ dragが失敗/成功/中止した時に何をするかは完全にあなたに委ねられています。
122+ 例えばdrag失敗時は既定ではアニメーションしながら元の場所に戻りますが、これをアニメーション無しで瞬時に戻したいなら以下のようにdefault handlerを上書きすれば良いです。
121123
122124``` python
123125class MyDraggable (KXDraggableBehavior , Widget ):
124126 def on_drag_fail (self , touch , ctx ):
125127 restore_widget_state(self , ctx.original_state)
126128```
127129
128- また何もせずにその場に残って欲しいなら以下のようにすれば良い 。
130+ また何もせずにその場に残って欲しいなら以下のようにすれば良いです 。
129131
130132``` python
131133class MyDraggable (KXDraggableBehavior , Widget ):
132134 def on_drag_fail (self , touch , ctx ):
133135 pass
134136```
135137
136- 成功時も同様で、既定では受け入れてくれたdroppableの子widgetになるように実装されているが以下のようにすれば子widgetにはならずに現在の位置で徐々に透明になって消える事になる 。
138+ 成功時も同様で、既定では受け入れてくれたdroppableの子widgetになるように実装されていますが以下のようにすると子widgetにはならずに現在の位置で徐々に透明になって消える事になります 。
137139
138140``` python
139141import asynckivy as ak
@@ -144,17 +146,17 @@ class MyDraggable(KXDraggableBehavior, Widget):
144146 self .parent.remove_widget(self )
145147```
146148
147- このようにdefault handlerを上書きすることで自由に振るまいを変えられる 。
148- ただし** async関数になれるのは` on_drag_succeed ` と` on_drag_fail ` のdefault handlerだけ** なので注意されたし 。
149+ このようにdefault handlerを上書きすることで自由に振るまいを変えられます 。
150+ ただし** async関数になれるのは` on_drag_succeed ` と` on_drag_fail ` のdefault handlerだけ** なので注意してください 。
149151
150152ここで
151153
152154- default handlerをasync関数にするのと
153155- default handlerは普通の関数のままにしておいて内部で` asynckivy.start() ` を用いてasync関数を立ち上げるのと
154156
155- の違いについて説明する 。
156- 前者ではasync関数のcodeがdrag処理の間に挟み込まれ、codeが ` on_drag_end ` が起こるより前に完遂される事が保証されるのに対し、
157- 後者ではcodeがdrag処理とは独立して進むので` on_drag_end ` が起こるより前に完了する保証はない 。
157+ の違いについて説明します 。
158+ 前者ではasync関数のcodeがdrag処理の間に挟み込まれcodeが ` on_drag_end ` が起こるより前に完遂される事が保証されるのに対し、
159+ 後者ではcodeがdrag処理とは独立して進むので` on_drag_end ` が起こるより前に完了する保証はありません 。
158160なのでもし上の` on_drag_succeed ` の例を後者のやり方で実装すると
159161
160162``` python
@@ -170,8 +172,8 @@ class MyDraggable(KXDraggableBehavior, Widget):
170172```
171173
172174` ak.animate() ` の進行中にdragが完了し、そこで利用者が再び指を触れたことで次のdragが始まり、
173- その最中に` self.parent.remove_widget(self) ` が実行されてdraggableが親widgetから切り離されてしまうなんて事が起こりうる 。
174- なので ** drag完了前に完遂させたい非同期処理があるのなら必ず前者の方法を使うべし ** 。
175+ その最中に` self.parent.remove_widget(self) ` が実行されてdraggableが親widgetから切り離されてしまうなんて事が起こりえます 。
176+ なので ** drag完了前に完遂させたい非同期処理があるのなら必ず前者の方法を使ってください ** 。
175177
176178## その他
177179
0 commit comments