Mappa personalizzata, disabilitata e vuota in android

Voglio visualizzare solo la parte del raggio del marker sulla mappa e il resto della mappa deve essere vuota. Come se il raggio di Marker sia di 5 KM e voglio che solo quella parte del raggio della mappa sia visibile all'utilizzatore e il resto della mappa deve essere vuoto.

Ho letto delle sovrapposizioni di Google Map e cerco anche vari SDK come MapBox e Skobbler ma nessuno di loro fornisce le funzionalità che voglio.

  • Come avviare la mia applicazione tramite un URL personalizzato in un'email
  • Android: IthemeszedOverlay onTouchEvent e sovrapposizione onTap
  • Aggiungere l'imbottitura in vista programmaticamente
  • Android - Ottieni l'area visibile di una vista?
  • Schermo di logging video personalizzato
  • Android Scarica Progress
  • Ecco l'immagine che spiega come voglio che la mappa sia simile.

    Nell'image si può vedere che solo una parte intorno al marcatore è visibile e il resto è vuoto. Voglio raggiungere questa funzionalità in android Maps.

    Se qualcuno ha una soluzione o un'idea, per favore fathemes sapere.

    Grazie.

  • come posso iniziare lo schermo delle applicazioni di applicazione in android?
  • Android Studio, logcat pulisce dopo l'applicazione chiude
  • Come submit il command AT in android?
  • Feedback RecyclerView + CardView + Touch
  • contenuto: // sms / inviato / non funzionante
  • Integrazione di Air Watch Android Studio
  • One Solution collect form web for “Mappa personalizzata, disabilitata e vuota in android”

    Puoi aggiungere una View sulla mappa che lo nasconde e disegnare un cerchio per mostrare solo le posizioni desiderate.

    Ho basato le mie risposte

    • Disegnare cerchio trasparente riempito fuori

    • Android – Google Maps all'interno di CircleView

    • Come posso disegnare un cerchio di destinazione statico su Google Maps?

    MapsActivity:

     public class MapsActivity extends FragmentActivity implements GoogleMap.OnCameraChangeListener { private GoogleMap mMap; private HideOverlayView hideView; private List<Marker> visibleMarkers = new ArrayList<>(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_maps); hideView = (HideOverlayView) findViewById(R.id.hideview); setUpMapIfNeeded(); } @Override protected void onResume() { super.onResume(); setUpMapIfNeeded(); } @SuppressLint("NewApi") private void setUpMapIfNeeded() { if (mMap == null) { final SupportMapFragment f = (SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map); mMap = ((SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map)) .getMap(); if (mMap != null) { setUpMap(); } } } private void setUpMap() { mMap.setMapType(GoogleMap.MAP_TYPE_HYBRID); mMap.getUiSettings().setAllGesturesEnabled(true); mMap.getUiSettings().setZoomControlsEnabled(true); mMap.getUiSettings().setMyLocationButtonEnabled(true); mMap.setMyLocationEnabled(true); mMap.setOnCameraChangeListener(this); mMap.moveCamera(CameraUpdateFactory.newCameraPosition( CameraPosition.fromLatLngZoom(new LatLng(40.22861, -3.95567), 15))); visibleMarkers.add(mMap.addMarker(new MarkerOptions().position( new LatLng(40.22861, -3.95567)))); visibleMarkers.add(mMap.addMarker(new MarkerOptions().position( new LatLng(40.22977, -3.95338)))); } @Override public void onCameraChange(final CameraPosition cameraPosition) { List<Point> visiblePoints = new ArrayList<>(); Projection projection = mMap.getProjection(); for (Marker visibleMarker : visibleMarkers) { visiblePoints.add(projection.toScreenLocation(visibleMarker.getPosition())); } float radius = 150f; // meters Point centerPoint = projection.toScreenLocation(cameraPosition.target); Point radiusPoint = projection.toScreenLocation( SphericalUtil.computeOffset(cameraPosition.target, radius, 90)); float radiusPx = (float) Math.sqrt(Math.pow(centerPoint.x - radiusPoint.x, 2)); hideView.reDraw(visiblePoints, radiusPx); } } 

    HideOverlayView:

     public class HideOverlayView extends LinearLayout { private Bitmap windowFrame; private float radius = 0f; private List<Point> points; public HideOverlayView(Context context) { super(context); } public HideOverlayView(Context context, AttributeSet attrs) { super(context, attrs); } @Override protected void dispatchDraw(Canvas canvas) { super.dispatchDraw(canvas); createWindowFrame(); canvas.drawBitmap(windowFrame, 0, 0, null); } @Override public boolean isEnabled() { return false; } @Override public boolean isClickable() { return false; } public void reDraw(List<Point> points, float radius) { this.points = points; this.radius = radius; invalidate(); } protected void createWindowFrame() { windowFrame = Bitmap.createBitmap(getWidth(), getHeight(), Bitmap.Config.ARGB_8888); Canvas osCanvas = new Canvas(windowFrame); RectF outerRectangle = new RectF(0, 0, getWidth(), getHeight()); Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG); paint.setColor(Color.BLACK); osCanvas.drawRect(outerRectangle, paint); if (radius > 0 && points != null) { for (Point point : points) { paint.setColor(Color.TRANSPARENT); paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_OUT)); paint.setStyle(Paint.Style.FILL); osCanvas.drawCircle(point.x, point.y, radius, paint); } } } @Override public boolean isInEditMode() { return true; } @Override protected void onLayout(boolean changed, int l, int t, int r, int b) { super.onLayout(changed, l, t, r, b); windowFrame = null; } } 

    activity_maps.xml:

     <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <fragment android:id="@+id/map" android:name="mypackage.MySupportMapFragment" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".MapsActivity"/> <mypackage.HideOverlayView android:id="@+id/hideview" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_centerInParent="true" app:radius="150dp"/> </RelativeLayout> 

    Risultato:

    immettere qui la descrizione dell'immagine

    limitazioni:

    • Questa soluzione aggiorna solo HideOverlayView in onCameraChange , quindi quando l'utente ingrandisce o impone la mappa, è ansible visualizzare altre posizioni sulla mappa
    • I calcoli effettuati per calcolare il raggio non tengono conto delle rotazioni e delle inclinazioni della mappa
    L'Android è un fan Android di Google, tutto su telefoni Android, Android Wear, Android Dev e applicazioni Android Games e così via.