如何将图块添加到谷歌地图并为其设置动画,即不断用新图块替换它们

Posted

技术标签:

【中文标题】如何将图块添加到谷歌地图并为其设置动画,即不断用新图块替换它们【英文标题】:How to add tiles to google map and animating them i.e replacing them wiith new tiles continuously 【发布时间】:2016-08-13 10:15:08 【问题描述】:

我正在从缓存中向 Google 地图添加多个 TileOverlay。当尝试使用处理程序通过更改它们的可见性来为它们设置动画时,在第一次播放期间地图上的叠加层会闪烁。

还有其他方法可以实现吗?

public class LocalTileProvider implements TileProvider 
    private String url;
    DatabaseHelper db;
    String type;
    // private Paint opacityPaint = new Paint();
    String newurl= PathFinder.rainradar_HDBaseurl; 
    String uid;

    public LocalTileProvider(String uid,DatabaseHelper cache,String type)
        this.uid=uid;
        this.db=cache;
        this.type=type;
    

    //taking the tile from SQLITEDATABASE 
    @Override
    public Tile getTile(int x, int y, int zoom)
        Tile tile = null;       
        if(db.ispresent(uid, zoom,x , y,type)) 
            byte[] b=db.gettiles(uid, zoom,x , y,type);
            tile = new Tile(256, 256, b);
            return tile; 
        
        return NO_TILE;
     

以下是将这些图块添加到 Google 地图的代码

LocalTileProvider provider1 = new LocalTileProvider(uidList.get(0), db, TAG);
TileOverlayOptions  top1 = new TileOverlayOptions().tileProvider(provider1).visible(true);
tileoverlay_1 = googleMap.addTileOverlay(top1);

添加它们后,我通过切换图块的可见性来使用处理程序播放动画

public void start() 
    btn_play.setEnabled(true);
    tileoverlay_default.setVisible(false);
    runnable_animation = new Runnable() 
        @Override
        public void run() 
            //tileoverlay_default.setVisible(false);
            isDownloading = false;
            // stop_download=true;
            isRunning = true;
            btn_play.setBackgroundResource(R.drawable.player_pause_2x);
            setVisibility(global);

            if (global == 11) 
                global = 0;              
             else 
                global = global + 1;
             
            mHandler_animation.postDelayed(this, 1000);
        
    ;
    mHandler_animation.post(runnable_animation);

【问题讨论】:

请不要重复问同一个问题。这被认为是 Stack Overflow 上的噪音。如果您的问题因无法回答或没有引起回复而关闭,那么首先要做的是改进问题;对此的一些指导是given here。低质量或无法回答的问题通常会被关闭,但如果得到改进或澄清(视情况而定),可以重新打开。 @user2197811 你找到解决方案了吗?这是谷歌地图的一个重大问题,我也找不到解决方案。 【参考方案1】:

我知道这是一个非常古老的问题,但如果有人正在寻找这个问题的答案,我想我可能会发布我的答案。

当您将 TileOverlay 添加到地图时,它闪烁的原因有两个。

    切片未缓存,必须加载 图块正在淡入(默认行为)

从您的代码的外观来看,您正在缓存磁贴,因此阻止它们闪烁所需要做的就是关闭淡入行为:

LocalTileProvider provider1 = new LocalTileProvider(uidList.get(0), db, TAG);
TileOverlayOptions  top1 = new TileOverlayOptions().tileProvider(provider1).visible(true);
TileOverlay newTileOverlay = map.addTileOverlay(overlay);
tileoverlay_1 = googleMap.addTileOverlay(top1);
tileoverlay_1.setFadeIn(false); //Stop cached tiles from flickering in

【讨论】:

【参考方案2】:
public class LocalTileProvider implements TileProvider
    
        private String url;
        DatabaseHelper db;
        String type;
       // private Paint opacityPaint = new Paint();
       String newurl= PathFinder.rainradar_HDBaseurl; 
        String uid;
         public LocalTileProvider(String uid,DatabaseHelper cache,String type)
        
              this.uid=uid;
             this.db=cache;
             this.type=type;
        

    //taking the tile from SQLITEDATABASE 
        @Override
        public Tile getTile(int x, int y, int zoom)
        

             Tile tile = null;


            if(db.ispresent(uid, zoom,x , y,type))
            

                byte[] b=db.gettiles(uid, zoom,x , y,type);
                 tile = new Tile(256, 256, b);
                    return tile;

            
     return NO_TILE;
        



    

【讨论】:

【参考方案3】:

Gmaps 在添加新的 TileOverlay 时总是会出现一些“闪烁”。 你有两个选择:

在旧的叠加层上添加“新”叠加层,并仅在第一个加载时删除/隐藏旧叠加层(我不记得是否有回调) 第一次添加所有 TileProviders,将第一个设置为可见(true),其他设置为可见 false(如果您已经在第一次添加了所有提供程序,我无法从您的代码中获取)

【讨论】:

是的,我在乞讨中添加所有的提供者,然后在玩 tileoverlay 的可见性

以上是关于如何将图块添加到谷歌地图并为其设置动画,即不断用新图块替换它们的主要内容,如果未能解决你的问题,请参考以下文章

将数据库中的坐标绘制到谷歌地图上,不断检查新值

将 CSS 样式标记添加到谷歌地图

如何将引脚添加到谷歌地图地理编码 api

将图块的 xyz 坐标转换为经度/纬度

将 Kml 图层添加到谷歌地图

如何把谷歌地图动画转换为视频文件