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

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

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

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

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

Q&A

解決済

1回答

824閲覧

ImageButtonでOntouch(左右スワイプ)とOnclickの両方を認識

yamayamak

総合スコア131

Java

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

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

0グッド

0クリップ

投稿2019/03/20 07:22

編集2019/03/20 10:44

Androidで左右スワイプを行いたいです。FragmentのonCreateViewに以下を記述しています。
(Android Studio 3.3.1を利用しています。)

Fragment内は複数のimageViewで画面が覆われていて背後のrootViewのスワイプを認識してくれないように見えてます。
また、imageViewにはOnclickを設定しています。
imageViewを一部、無くして動作を確認すると動いています。

このようなimageViewで満たされたFragment内の画面全体に対して、スワイプを認識させるにはどうすれば良いでしょうか?
できれば、FragmentよりActivityの全体で左右のスワイプを認識したいのですが、同様にGestureDetectorを認識してくれませんので、背後?か画面全体でも認識できる方法をお願いします。

ちなみに、上下のViewPagerでFragment画面を切り替えているのですが、上下スワイプは認識しています。

rootView = inflater.inflate(frag_tab1, container, false); final GestureDetector gesture = new GestureDetector(getActivity(), new GestureDetector.SimpleOnGestureListener() { @Override public boolean onDown(MotionEvent e) { return true; } @Override public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) { final int SWIPE_MIN_DISTANCE = 20; final int SWIPE_MAX_OFF_PATH = 100; final int SWIPE_THRESHOLD_VELOCITY = 200; try { // 左右スワイプ処理用 if (Math.abs(e1.getY() - e2.getY()) > SWIPE_MAX_OFF_PATH) {// Y軸の移動距離が大きすぎる場合 // 何もしない } // 開始位置から終了位置の移動距離が指定値より大きい// X軸の移動速度が指定値より大きい else if (e1.getX() - e2.getX() > SWIPE_MIN_DISTANCE && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) { textView2.setText("右から左"); } // 終了位置から開始位置の移動距離が指定値より大きい// X軸の移動速度が指定値より大きい else if (e2.getX() - e1.getX() > SWIPE_MIN_DISTANCE && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) { textView2.setText("左から右"); } } catch (Exception e) { // nothing } return super.onFling(e1, e2, velocityX, velocityY); } }); rootView.setOnTouchListener(new View.OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { return gesture.onTouchEvent(event); } }); // Return処理 return rootView;

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

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

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

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

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

guest

回答1

0

自己解決

ImageButtonでは、OntouchとOnclickの両方を認識させる場合に以下のように記述すればよかったようです。
(Onclick設定はLayoutのXMLで記載しています。)

とりあえず、私は以下でOnClickもonFling(スワイプ)も動作できました。

(参照)
https://stackoverflow.com/questions/19538747/how-to-use-both-ontouch-and-onclick-for-an-imagebutton

Java

1// 左右スワイプはMainActivityで利用する 2final GestureDetector gesture = new GestureDetector(getActivity(), new GestureDetector.SimpleOnGestureListener() { 3 @Override 4 public boolean onDown(MotionEvent e) { 5 return true; 6 } 7 @Override 8 public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) { 9 final int SWIPE_MIN_DISTANCE = 20; 10 final int SWIPE_MAX_OFF_PATH = 100; 11 final int SWIPE_THRESHOLD_VELOCITY = 200; 12 try { 13 // 左右スワイプ処理用 14 if (Math.abs(e1.getY() - e2.getY()) > SWIPE_MAX_OFF_PATH) {// Y軸の移動距離が大きすぎる場合 15 //textView2.setText("縦の移動距離が大きすぎ"); -> 何もしない 16 } 17 // 開始位置から終了位置の移動距離が指定値より大きい// X軸の移動速度が指定値より大きい 18 else if (e1.getX() - e2.getX() > SWIPE_MIN_DISTANCE && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) { 19 //textView2.setText("右から左"); 20 mListener.toRightJob(); 21 } 22 // 終了位置から開始位置の移動距離が指定値より大きい// X軸の移動速度が指定値より大きい 23 else if (e2.getX() - e1.getX() > SWIPE_MIN_DISTANCE && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) { 24 //textView2.setText("左から右"); 25 mListener.toLeftJob(); 26 } 27 } catch (Exception e) { 28 // nothing 29 } 30 return super.onFling(e1, e2, velocityX, velocityY); 31 } 32}); 33rootView.setOnTouchListener(new View.OnTouchListener() { 34 @Override 35 public boolean onTouch(View v, MotionEvent event) { 36 return gesture.onTouchEvent(event); 37 } 38}); 39// ImageButtonにOnTouchListenerを追加(OnClickを設定していると効かない) 40for (int i = 1; i <= 100; i++) { 41 String idName = "idName" + String.valueOf(i); 42 int intId = getResources().getIdentifier(idName, "id", getActivity().getPackageName()); 43 ImageButton iBtn = (ImageButton) thisFragment.findViewById(intId); 44 iBtn.setOnTouchListener(new View.OnTouchListener() { 45 @Override 46 public boolean onTouch(View arg0, MotionEvent event) { 47 if (gesture.onTouchEvent(event)) { 48 // single tap 49 return false; 50 } else { 51 // your code for move and drag 52 } 53 return false; 54 } 55 }); 56}

投稿2019/03/20 10:43

yamayamak

総合スコア131

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問