kivyMDチュートリアル其の肆什玖 Behaviors - Touch篇

ハロー、Qiita!いかがお過ごしでしょうか。

今週は特に技術的なニュースはあまりなかった気がしていますが、オリンピックが
世間を賑わせていますね。そうなのか?ということ仰られる方もいるかと思いますが、
否定はしなく、どちらかというと私もそのような思いが近いです(どっちだ)。

冬のスポーツはあまり馴染みがないので、ニュースだけを見ていますが、みなさん
の推しのスポーツはありますでしょうか。

話はKivyMDに戻り、とうとう今週でエピソード1は終わりにしたいと思います。(なんそれ)
一旦はエピソード1はBehaviors章を区切りにしたいと思います。ver.1.0ももう
そろそろ出るじゃないかと思いますが、エピソード2は1.0が出たときに始動したい
と思います。どんなことやるかはまとめに書こうかなと。

今日については先週からの続きで、Touch篇となります。

ではさっそくですが、今日も元気にレッツラゴ。

## Touch

なにやら冒頭に以下のような記載がありますね。

> Provides easy access to events.

なにやらおぉ、と言ってしまいそうな英文ですね。シンプルがゆえに難しそうな。。
といっても依頼してみるとあぁそうなのねといった答えが返ってきました。

> イベントへの容易なアクセスを提供します。

とてもとてもイージーなものでした。

続いて以下のイベントが得られます、と言っていますね。

> The following events are available:

> * on_long_touch
> * on_double_tap
> * on_triple_tap

これまでにTouchの概要に触れてはいませんでしたが、これだけみてもどんなこと
が出来るかは予想が容易いですね。

### Usage

使用方法だけでタイトルはありますが、サンプルコードと同一化されています。
実際にコードを見てみましょう。

```python:xlix
from kivy.lang import Builder

from kivymd.app import MDApp
from kivymd.uix.behaviors import TouchBehavior
from kivymd.uix.button import MDRaisedButton
from kivymd.uix.snackbar import Snackbar

KV = '''
Screen:

    MyButton:
        text: "PRESS ME"
        pos_hint: {"center_x": .5, "center_y": .5}

'''


class MyButton(MDRaisedButton, TouchBehavior):
    def on_long_touch(self, *args):
        Snackbar(text="on long touch event!").open()

    def on_double_tap(self, *args):
        Snackbar(text="on double tap event!").open()

    def on_triple_tap(self, *args):
        Snackbar(text="on triple tap event!").open()


class MainApp(MDApp):
    def build(self):
        return Builder.load_string(KV)


MainApp().run()
```

今回も先週同様、カスタマイズしております。と言ってもなんてことはなく、
print文をSnackbarインスタンスを生成して起動する挙動に変更したくらい
になります。

全体的にGetting Startedの公式マニュアルページと同じくらいの量で極めて
簡潔に書かれております。と言ってもButtonてなんよ?という方もいられると思う
ので、過去自身が書いたリンクもしくは該当公式マニュアルを参照頂ければと思い
ます。

https://qiita.com/virty/items/29d792d5ecf4ad0f86be

あとは触れるとするならば、使用方法くらいでしょうか。該当しているところを
抜粋してみます。

```python
class MyButton(MDRaisedButton, TouchBehavior):
    def on_long_touch(self, *args):
        Snackbar(text="on long touch event!").open()
```

いわずもがな、MyButtonウィジェットはカスタムのボタンなのですが、どういう
風にボタンを変えるのよ、プロパティは?という詰められ方をしたときに必要なのが
こちらのクラス定義になります。過去のBehaviors章を見られた方は容易に類推
できると思いますが、このようにTouchBehaviorを継承していることが分かります。

あとはどのイベント時になにをしたいのよ?というところを書くだけですね。上記は
1例ですが、長押しした際にSnackbarを生成・起動している様子になります。

### 結果

では、さっそく結果の方を見てみましょうか。論より証拠を。

![207.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82826/708ccc51-3477-99b2-436e-9a3671d68567.gif)

