如何在滚动视图中设置谷歌地图片段 [英] how to set google map fragment inside scroll view
问题描述
我想在垂直 ScrollView
内设置一个谷歌地图片段,当我做地图不垂直缩放时,如何覆盖 MapView
上的触摸事件侦听器ScrollView
的监听器?
I want to set a Google map fragment inside vertical ScrollView
, when I do the map does not zoom vertically, how can I override the touch event listener on MapView
over the listener of ScrollView
?
这是我的xml代码:
<ScrollView android:layout_height="wrap_content"
android:layout_width="fill_parent"
android:layout_above="@id/footer"
android:layout_below="@id/title_horizontalScrollView">
///other things
<fragment
android:id="@+id/map"
android:layout_width="fill_parent"
android:layout_height="300dp"
class="com.google.android.gms.maps.SupportMapFragment"
/>
//other things
推荐答案
创建自定义SupportMapFragment
以便我们可以覆盖其触摸事件:
Create a custom SupportMapFragment
so that we can override its touch event:
解决方法MapFragment.java
import android.content.Context;
import android.os.Bundle;
import android.widget.FrameLayout;
import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;
import com.google.android.gms.maps.SupportMapFragment;
public class WorkaroundMapFragment extends SupportMapFragment {
private OnTouchListener mListener;
@Override
public View onCreateView(LayoutInflater layoutInflater, ViewGroup viewGroup, Bundle savedInstance) {
View layout = super.onCreateView(layoutInflater, viewGroup, savedInstance);
TouchableWrapper frameLayout = new TouchableWrapper(getActivity());
frameLayout.setBackgroundColor(getResources().getColor(android.R.color.transparent));
((ViewGroup) layout).addView(frameLayout,
new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT));
return layout;
}
public void setListener(OnTouchListener listener) {
mListener = listener;
}
public interface OnTouchListener {
public abstract void onTouch();
}
public class TouchableWrapper extends FrameLayout {
public TouchableWrapper(Context context) {
super(context);
}
@Override
public boolean dispatchTouchEvent(MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
mListener.onTouch();
break;
case MotionEvent.ACTION_UP:
mListener.onTouch();
break;
}
return super.dispatchTouchEvent(event);
}
}
}
在上面的这个类中,我们通过使用扩展 FrameLayout
的 TouchableWrapper.class
拦截触摸事件.还有一个自定义侦听器 OnTouchListener
将触摸事件分派给处理地图的名为 MyMapActivity
的主活动.当触摸事件发生时,dispatchTouchEvent
将被调用,监听器mListener
将处理它.
In this above class, we intercept the touch event by using TouchableWrapper.class
that extends the FrameLayout
. There is also a custom listener OnTouchListener
to dispatch the touch event to the main activity named MyMapActivity
that handles the map. When the touch event occurred, dispatchTouchEvent
will be called and the listener mListener
will handle it.
然后用这个 class="packagename.WorkaroundMapFragment"
而不是 com.google.android.gms.maps.SupportMapFragment
Then replace fragment class in xml with this class="packagename.WorkaroundMapFragment"
instead of com.google.android.gms.maps.SupportMapFragment
然后在您的活动中初始化地图如下:
Then in your activity initialize map as follows:
private GoogleMap mMap;
在 onCreate 中这样做:
inside onCreate do this:
// check if we have got the googleMap already
if (mMap == null) {
SupportMapFragment mapFragment = (WorkaroundMapFragment) getChildFragmentManager().findFragmentById(R.id.map);
mapFragment.getMapAsync(new OnMapReadyCallback() {
Override
public void onMapReady(GoogleMap googleMap)
{
mMap = googleMap;
mMap.setMapType(GoogleMap.MAP_TYPE_NORMAL);
mMap.getUiSettings().setZoomControlsEnabled(true);
mScrollView = findViewById(R.id.scrollMap); //parent scrollview in xml, give your scrollview id value
((WorkaroundMapFragment) getChildFragmentManager().findFragmentById(R.id.map))
.setListener(new WorkaroundMapFragment.OnTouchListener() {
@Override
public void onTouch()
{
mScrollView.requestDisallowInterceptTouchEvent(true);
}
});
}
});
}
更新:根据@javacoder123 的回答将回答更新为 getMapAsync()
Update: Answer updated to getMapAsync()
based on answer by @javacoder123
这篇关于如何在滚动视图中设置谷歌地图片段的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!