示例中心
功能在线体验
控制台

地图滑动手势与View滑动手势共存

该示例展示了如何将地图滑动手势与系统View手势做共存处理。
00:00 / 01:00
扫描二维码在手机端体验功能
体验移动端 扫码体验移动端

使用场景

如果您的app中使用了某一个tab页面来展示地图,就需要考虑对滑动手势进行区分,以便既能支持滑动地图,又能支持切换tab。

该demo给出了示例:从侧边开始滑动,则切换tab;否则滑动地图。

详细效果请见右侧视频。

用到产品

Android 地图 SDK

核心类/接口

接口

说明

版本

MapsInitializer

initialize(Context paramContext)

初始化高德地图Android API,为使用它包含的类做准备。 在这些类中,您如果正在使用MapFragment或MapView,并且调用getMap()获得非空的地图,您可以不需要调用这个方法。

V2.0.2起

TextureSupportMapFragment

newInstance()

使用默认的选项创建TextureSupportMapFragment

V3.1.0起

核心难点

 

  • 重写ViewPager canScroll方法,解决ViewPager和地图横向滑动冲突
public class ScrollViewPager extends ViewPager {

    public ScrollViewPager(Context context) {
        super(context);
    }

    public ScrollViewPager(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    @Override
    public boolean canScroll(View v, boolean checkV, int dx, int x, int y) {
        if (Math.abs(dx) > 50) {
            return super.canScroll(v, checkV, dx, x, y);
        } else {
            return true;
        }
    }
}

 

  • 动态初始化TextureSupportMapFragment
try {
    MapsInitializer.initialize(this.getApplicationContext());  //初始化TextureSupportMapFragment需要先设置context
} catch (RemoteException e) {
    e.printStackTrace();
}
mMapFragment = TextureSupportMapFragment.newInstance();
mFragments.add(mMapFragment);

 

00:00 / 01:00
扫描二维码在手机端体验功能
体验移动端 扫码体验移动端

使用场景

如果您的app中使用了某一个tab页面来展示地图,就需要考虑对滑动手势进行区分,以便既能支持滑动地图,又能支持切换tab。

该demo给出了示例:快速滑动、从侧边开始滑动,则切换tab;否则滑动地图。

详细效果请见右侧视频。

用到产品

iOS 地图SDK

核心类/接口

接口

说明

版本

UIPanGestureRecognizer

----

系统手势

----

核心难点

实现手势处理

- (void)panHandler:(UIPanGestureRecognizer *)gesture
{
    // NSLog(@"vvv %f, %f", [gesture velocityInView:_scrollView].x, [gesture velocityInView:_scrollView].y);
    // 设置触发条件
    if (gesture.state != UIGestureRecognizerStateEnded)
    {
        return;
    }

    if (fabs([gesture velocityInView:_scrollView].x) > 1200)
    {
        // -1 向左,1 向右
        int direction = fabs([gesture velocityInView:_scrollView].x) / [gesture velocityInView:_scrollView].x;
        int validIdx = 1;

        if (_currentIndex == validIdx && !_scrollView.isDecelerating)
        {
            CGFloat width = _scrollView.frame.size.width * (1 - direction);
            [_scrollView setContentOffset:CGPointMake(width, 0) animated:YES];
        }
    }
}

设置允许和scrollview上pan手势并发

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer
{
    return YES;
}