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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Java

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

Android Studio

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

Q&A

解決済

1回答

1989閲覧

メソッド間の移動

rvsezuki

総合スコア66

Java

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

Android Studio

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

0グッド

0クリップ

投稿2017/02/02 08:29

編集2017/02/02 10:46

現在横スワイプをする方法を考えています。

(ア) @Override public boolean onTouchEvent(MotionEvent event) { return mGestureDetector.onTouchEvent(event);(エ) } // タッチイベントのリスナー private final GestureDetector.SimpleOnGestureListener mOnGestureListener = new GestureDetector.SimpleOnGestureListener() { // フリックイベント //@Override(オ) public boolean onFling(MotionEvent event1, MotionEvent event2, float velocityX, float velocityY) { try { // 移動距離・スピードを出力 float distance_x = Math.abs((event1.getX() - event2.getX())); float velocity_x = Math.abs(velocityX); //textView1.setText("横の移動距離:" + distance_x + " 横の移動スピード:" + velocity_x); // Y軸の移動距離が大きすぎる場合 if (Math.abs(event1.getY() - event2.getY()) > SWIPE_MAX_OFF_PATH) { //textView2.setText("縦の移動距離が大きすぎ"); } // 開始位置から終了位置の移動距離が指定値より大きい // X軸の移動速度が指定値より大きい else if (event1.getX() - event2.getX() > SWIPE_MIN_DISTANCE && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) { //textView2.setText("右から左"); } // 終了位置から開始位置の移動距離が指定値より大きい // X軸の移動速度が指定値より大きい else if (event2.getX() - event1.getX() > SWIPE_MIN_DISTANCE && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) { //textView2.setText("左から右"); } } catch (Exception e) { // TODO } return false; } }; @Override public boolean dispatchTouchEvent(final MotionEvent event) { (イ) return mOnGestureListener.onTouchEvent(event); (ウ) return super.dispatchTouchEvent(event); }

メイン画面に触れると
dispatchTouchEventメソッドに入るのですが、
横スワイプ検出なら(イ)から(ア)に移り、右移動なのか左移動なのかをswitchして、それにあった動作をさせたいです。
上下スクロールなら(ウ)に進み終了

現在上記のところまで来たのですが、
(イ)のところでどのような値を渡して(ア)以降を進めれば良いのか
わかりません。

現在上記のコードで動かしたところ(イ)から(ア)には移るのですが、(エ)部分で止まってしまいます。(エ)さえ通せれば、その後(オ)で処理をできるのですが.....

訂正版

現在横スワイプをする方法を考えています。

// タッチイベントのリスナー private final GestureDetector.SimpleOnGestureListener mOnGestureListener = new GestureDetector.SimpleOnGestureListener() { // フリックイベント //@Override public boolean onFling(MotionEvent event1, MotionEvent event2, float velocityX, float velocityY) { try { // 移動距離・スピードを出力 float distance_x = Math.abs((event1.getX() - event2.getX())); float velocity_x = Math.abs(velocityX); //textView1.setText("横の移動距離:" + distance_x + " 横の移動スピード:" + velocity_x); // Y軸の移動距離が大きすぎる場合 if (Math.abs(event1.getY() - event2.getY()) > SWIPE_MAX_OFF_PATH) { //textView2.setText("縦の移動距離が大きすぎ"); } // 開始位置から終了位置の移動距離が指定値より大きい // X軸の移動速度が指定値より大きい //右から左へスワイプ else if (event1.getX() - event2.getX() > SWIPE_MIN_DISTANCE && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) { //textView2.setText("右から左"); } // 終了位置から開始位置の移動距離が指定値より大きい // X軸の移動速度が指定値より大きい //左から右へスワイプ else if (event2.getX() - event1.getX() > SWIPE_MIN_DISTANCE && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) { //textView2.setText("左から右"); } } catch (Exception e) { // TODO } return false; } }; @Override public boolean dispatchTouchEvent(final MotionEvent event) { return super.dispatchTouchEvent(event); }

メイン画面に触れると
dispatchTouchEventメソッドに入るのですが、その後の動作がわかりません。

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

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

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

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

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

guest

回答1

0

ベストアンサー

・ア〜オの記載を削除してください。
・onTouchEventは不要です、削除してください。
・イはreturnじゃなく変数に入れてください。
・onFlingの判定文の中でスワイプとなるブロックに「スワイプ!!」とコメントしてください。

上記の内容を行なって質問に追記してください。

投稿2017/02/02 10:28

yona

総合スコア18155

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

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

rvsezuki

2017/02/02 10:48

public boolean dispatchTouchEvent(final MotionEvent event) 部分は上下スクロールでもタブクリックでもnullになります..... 何か取れたらいいんですけどnullばかりで全くわかりません。 よろしくお願いいたします。
yona

