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

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

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

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

Android

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

Google マップ

Google Mapは、Google社がオンラインで提供している地図・ローカル検索サービスです。GIS(Geographic Information System:地理情報システム)の中の「WebGIS」に該当します。地図・航空写真・地形の表示方式があり、それぞれユーザーが縮尺を調整して表示させることができます。地域の情報サービスを検索する機能やルート検索の機能も搭載されています。

Q&A

解決済

1回答

2380閲覧

SeekBar tapでの操作をさせない

退会済みユーザー

退会済みユーザー

総合スコア0

Java

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

Android

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

Google マップ

Google Mapは、Google社がオンラインで提供している地図・ローカル検索サービスです。GIS(Geographic Information System:地理情報システム)の中の「WebGIS」に該当します。地図・航空写真・地形の表示方式があり、それぞれユーザーが縮尺を調整して表示させることができます。地域の情報サービスを検索する機能やルート検索の機能も搭載されています。

0グッド

0クリップ

投稿2018/08/17 08:10

編集2018/08/17 10:27

SeekBarでは、スライド以外にも
タップで、progressの変更ができるのですが
タップの操作をさせないようにし、スライド操作だけさせるようにしたいです。

https://stackoverflow.com/questions/5126091/prevent-single-tap-from-changing-seekbar-progress/16992969

上記を参考にしようとしたのですが、
AndroidどころかJava自体も始めて3週間くらいしか経たない、初心者なので
どのコードも、よく理解ができませんでした。

また、本来やりたいことは、
以前私が質問した、https://teratail.com/questions/141687
こちらです。
自己解決したのですが、これだと、
Progressの49, 51をタップで飛ばした場合、レイヤが切り替わりません。

そこでSeekBarのスライドだけで、必ず、51,49を通過するようにし、レイヤを切り替えさせたいです。

本来なら、Layerを、前に設定されたものと比較して
下記のようにするのがベストだと思いますが、
なかなか、参考になりそうなものも出てこなく
レイヤの情報を取得できそうなメソッドもなかったので。。。
SeekBarのタップでのprogressを無効にしたいと思いました。

Java

1if (LayerA was already set){ 2 ・透過機能だけ 3}else{ 4 ・remove Layer B 5 ・set Layer A 6 ・透過機能 7}

以下が私のコードです。

Java

