🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Java

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

Android Studio

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

Q&A

解決済

2回答

8304閲覧

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

退会済みユーザー

退会済みユーザー

総合スコア0

Java

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

Android Studio

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

0グッド

0クリップ

投稿2017/09/30 12:22

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

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

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

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

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

タッチイベントだとか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)

Java

1public class AEventView extends View { 2 @Override 3 public boolean onTouchEvent(MotionEvent event) { 4 // 何か処理 5 6 return false; 7 } 8}

(下位レイヤーのView)

Java

1public class BEventView extends View { 2 @Override 3 public boolean onTouchEvent(MotionEvent event) { 4 // 何か処理 5 6 return true; 7 } 8}

(Activity)

Java

1public class CEventActivity extends Activity { 2 @Override 3 public boolean onTouchEvent(MotionEvent event) { 4 // 何か処理 5 6 return false; 7 } 8}

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

投稿2017/09/30 13:28

編集2017/10/01 01:22
fiveHundred

総合スコア10152

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2017/09/30 17:54

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

2017/10/01 01:24

回答を編集しました(追記2)。 確認をお願いします。
退会済みユーザー

退会済みユーザー

2017/10/01 02:01

とても分かりやすいです。有り難うございます。そして、もうちょっとしつこく聞きます、すいません。 追記2の内容は理解しましたのでご心配なく。まぁbreak;ぽい感じではあると‥ 語弊を招かぬように言うなら、処理の順序は理解しましたので、「なぜそうなるのか」を知りたいわけです。 なぜなら、私自信booleanは真、偽だけを返すモノだという認識のためtrueで打ち切られるのは初耳です。 「そういう決まり」というだけですか? あともうひとつ、 そうまでして機能しない下位クラスを作るのはなぜか? 共通処理のとき切られるだけで、他の固有の処理のために作ってあるみたいな感じですかね? 仮に全てreturn trueにしたら機能しませんか?
fiveHundred

2017/10/01 02:24

> なぜなら、私自信booleanは真、偽だけを返すモノだという認識のためtrueで打ち切られるのは初耳です。 > 「そういう決まり」というだけですか? 私自身は「onTouchEvent()」がそういう仕様だと認識しております。 > そうまでして機能しない下位クラスを作るのはなぜか? 本当に機能しないのであれば、実装する必要はありません。 ただ、例えばViewの範囲外だったときに下位クラスを実行する、といったことができるので、そういう場合に実装します。 > 仮に全てreturn trueにしたら機能しませんか? 最初のタッチイベントのみが実行されます。
退会済みユーザー

退会済みユーザー

2017/10/01 05:32

かなり参考になりました! 今現在オブジェクト指向で全てreturn true;で使っているのですがそれでどう機能してるのか、なぜ動くのかもハッキリわかりました。 今回はswordoneさんの答えが意味合いとしては近いのでベストアンサーにさせて頂きます。 それでも追記2のやりかたは色々試しがいがありそうです。 有り難うございました。
guest

0

ベストアンサー

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

投稿2017/09/30 18:06

swordone

総合スコア20669

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2017/09/30 22:13

解答有り難うございます。 いやーあんまり賢くないので理解が及ばないのですが、解答いただいた まずAを処理します。このイベントを処理するメソッドがfalseを返せば、処理が続行されます。 このfalseを返してくれるのは誰ですか? 指が触れている状態を指すならACTION_DWONがソレにあたりますか? 前解答者の提示してくださったサイトの言葉を使うとすれば、 『onTouchEventメソッドの返り値は標準でfalseですが、今回は、trueとしています。 返り値をtrueに設定すると「TouchEventを消化」したことになり、他のViewやActivityへの通知を抑制できます。』 とあります。もうそもそもここが謎ですね。onTouchEventメソッドの返り値は標準でfalseとは‥ なんかここだけ限定的というか、その仕組みというか‥ 解答された状況に沿いますと 優先順位のあるABCという処理に return trueの場合とreturn falseの場合の処理の違いを頭の硬い私にも分かるように説明いただけると有難いです。
swordone

2017/10/01 01:59

> このfalseを返してくれるのは誰ですか? 指が触れている状態を指すならACTION_DWONがソレにあたりますか? それぞれのイベントのonTouchメソッドなどです。 ACTION_DOWNなどはonTouchメソッドを起動する際の引数であり、「どういうイベントが発生したか」をプログラムが判別するためのものです。 >もうそもそもここが謎ですね。onTouchEventメソッドの返り値は標準でfalseとは‥ 基本的にイベントを途中で止める必要はないため、標準でfalseなのです。 > 優先順位のあるABCという処理に return trueの場合とreturn falseの場合の処理の違いを頭の硬い私にも分かるように説明いただけると有難いです。 上記回答ではBがtrueを返した場合を説明しました。この場合は続くCは処理されずに終了しますが、 falseを返した場合は処理が続行され、Cのイベントも処理されることになります。
退会済みユーザー

退会済みユーザー

2017/10/01 04:16

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

2017/10/01 04:42

onTouchEventはbooleanを受け取ることはありません。Android OSがその辺の処理を管理します。
退会済みユーザー

退会済みユーザー

2017/10/01 05:22

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問