安卓谷歌地图 |两指滚动 [英] Android Google Map | Two finger scrolling
问题描述
我正在使用 Google 地图,
I am working with Google Map,
我的情况是我在 ScrollView 中有一个地图片段,如果用户只触摸一个手指地图不应该工作,我只需要用两根手指滚动地图和正常的滚动视图应该工作.
My case is that I have a map fragment inside the ScrollView and I need to scroll the map only with two finger if user touches only one finger map should not work and normal Scroll View should work.
这是我到目前为止尝试过的 -
This is what i tried so far -
transparent_image.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
int action = event.getAction();
switch (action & MotionEvent.ACTION_MASK) {
case MotionEvent.ACTION_POINTER_DOWN:
showMessage("Double finger ACTION_POINTER_DOWN");
googleMap.getUiSettings().setScrollGesturesEnabled(false);
scroll_view.requestDisallowInterceptTouchEvent(true);
return true;
case MotionEvent.ACTION_POINTER_UP:
showMessage("Double finger ACTION_POINTER_UP");
googleMap.getUiSettings().setScrollGesturesEnabled(true);
scroll_view.requestDisallowInterceptTouchEvent(false);
return true;
default:
return true;
}
}
});
推荐答案
您可以在以下情况下实现原生 Android 应用程序的行为:
That behavior of native Android application you can achieve when:
1) 当用户将两个手指放在 MapFragment
上时,禁用 ScrollView
滚动并启用 GoogleMap
滚动;
1) disable ScrollView
scrolling and enable GoogleMap
scrolling when user placed two finger on MapFragment
;
2) 在其他情况下启用 ScrollView
滚动并禁用 GoogleMap
滚动.
2) enable ScrollView
scrolling and disable GoogleMap
scrolling in other case.
要禁用/启用 ScrollView
按条件滚动,您需要扩展 ScrollView
并覆盖 onTouchEvent()
方法以返回 false
当某些条件匹配时,例如,如 this answer 中的 约瑟夫·厄尔:
For disabling/enabling ScrollView
scrolling by condition, you need to extend ScrollView
and override the onTouchEvent()
method to return false
when some condition is matched, for example, as in this answer of Josep Earl:
public class LockableScrollView extends ScrollView {
private boolean mScrollable = true;
public LockableScrollView(Context context) {
super(context);
}
public LockableScrollView(Context context, AttributeSet attrs) {
super(context, attrs);
}
public LockableScrollView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
public void setScrollingEnabled(boolean enabled) {
mScrollable = enabled;
}
public boolean isScrollable() {
return mScrollable;
}
@Override
public boolean onTouchEvent(MotionEvent ev) {
switch (ev.getAction()) {
case MotionEvent.ACTION_DOWN:
// if we can scroll pass the event to the superclass
if (mScrollable) return super.onTouchEvent(ev);
// only continue to handle the touch event if scrolling enabled
return mScrollable; // mScrollable is always false at this point
default:
return super.onTouchEvent(ev);
}
}
@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
// Don't do anything with intercepted touch events if
// we are not scrollable
if (!mScrollable) return false;
else return super.onInterceptTouchEvent(ev);
}
}
在 GoogleMap
上启用/禁用滚动手势,您可以在 GoogleMap.getUiSettings() 上轻松调用
对象并确定两个手指在 setAllGesturesEnabled()
和 setScrollGesturesEnabled()
)MapFragment
上的触摸,您可以使用方法,基于 this社区维基的回答:
Enable/disable scroll gestures at GoogleMap
you can easily calling setAllGesturesEnabled()
and setScrollGesturesEnabled()
on GoogleMap.getUiSettings()
object and for determining touches of two fingers on MapFragment
you can use approach, based on this answer of community wiki:
public class TouchableWrapper extends FrameLayout {
private LockableScrollView mLockableScroll;
private GoogleMap mGoogleMap;
public TouchableWrapper(Context context) {
super(context);
}
public void setGoogleMapAndScroll(GoogleMap googleMap, LockableScrollView lockableScroll) {
mGoogleMap = googleMap;
mLockableScroll = lockableScroll;
}
@Override
public boolean dispatchTouchEvent(MotionEvent event) {
switch (event.getAction() & MotionEvent.ACTION_MASK) {
case MotionEvent.ACTION_DOWN:
mGoogleMap.getUiSettings().setScrollGesturesEnabled(false);
// UPDATE: add below line to disable zoom gesture
mGoogleMap.getUiSettings().setZoomGesturesEnabled(false);
mLockableScroll.setScrollingEnabled(true);
break;
case MotionEvent.ACTION_POINTER_DOWN:
mLockableScroll.setScrollingEnabled(false);
mGoogleMap.getUiSettings().setScrollGesturesEnabled(true);
// UPDATE: add below line to enable zoom gesture
mGoogleMap.getUiSettings().setZoomGesturesEnabled(true);
break;
case MotionEvent.ACTION_POINTER_UP:
// UPDATE: add below line to disable zoom gesture
mGoogleMap.getUiSettings().setZoomGesturesEnabled(false);
mGoogleMap.getUiSettings().setScrollGesturesEnabled(false);
mLockableScroll.setScrollingEnabled(true);
break;
case MotionEvent.ACTION_UP:
// UPDATE: add below line to disable zoom gesture
mGoogleMap.getUiSettings().setZoomGesturesEnabled(false);
mGoogleMap.getUiSettings().setScrollGesturesEnabled(false);
mLockableScroll.setScrollingEnabled(true);
break;
}
return super.dispatchTouchEvent(event);
}
}
MapFragment
在这种情况下可以是这样的:
MapFragment
in this case can be like that:
public class MultiTouchMapFragment extends MapFragment {
public View mOriginalContentView;
public TouchableWrapper mTouchView;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup parent, Bundle savedInstanceState) {
mOriginalContentView = super.onCreateView(inflater, parent, savedInstanceState);
mTouchView = new TouchableWrapper(getActivity());
mTouchView.addView(mOriginalContentView);
return mTouchView;
}
@Override
public View getView() {
return mOriginalContentView;
}
}
和 MainActivity
就像这样(不需要在地图上添加标记 - 它只是为了测试):
and MainActivity
like that (there is no need to add marker on map - it's just for test):
public class MainActivity extends AppCompatActivity implements OnMapReadyCallback {
private LockableScrollView mLockableScrollView;
private MultiTouchMapFragment mapFragment;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mLockableScrollView = (LockableScrollView) findViewById(R.id.lockable_scroll);
mapFragment = (MultiTouchMapFragment) getFragmentManager()
.findFragmentById(R.id.map_fragment);
mapFragment.getMapAsync(this);
}
@Override
public void onMapReady(GoogleMap googleMap) {
LatLng marker = new LatLng(48, 38);
googleMap.addMarker(new MarkerOptions().position(marker).title("Scroll"));
googleMap.getUiSettings().setAllGesturesEnabled(false);
mapFragment.mTouchView.setGoogleMapAndScroll(googleMap, mLockableScrollView);
}
}
最后,MainActivity
的activity_main.xml
,例如,可以是这样的:
and, finally, activity_main.xml
for MainActivity
, for example, can be like this:
<[your_package_name].LockableScrollView
android:id="@+id/lockable_scroll"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<ImageView
android:layout_width="match_parent"
android:layout_height="300dp"
android:src="@mipmap/ic_launcher"/>
<fragment
android:id="@+id/map_fragment"
android:name="[your_package_name].MultiTouchMapFragment"
android:layout_width="match_parent"
android:layout_height="300dp"/>
<ImageView
android:layout_width="match_parent"
android:layout_height="300dp"
android:src="@mipmap/ic_launcher"/>
</LinearLayout>
</[your_package_name].LockableScrollView>
就是这样.
这篇关于安卓谷歌地图 |两指滚动的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!