2017/02/02 11:56

なにがnullになっているのはなんですか?
rvsezuki

2017/02/03 01:11

public boolean dispatchTouchEvent(final MotionEvent event) のところでデバックしてみたところ画面をタッチ,上下スクロールしてみたところeventがnullでした。 また横スワイプ動作は反応しませんでした。
rvsezuki

2017/02/03 01:19

ごめんなさいnullではないです。 画面タッチでも上下スクロールでもdispatchTouchEventのところが以下のようになってました。 MotionEvent { action=ACTION_DOWN, actionButton=0, id[0]=0, x[0]=426.26953, y[0]=1008.3594, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=0, eventTime=149638, downTime=149638, deviceId=0, source=0x1002 }
yona

2017/02/03 01:28

それだとなにが困るんですか?
rvsezuki

2017/02/03 01:32

いろいろと実機をつないで実験したところ @Override public boolean dispatchTouchEvent(final MotionEvent event) {(ア) return super.dispatchTouchEvent(event);(イ) } 指を上下スクロール,左右スワイプ,画面タッチ操作を行う (ア)action=ACTION_DOWN ↓ (イ)action=ACTION_DOWN ↓ (ア)action=ACTION_MOVE ↓ (イ)action=ACTION_MOVE ↓ (ア)action=ACTION_UP ↓ (イ)action=ACTION_UP となって画面が動く ようになっていました。 全ての動作で同じ動きをしていました。
yona

2017/02/03 01:51

なんでdispatchTouchEventのreturnのところがsuperを読んでいるだけなんですか?スワイプを判定するならmGestureDetector.onTouchEvent(event)を使わないといけないことは理解していないんですか?
rvsezuki

2017/02/03 02:09

return mGestureDetector.onTouchEvent(event);を使って詳細な動きを取得することは 理解してたのですが、boolean android.view.GestureDetector.onTouchEvent(android.view.MotionEvent)' on a null object reference となって止まってしまって困っていたのです。
yona

2017/02/03 02:30

何故それをコメントで聞かないんでしょうか? エラーログを質問に追記してください。
rvsezuki

2017/02/03 02:39

申し訳ないです。 エラーログは FATAL EXCEPTION: main Process: test.app.com, PID: 2444 java.lang.NullPointerException: Attempt to invoke virtual method 'boolean android.view.GestureDetector.onTouchEvent(android.view.MotionEvent)' on a null object reference at text.app.com.dispatchTouchEvent です。
yona

2017/02/03 02:55

mGestureDetectorとeventのどちらがnullですか?
rvsezuki

2017/02/03 03:02

mGestureDetector=nullになります。
yona

2017/02/03 03:09

onTouchEventの時はできていたんですよね?
rvsezuki

2017/02/03 03:27

mGestureDetectorの部分を return onTouchEvent(event);に変えた場合は ↓に移り @Override public boolean onTouchEvent(MotionEvent event) {(ア) return mGestureDetector.onTouchEvent(event); } (ア)の部分で停止してしまいます。 public boolean onTouchEvent(MotionEvent event) を削除した場合は @Override public boolean dispatchTouchEvent(final MotionEvent event) { return onTouchEvent(event); } の中で action=ACTION_DOWN ↓ action=ACTION_DOWN ↓ action=ACTION_MOVE ↓ action=ACTION_MOVE ↓ action=ACTION_UP ↓ action=ACTION_UP と回るだけです。(こちらは画面が動きません*落ちるわけではない)
yona

2017/02/03 03:39 編集

私が聞いているのは、なぜonTouchEventで mGestureDetectorを使っていた時はnullになっていないのに、dispatchTouchEventでmGestureDetectorを使った時はnullになるのかです。 それ以外のことは聞いていないし、やってくださいとも言っていないです。 今回の件でonTouchEventはあなたが呼ぶものではありません。
rvsezuki

2017/02/03 04:16

@Override public boolean onTouchEvent(final MotionEvent event) { return mGestureDetector.onTouchEvent(event); } の時は画面に触れても反応しませんでした。 デバックしても通過している気配なし。(つまりスルー?) かといって別にエラーになって落ちることもありませんでした。 ここからは私の考えですが、listviewを触れてもonTouchEventが反応しないのはlistviewが何かの上に乗っていて、その何かに反応するからonTouchEventはスルーされているのかなと考えていました。 しかしlistviewを触った時は public boolean dispatchTouchEvent(final MotionEvent event) 部分は反応していますので何かの上に乗っているというわけでもないような,,,,
rvsezuki

2017/02/03 06:54

どうやらlistviewにはonTouchEventが通らないようです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問