7

Android アプリケーションに Open Street Maps を含めました。マップビューでは、マップが完全にロードされた後、ユーザーは画面をキャプチャできる必要があります。ただし、現在、マップビューがまだロードされているときでも、ユーザーは画像をキャプチャできます。マップビューが完全にロードされたことを検出する方法を教えてもらえますか?

以下は、マップビューをロードするための私のコードです:

public class MainActivity extends Activity  {
    MapView mapView;
    MyLocationOverlay myLocationOverlay = null;
    ArrayList<OverlayItem> anotherOverlayItemArray;
    protected ItemizedOverlayWithBubble<ExtendedOverlayItem> itineraryMarkers;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        mapView = (MapView) findViewById(R.id.mapview);

        final ArrayList<ExtendedOverlayItem> waypointsItems = new ArrayList<ExtendedOverlayItem>();
        itineraryMarkers = new ItemizedOverlayWithBubble<ExtendedOverlayItem>(this, waypointsItems, mapView, new ViaPointInfoWindow(R.layout.itinerary_bubble, mapView));
        mapView.getOverlays().add(itineraryMarkers);

        mapView.setTileSource(TileSourceFactory.MAPNIK);
        mapView.setBuiltInZoomControls(true);
        MapController mapController = mapView.getController();
        mapController.setZoom(1);
        GeoPoint point2 = new GeoPoint(51496994, -134733);
        mapController.setCenter(point2);

        Drawable marker=getResources().getDrawable(android.R.drawable.star_big_on);
        GeoPoint myPoint1 = new GeoPoint(0*1000000, 0*1000000);
        ExtendedOverlayItem overlayItem = new ExtendedOverlayItem("Title Test Loc", "Desc", myPoint1, this);
        overlayItem.setMarkerHotspot(OverlayItem.HotspotPlace.BOTTOM_CENTER);
        overlayItem.setMarker(marker);
        overlayItem.setRelatedObject(0);
        itineraryMarkers.addItem(overlayItem);
        mapView.invalidate();



        myLocationOverlay = new MyLocationOverlay(this, mapView);
        mapView.getOverlays().add(myLocationOverlay);
        myLocationOverlay.enableMyLocation();

        myLocationOverlay.runOnFirstFix(new Runnable() {
            public void run() {
             mapView.getController().animateTo(myLocationOverlay.getMyLocation());
               } 
           });


    }

    @Override
     protected void onResume() {
      // TODO Auto-generated method stub
      super.onResume();
      myLocationOverlay.enableMyLocation();
      myLocationOverlay.enableCompass();
      myLocationOverlay.enableFollowLocation();
     } 

     @Override
     protected void onPause() {
      // TODO Auto-generated method stub
      super.onPause();
      myLocationOverlay.disableMyLocation();
      myLocationOverlay.disableCompass();
      myLocationOverlay.disableFollowLocation();
     }
4

3 に答える 3

4

TilesOverlayTileLooper実装を見てください。これは、各タイルを読み込んで画面に描画するために使用するものです。ではhandleTile(...)、タイル プロバイダーからタイルを取得しようとしますmTileProvider.getMapTile(pTile)。が返されたDrawable場合はタイルが読み込まれ、そうでない場合は が返されnullます。

これを行う簡単な方法は、渡されたすべてのタイルが null でないかどうかを確認するために呼び出す前に、独自のものを拡張TilesOverlay、オーバーライド、および呼び出すことです。TilesOverlay 呼び出しを使用するには。drawTiles(...)TileLoopersuper.drawTiles(...)handleTile(...)mMapView.getOverlayManager().setTilesOverlay(myTilesOverlay)

于 2013-06-26T13:09:09.810 に答える
1

TilesOverlay を拡張して「MyTileOverlay」という名前のクラスを作成し、このクラスを継続します。

https://code.google.com/p/osmdroid/source/browse/trunk/osmdroid-android/src/main/java/org/osmdroid/views/overlay/TilesOverlay.java?r=1086

次に、マップビューを設定するときに、次のようにします。

this.mTilesOverlay = new MyTileOverlay(mProvider, this.getBaseContext());

kurtzmarc の指示に従って、handleTile() を使用して、すべてのタイルが読み込まれているかどうかを確認しました。

@Override
        public void handleTile(final Canvas pCanvas, final int pTileSizePx,
                final MapTile pTile, final int pX, final int pY) {
            Drawable currentMapTile = mTileProvider.getMapTile(pTile);
            if (currentMapTile == null) {
                currentMapTile = getLoadingTile();
                Log.d("Tile Null", "Null");
            } else {

                Log.d("Tile Not Null", "Not Null");
            }

            if (currentMapTile != null) {
                mTileRect.set(pX * pTileSizePx, pY * pTileSizePx, pX
                        * pTileSizePx + pTileSizePx, pY * pTileSizePx
                        + pTileSizePx);
                onTileReadyToDraw(pCanvas, currentMapTile, mTileRect);
            }

            if (DEBUGMODE) {
                mTileRect.set(pX * pTileSizePx, pY * pTileSizePx, pX
                        * pTileSizePx + pTileSizePx, pY * pTileSizePx
                        + pTileSizePx);
                mTileRect.offset(-mWorldSize_2, -mWorldSize_2);
                pCanvas.drawText(pTile.toString(), mTileRect.left + 1,
                        mTileRect.top + mDebugPaint.getTextSize(),
                        mDebugPaint);
                pCanvas.drawLine(mTileRect.left, mTileRect.top,
                        mTileRect.right, mTileRect.top, mDebugPaint);
                pCanvas.drawLine(mTileRect.left, mTileRect.top,
                        mTileRect.left, mTileRect.bottom, mDebugPaint);
            }
        }

このメソッドは、ロード手順が終了しているかどうかを確認します。

@Override
            public void finaliseLoop() {
                Log.d("Loop Finalized", "Finalized");
            }

このメソッドを使用して、すべてのタイルが読み込まれたかどうかを識別することもできます。

public int getLoadingBackgroundColor() {
            return mLoadingBackgroundColor;
        }

これが誰かを助けることを願っています!

于 2013-06-27T07:57:33.957 に答える