質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.61%

  • Java

    13506questions

    Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

  • Android Studio

    3618questions

    Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

タッチイベントのboolean型のしくみを教えて下さい

解決済

回答 2

投稿

  • 評価
  • クリップ 0
  • VIEW 403
退会済みユーザー

退会済みユーザー

まず前置きとして
boolean型がtrueかfalseを判別するということはわかります。
そして、私が作りたいboolean型も恐らくできています。

私自信voidとint(数字の判別)のみで大抵のプログラムはできると、考えていまして‥
ここまでも0と1でbooleanみたいなことをやってきました(上記の作りたいboolean型とは別ですが)。
で、ですね‥なんか見辛いし!ダサいなーと最近思うようになりまして、boolean使おうとなった次第であります。

今までこういうモノだと深く考えず使っていたタッチイベントですが、よく考えたらよくわからないなと‥

本題です。
タッチイベントのbooleanの仕組み?流れ?について簡単にご説明できると有難いです。
今回は単純に
MOTION_UP
MOTION_DOWN
そして
return false;
の場合でお願いします。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

+1

タッチイベントだとかMOTION_UPだとかMOTION_DOWNだとか書かれていますが、これはonTouchEvent()のことでしょうか?
(もしそうであれば、MOTION_UP・MOTION_DOWNではなく、ACTION_UP・ACTION_DOWNが正しいです)
そう判断して以下を書きましたので、もし違っていたらすいません。

あと、若干の憶測が入っているかもしれないので、ご注意ください。

https://techbooster.org/android/application/715/

以上のサイトによれば、

返り値をtrueに設定すると「TouchEventを消化」したことになり、他のViewやActivityへの通知を抑制できます。

とのことです。
これだけ聞くと難しそうですが、AndroidのシステムがonTouchEvent()を呼び出して処理をしているだけです。
「あるメソッドを呼び出し、その返り値が0だったらああする、1だったらこうする」という処理を書いたことがあると思いますが、それをシステム内部が行っているだけです。

また、ACTION_UP・ACTION_DOWNですが、タッチ押下するとACTION_DOWNが、指を持ち上げるとACTION_UPが、引数を通じて送られてきます。
こちらは、「Aというボタンを押したらfoo(0)を、Bというボタンを押したらfoo(1)を呼び出す」というイメージになります。
このACTION_UP・ACTION_DOWNは、boolean型とは直接関係ないです(ACTION_UP・ACTION_DOWNはboolean型ではありません)。


追記:
以上のような感じで答えてみたけど、どちらかというとboolean型というよりかは、onTouchEvent()の仕組みについて書いているようなような気がしてきました…。
初歩的なことですが、boolean型は単純な値なので、trueが1、falseが0だと思っておけば間違いないと思います。
そのため、boolean型そのものには仕組みも何もありません。


追記2:

基本的には、swordoneさんの回答の通りです。

swordoneさんが言っているメソッドとは、ここではonTouchEvent()のことです。
onTouchEvent()のreturnがtrueであれば、他のonTouchEvent()は実行されないということです(すでに実行されたものは除く)。

私が記載したサイトによれば、以下のような優先順位になっています。

上位のView>下位のView>Activity

これについてですが、例えば以下のようなソースがあるとします。

(上位レイヤーのView)

public class AEventView extends View {
    @Override
    public boolean onTouchEvent(MotionEvent event) {
        // 何か処理

        return false;
    }
}

(下位レイヤーのView)

public class BEventView extends View {
    @Override
    public boolean onTouchEvent(MotionEvent event) {
        // 何か処理

        return true;
    }
}

(Activity)

public class CEventActivity extends Activity {
    @Override
    public boolean onTouchEvent(MotionEvent event) {
        // 何か処理

        return false;
    }
}

