タイトル通り、Android アプリで ScrollView
のページ内に設置した MapView
をドラッグで操作できるようにする方法についてです。
というのも、ScrollView
の中に MapView
などのスクロールできる要素を置いてしまうと、MapView
を操作しようとしたときに親要素の ScrollView
がそのドラッグに反応してしまい、MapView
は操作できないという現象が発生します。
今回は、その対処方法についてです。
参考にさせていただいた記事はこちらから。
android – MapView inside a ScrollView? – Stack Overflow
https://stackoverflow.com/questions/6546108/mapview-inside-a-scrollview
方法としましては、MapView
を継承した CustomMapView
クラスを作成し、その中で地図上でドラッグを行った時の処理をオーバーライドします。
サンプルコードは下記のとおりです。
public class CustomMapView extends MapView { public CustomMapView(Context context, AttributeSet attrs) { super(context, attrs); } @Override public boolean dispatchTouchEvent(MotionEvent ev) { switch (ev.getAction()) { case MotionEvent.ACTION_UP: System.out.println("unlocked"); this.getParent().requestDisallowInterceptTouchEvent(false); break; case MotionEvent.ACTION_DOWN: System.out.println("locked"); this.getParent().requestDisallowInterceptTouchEvent(true); break; } return super.dispatchTouchEvent(ev); } }
なお、クラス名は任意の名前でOKです。
あとは、layout ファイルの MapView
を、上記のクラスと置き換えます。
<jp.co.cpointlab.xxxx.CustomMapView android:id="@+id/mapView" android:layout_width="match_parent" android:layout_height="400dp" />
修正するのは以上です!
それ以外のコードは、変更する必要はありませんでした。
実際にアプリを実行して動作を確認したところ、ScrollView
の中の MapView
がドラッグで操作できることを確認できました!
修正前は、ちょこっと動かすとすぐに ScrollView
が反応してしまい、マップを操作する事が出来なかったのですが、修正後は何のストレスもなく操作が出来るようになりました。
以上、Android アプリで ScrollView の中に配置した MapView をドラッグで操作できるようにする方法についてでした。
ご参考になれば幸いです。