見てもらえれば分かるかと思いますが、長押しとダブルタップに関しては問題ない
結果となっています。ですが、今回は1回だけ試した様子ですが、トリプルタップに
関してはここ以外でも試行錯誤して試しましたが、有効化されませんでした。

どうやら、元のコードを試してみるとトリプルタップのイベントは自動的にダブル
タップのイベントを起こしているという当たり前のことが分かりました。トリプル
タップだけしたくてダブルタップは起動させたくないということは現状不可能なので
はということを思っています(イベントを併用しない場合を除く)。

ボタン分けてトリプルタップイベントのみ定義しておくか、ダブルタップイベント
定義しなかったらよいのでは?ということを思った方はまさにその通りです。ですが、
現状の仕様でいくと、その期待は崩れ落ちる結果となります。

試した結果としては、前者のやり方なのですが、なぜか異なる方のイベントが起動され
ダブルタップイベントが起動する結果となりました...おい、バグやんけ、、と思いま
したがこれが実は仕様なのかもしれません。というかSnackbar使用時は併用禁物かも
しれません。

### API - kivymd.uix.behaviors.touch_behavior

まとめに入る前に使用したAPIについてまとめておきます。

#### class kivymd.uix.behaviors.touch_behavior.TouchBehavior(**kwargs)

`on_long_touch(self, touch, *args)`

> Called when the widget is pressed for a long time.

`on_double_tap(self, touch, *args)`

> Called by double clicking on the widget.

`on_triple_tap(self, touch, *args)`

> Called by triple clicking on the widget.

今回は3イベントを何度も取り上げました(予備校講師風に)。ですが、タブル
タップとトリプルタップは併用してはいけないということも何度も~(さらに
予備校講師風に)

まぁ、こればかりは思わぬハプニングというか仕様通りというか少し謎が謎を
呼んでいる状態です。

このイベント以外としては、長押しの際に時間を決められるプロパティがある
みたいらしいですね。デフォは0.4sとのことです。
-> duration_long_touch

## まとめ

さて、いかがだったでしょうか。

使用方法には少し注意が必要とは思いますが、それほど難しいことはなく
学習コストの割には費用対効果が大きいのではないでしょうか。投稿者自身も
ここはダブルタップにしたいなと思ってた次第ですので、積極的に使用していき
たいなと思っております。

というわけで、約1年弱と投稿を続けてきたのですが、こちらもどうだったでしょう
かね。週1とはいえ、休みなく投稿するのってこれだけ大変なことだったのだなと今
はしみじみ思ってしまいます。途中どれだけ今週は休もうかなと思ったか。。
\# HIKAKINまじりすぺくと

という個人的な感想は置いておいて、今後に向けてのことについて書いておきます。
ここでエピソード2の定義をしておくと、公式マニュアルの「New in version 1.0.
0.」という風に記載のある、バージョンアップグレードをしなければいけないところの
記事を書くこととしておきます。

現バージョンでも出来るiOSやAndroidのアプリを作るなんてことは不定期になりますが、
ちょこちょこ継続投稿していきたいと思っております。このあたりは以前どこかでまとめ
ておいたような気はします。まぁ投稿したときに軽く振り返られればと。

他のWeb技術とかも取り上げて投稿していこうかなと思いましたが、なかなかよいもの(ここ
でのよいものというのは比較的技術に魅力があり英文だけしかマニュアルがないようなもの
である)がなくですね、少しお休み期間を設けようとも。あと今の季節は寒い。。何かよい
ものがありましたら、コメントいただけるとです。

あ、自身の話ですが、転職を最近してましてということで転職エントリではないですが、
ポエム調で投稿でもしてみようかな。

ということでまたどこかでお会いできましたら幸いです。

それでは、また会う日まで、ごきげんよう。

## 参照

> Behaviors » Touch
> https://kivymd.readthedocs.io/en/latest/behaviors/touch/

> DeepL 翻訳ツール
> https://www.deepl.com/ja/translator