地图阻尼运动

没错,还是关于地图的。

其实我是比较犹豫要不要为了这样一个东西写篇文章,因为我觉得这个东西比较简单,可是在网上搜了一大圈后,发现竟没有这方面的文章,好吧,可能是因为大伙觉得比较low,而没有写。

不过我还是写下来吧,万一以后有人用呢。

先看下什么是地图阻尼。
地图阻尼.gif

在这里我们每次点击左侧的加号时,地图层级加1,点击减号的时候,地图层级减1。

如果没有阻尼的话,我们的地图几乎会在瞬间(0.1s)进入指定的层级,动画僵硬,给人的美感太差。

有阻尼的话,我们可以让地图在指定的时间内(本demo中是1s),从层级A变化到层级B。

实现思路:

我们假如要在1s内,将地图层级从11变为13,那么我们就将这1秒钟分成10份,一份是0.1s,而每过一个0.1s,地图层级变化的增量就是(13-11)/10 = 0.2。这样我们可以每过0.1s就更新地图的层级(setZoomLevel :),就可以了。当1s结束的时候,地图层级刚好就是我们想要的层级,是不是很简单。

直接上代码:
//由于是弱业务,所以该代码写在`MapViewManager`类中。

/*定义地图缩放的持续时长*/
#define MAP_ZOOM_DURATION  1.0
/*地图从一个级别缩放至另一个级别,地图的缩放总次数*/
#define MAP_ZOOM_NUMS      10.0

/**
 阻尼效果改变地图等级
 
 @param currentLevel  当前的等级
 @param settingLevel  要设定的等级
 */
- (void)dampZoomingMapLevelFromCurrentValue:(float)currentLevel
                             ToSettingValue:(float)settingLevel{
    float unitZoomLevelDuringTime = MAP_ZOOM_DURATION/MAP_ZOOM_NUMS;
    float unitZoomLevelIncrement = (settingLevel - currentLevel)/MAP_ZOOM_NUMS;
    for (int i = 1; i<=MAP_ZOOM_NUMS; i++) {
        float tempZoomLevel = currentLevel+i*unitZoomLevelIncrement;
        dispatch_time_t time =  dispatch_time(DISPATCH_TIME_NOW, (uint64_t)(NSEC_PER_SEC * (i*unitZoomLevelDuringTime)));
        dispatch_after(time, dispatch_get_main_queue(), ^{
            [_mapView setZoomLevel:tempZoomLevel];
        });
    }
}

demo地址
我想这应该不会是地图系列的最后一篇。。

下面是地图系列的其他相关文章:
给你的地图模块动手术
给你的地图点灯

你可能感兴趣的:(地图阻尼运动)