この状態では、全てreturn false;であれば 上位レイヤーのView→下位レイヤーのView→Activityの順番で呼ばれます。
しかし、下位レイヤーのViewではreturn true;となっているので、ActivityのonTouchEvent()が呼ばれなくなります。
同様に、上位レイヤーのViewがreturn true;となっている場合は、下位レイヤーのViewとActivityのonTouchEvent()が呼ばれなくなります。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/10/01 02:54

    うーん、やっぱりいまいちモヤが晴れない。書き間違えはすみません。解釈有り難うございます。
    で、おっしゃるとおり「boolean型は単純な値」‥ですよね!言うなればコイツはtrueかfalseしか返せないんですよ!でもtrueにするとシステム内部で動くんですよね?
    ここでモヤモヤします!
    単純な結果だけを返す、つまり
    指がついたよ→false
    指が離れたよ→false
    といった検査するイメージなんですけど、falseとtrueは単純な結果を返すとするならば、
    指がついたよ→true
    指が離れたよ→true
    でもいいわけで、そうするとシステム内部で動く?とモヤモヤループです。
    すいません、自分にとってここはないがしろには出来ない部分だと思うので‥

    キャンセル

  • 2017/10/01 10:24

    回答を編集しました(追記2)。
    確認をお願いします。

    キャンセル

  • 2017/10/01 11:01

    とても分かりやすいです。有り難うございます。そして、もうちょっとしつこく聞きます、すいません。
    追記2の内容は理解しましたのでご心配なく。まぁbreak;ぽい感じではあると‥

    語弊を招かぬように言うなら、処理の順序は理解しましたので、「なぜそうなるのか」を知りたいわけです。

    なぜなら、私自信booleanは真、偽だけを返すモノだという認識のためtrueで打ち切られるのは初耳です。
    「そういう決まり」というだけですか?

    あともうひとつ、
    そうまでして機能しない下位クラスを作るのはなぜか?

    共通処理のとき切られるだけで、他の固有の処理のために作ってあるみたいな感じですかね?
    仮に全てreturn trueにしたら機能しませんか?

    キャンセル

  • 2017/10/01 11:24

    > なぜなら、私自信booleanは真、偽だけを返すモノだという認識のためtrueで打ち切られるのは初耳です。
    > 「そういう決まり」というだけですか?
    私自身は「onTouchEvent()」がそういう仕様だと認識しております。

    > そうまでして機能しない下位クラスを作るのはなぜか?
    本当に機能しないのであれば、実装する必要はありません。
    ただ、例えばViewの範囲外だったときに下位クラスを実行する、といったことができるので、そういう場合に実装します。

    > 仮に全てreturn trueにしたら機能しませんか?
    最初のタッチイベントのみが実行されます。

    キャンセル

  • 2017/10/01 14:32

    かなり参考になりました!

    今現在オブジェクト指向で全てreturn true;で使っているのですがそれでどう機能してるのか、なぜ動くのかもハッキリわかりました。

    今回はswordoneさんの答えが意味合いとしては近いのでベストアンサーにさせて頂きます。
    それでも追記2のやりかたは色々試しがいがありそうです。
    有り難うございました。

    キャンセル

checkベストアンサー

0

タッチに反応するイベントが同時に複数発生することもあります。
その時、何らかの優先順位によってイベントが順番に処理されていきます。
例えば、ある点をタッチしたことにより、A,B,Cの3つのイベントが発生したとします。
まずAを処理します。このイベントを処理するメソッドがfalseを返せば、処理が続行されます。
次にBを処理します。このイベントメソッドがtrueを返した場合、「ここでイベント終わり」を意味し、続くCのイベントを処理せずに終わらせることができます。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/10/01 07:13

    解答有り難うございます。

    いやーあんまり賢くないので理解が及ばないのですが、解答いただいた

    まずAを処理します。このイベントを処理するメソッドがfalseを返せば、処理が続行されます。

    このfalseを返してくれるのは誰ですか?
    指が触れている状態を指すならACTION_DWONがソレにあたりますか?


    前解答者の提示してくださったサイトの言葉を使うとすれば、

    『onTouchEventメソッドの返り値は標準でfalseですが、今回は、trueとしています。
    返り値をtrueに設定すると「TouchEventを消化」したことになり、他のViewやActivityへの通知を抑制できます。』

    とあります。もうそもそもここが謎ですね。onTouchEventメソッドの返り値は標準でfalseとは‥

    なんかここだけ限定的というか、その仕組みというか‥
    解答された状況に沿いますと
    優先順位のあるABCという処理に
    return trueの場合とreturn falseの場合の処理の違いを頭の硬い私にも分かるように説明いただけると有難いです。

    キャンセル

  • 2017/10/01 10:59

    > このfalseを返してくれるのは誰ですか?
    指が触れている状態を指すならACTION_DWONがソレにあたりますか?

    それぞれのイベントのonTouchメソッドなどです。
    ACTION_DOWNなどはonTouchメソッドを起動する際の引数であり、「どういうイベントが発生したか」をプログラムが判別するためのものです。

    >もうそもそもここが謎ですね。onTouchEventメソッドの返り値は標準でfalseとは‥

    基本的にイベントを途中で止める必要はないため、標準でfalseなのです。

    > 優先順位のあるABCという処理に
    return trueの場合とreturn falseの場合の処理の違いを頭の硬い私にも分かるように説明いただけると有難いです。

    上記回答ではBがtrueを返した場合を説明しました。この場合は続くCは処理されずに終了しますが、
    falseを返した場合は処理が続行され、Cのイベントも処理されることになります。

    キャンセル

  • 2017/10/01 13:16

    あー多分なんか見えてきました。
    falseを返すということは返される方が存在するわけでそれが今回はonTouchEvent,つまりonTouhEventそのものにtrueを返された時の処理が既に組み込まれているということですね。
    ということはonTocuhEvent以外なら自分でそういった処理を書かない限りtrue,falseは自由!
    しかも優先順位はない。

    という認識でよろしいでしょうか?

    キャンセル

  • 2017/10/01 13:42

    onTouchEventはbooleanを受け取ることはありません。Android OSがその辺の処理を管理します。

    キャンセル

  • 2017/10/01 14:22

    なるほど!
    有り難うございました。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.61%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • Java

    13506questions

    Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

  • Android Studio

    3618questions

    Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。