1public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { 2 if(mTileOverlay != null && seekBar.getProgress() > 50) { 3 4 if(seekBar.getProgress() == 51){ 5 mTileOverlay.remove(); //remove Layer B 6 setupOverlayLayersA(_mMap); //set Layer A 7 } 8 9 mTileOverlay.setTransparency(1.0f - ((float) progress - 50f) / 50f); 10 11 12 }else if (seekBar.getProgress() == 50) { 13 14 mTileOverlay.setTransparency(1.0f); 15 16 }else if(seekBar.getProgress() < 50){ 17 18 if(seekBar.getProgress() == 49){ 19 mTileOverlay.remove(); //remove Layer B 20 setupOverlayLayersB(_mMap); //set Layer B 21 } 22 23 mTileOverlay.setTransparency((float) progress / (float) 50); 24 25 } 26 }

SeekBarのスライドだけにするにはどうしたら良いでしょうか?
または、前にsetしたレイヤの情報を取得するには、どうしたら良いでしょうか?


*補足します。
daisuke7さんの実装方法にとても感動したので、補足しました。
下記のコメントも読んでいただけますと、今後のお役に立てるかもしれません!

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

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

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

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

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

guest

回答1

0

ベストアンサー

現在オーバーレイしているレイヤー種別を記録しておけば良いと思います。
想定レイヤーと違うならレイヤー変更。
ちょうど49,51とか考える必要はありません。

Java

1 if(mTileOverlay != null && seekBar.getProgress() > 50) { 2 3 if (今オーバーレイしてるレイヤー != レイヤーA{ 4 mTileOverlay.remove(); //remove Layer B 5 setupOverlayLayersA(_mMap); //set Layer A 6 今オーバーレイしてるレイヤー = レイヤーA; 7 } 8 9 mTileOverlay.setTransparency(1.0f - ((float) progress - 50f) / 50f); 10 11 12 }else if (seekBar.getProgress() == 50) { 13 14 mTileOverlay.setTransparency(1.0f); 15 16 }else if(seekBar.getProgress() < 50){ 17 18 if (今オーバーレイしてるレイヤー != レイヤーB{ 19 mTileOverlay.remove(); //remove Layer B 20 setupOverlayLayersB(_mMap); //set Layer B 21 今オーバーレイしてるレイヤー = レイヤーB; 22 } 23 24 mTileOverlay.setTransparency((float) progress / (float) 50); 25 26 } 27

投稿2018/08/17 09:01

daisuke7

総合スコア1563

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

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

退会済みユーザー

退会済みユーザー

2018/08/17 09:26

ご返答ありがとうございます。 if (今オーバーレイしてるレイヤー != レイヤーB) { mTileOverlay.remove(); //remove Layer B setupOverlayLayersB(_mMap); //set Layer B 今オーバーレイしてるレイヤー = レイヤーB; } こちらにある、レイヤーBをどう取得するかわかりません。 setupOverlayLayersBはvoid なのですが、適当な型にしてreturnでもらうというやり方が良いでしょうか?
daisuke7

2018/08/17 09:28

「今オーバーレイしてるレイヤー」は、Activity(あるいはFragment)に自分で定義した変数 という意味で書いています。 つまり自分で記録しておくだけです。
退会済みユーザー

退会済みユーザー

2018/08/17 09:50

なるほど、、、 それでは、以下のような感じでしょうか? class MapsActivity { String nowlayer; .... .... .... if(mTileOverlay != null && seekBar.getProgress() > 50) { if (nowLayer !="レイヤーA") { mTileOverlay.remove(); //remove Layer B setupOverlayLayersA(_mMap); //set Layer A nowLayer = レイヤーA; } mTileOverlay.setTransparency(1.0f - ((float) progress - 50f) / 50f); }else if (seekBar.getProgress() == 50) { mTileOverlay.setTransparency(1.0f); }else if(seekBar.getProgress() < 50){ if (nowLayer != レイヤーB) { mTileOverlay.remove(); //remove Layer B setupOverlayLayersB(_mMap); //set Layer B nowLayer = レイヤーB; } mTileOverlay.setTransparency((float) progress / (float) 50); }
daisuke7

2018/08/17 09:54

nowLayerがStringで良いかはわかりませんが、そんな感じです。 それと、初期状態でレイヤーA/Bどちらかのオーバーレイがあるなら nowLayerの初期状態もそのレイヤーに設定すれば良いですが、 オーバーレイしていない場合は初期状態を「オーバーレイなし」にしなければなりません。
退会済みユーザー

退会済みユーザー

2018/08/17 10:03 編集

初期をレイヤーAにしています。 そこで、レイヤーAの時 : nowLayer = 0; レイヤーBの時 : nowLayer = 1; にしても、Bの方にスライドしても初期に設定したレイヤしか反映されません。 何が問題でしょうか。
daisuke7

2018/08/17 10:04

今のコードを見せてください。
退会済みユーザー

退会済みユーザー

2018/08/17 10:07 編集

class MapsActivity { int nowLayer = 0; .... .... .... onMapready(){ //permissionなど setupOverlayLayersA } //SeekBarのmethod内 public void onProgressChanged(SeekBar seekBar, int progress, boolean fromTouch) { if(mTileOverlay != null && seekBar.getProgress() > 50) { if (nowLayer !=0) { mTileOverlay.remove(); //remove Layer B setupOverlayLayersA(_mMap); //set Layer A nowLayer = レイヤーA; } mTileOverlay.setTransparency(1.0f - ((float) progress - 50f) / 50f); }else if (seekBar.getProgress() == 50) { mTileOverlay.setTransparency(1.0f); }else if(seekBar.getProgress() < 50){ if (nowLayer == 1) { mTileOverlay.remove(); //remove Layer B setupOverlayLayersB(_mMap); //set Layer B nowLayer = レイヤーB; } mTileOverlay.setTransparency((float) progress / (float) 50); } このような感じです。
daisuke7

2018/08/17 10:07

> nowLayer = レイヤーA; これでビルドしているのですか?
退会済みユーザー

退会済みユーザー

2018/08/17 10:09 編集

すいません、変更し忘れました。 下記に再度記述いたします。 class MapsActivity { int nowLayer = 0; .... .... .... onMapready(){ //permissionなど setupOverlayLayersA(_mMap) } //SeekBarのmethod内 public void onProgressChanged(SeekBar seekBar, int progress, boolean fromTouch) { if(mTileOverlay != null && seekBar.getProgress() > 50) { if (nowLayer !=0) { mTileOverlay.remove(); //remove Layer B setupOverlayLayersA(_mMap); //set Layer A nowLayer = 0; } mTileOverlay.setTransparency(1.0f - ((float) progress - 50f) / 50f); }else if (seekBar.getProgress() == 50) { mTileOverlay.setTransparency(1.0f); }else if(seekBar.getProgress() < 50){ if (nowLayer == 0) { mTileOverlay.remove(); //remove Layer B setupOverlayLayersB(_mMap); //set Layer B nowLayer = 1; } mTileOverlay.setTransparency((float) progress / (float) 50); }
daisuke7

2018/08/17 10:15

}else if(seekBar.getProgress() < 50){ if (nowLayer == 0) { mTileOverlay.remove(); //remove Layer B setupOverlayLayersB(_mMap); //set Layer B nowLayer = 1; } この if (nowLayer == 0) { の部分が先程と違いますが、 実行しているコードを「そのままコピペ」していますか?
退会済みユーザー

退会済みユーザー

2018/08/17 10:15

すいません。 できました。。。 else if(seekBar.getProgress() < 50)こちらの方を、else if(nowLayer ==0) に変えてしまっていました。 これでは、変わるわけが無いですね。 ありがとうございました!
退会済みユーザー

退会済みユーザー

2018/08/17 10:19 編集

大変申し訳ございませんでした。 しかし、このようにとても簡単に実装するための方法もあるのですね。。。 私はてっきり、tileoverlayの関数で、get~ みたいなものを使用し 今のレイヤ情報を取得して それが、Aでなかったら.... みたいに処理をしなければいけないと思っていました。 今回のケースだけでなく、今後の実装でも活かせそうです! ありがとうございました。
daisuke7

2018/08/17 10:20

コードが想定通りに動かないときは、悪いのはコードではなく100%自分です。 コードは言われたとおりに動くだけです。 動かしているコード以外を信じるのもだめです。 コードを検証するなら、実際に動かしているコードを読みましょう。 コピペするなら確実にそのままコピペしましょう。 手で書き写しちゃだめです。手で書くときに大事なことを失います。 これは初心者だからってことではなく、熟練プログラマでも同じです。
退会済みユーザー

退会済みユーザー

2018/08/17 10:23 編集

承知しました。ご教示ありがとうございます。 コード検証の際は特に気をつけます。 今回の実装は、大変参考になりました。 独学だと、このような実装方法に出会うこともなかなか無いので とても感動しました。 本当にありがとうございました!!!
daisuke7

2018/08/17 10:22

>しかし、このようにとても簡単に実装するための方法もあるのですね。。。 >私はてっきり、tileoverlayの関数で、get~ みたいなものを使用し >今のレイヤ情報を取得して それが、Aでなかったら.... もちろんそういう手法もありますし、そうしないと駄目な場合もあります。 しかし自分のみが状態を変更しているのであれば、自分自身は最新状態を知っています。 そういう仮定があれば、楽な方法もあります。
退会済みユーザー

退会済みユーザー

2018/08/17 10:24

はい! ありがとうございました!!!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問