2017-08-24 136 views
0

我想畫一個六邊形的形狀與每個形狀上的文字。安卓谷歌地圖六角形

enter image description here

我已經通過this答案了,但是那是在Javascript語言。我想在Android中應用它。

我該如何實現上述目標?

回答

1

您可以實現與您在Google Maps Android API中爲Google Maps JavaScript API提到的功能類似的功能。爲此,您需要使用Google Maps Android API Utility Library中的SphericalUtil,並且還可以將標籤添加爲GroundOverlay對象。請看看下面的例子,說明如何實現這個功能

public class MapsActivity extends FragmentActivity implements OnMapReadyCallback { 

    private GoogleMap mMap; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_maps); 
     // Obtain the SupportMapFragment and get notified when the map is ready to be used. 
     SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager() 
       .findFragmentById(R.id.map); 
     mapFragment.getMapAsync(this); 
    } 


    /** 
    * Manipulates the map once available. 
    * This callback is triggered when the map is ready to be used. 
    */ 
    @Override 
    public void onMapReady(GoogleMap googleMap) { 
     mMap = googleMap; 

     LatLng pos = new LatLng(33.748589, -84.390392); 
     mMap.moveCamera(CameraUpdateFactory.newLatLngZoom(pos, 7)); 

     int radius = 40 * 1000; //radius in meters 
     drawHorizontalHexagonGrid(pos, radius,6); 

     mMap.getUiSettings().setZoomControlsEnabled(true); 
    } 

    private void drawHorizontalHexagonGrid(LatLng startPosition, int radius, int count){ 
     LatLng curPos = startPosition; 
     double width = radius * 2 * Math.sqrt(3)/2 ; 
     for(int i = 0; i < count; i++) { 
      drawHorizontalHexagon(curPos, radius, "" + (i+1)); 
      curPos = SphericalUtil.computeOffset(curPos, width,90); 
     } 
    } 

    private void drawHorizontalHexagon(LatLng position, int radius, String label){ 
     List<LatLng> coordinates = new ArrayList<>(); 
     for(int angle = 0; angle < 360; angle += 60) { 
      coordinates.add(SphericalUtil.computeOffset(position, radius, angle)); 
     } 

     PolygonOptions opts = new PolygonOptions().addAll(coordinates) 
       .fillColor(Color.argb(35,255, 0,0)) 
       .strokeColor(Color.RED).strokeWidth(3); 

     mMap.addPolygon(opts); 

     this.showText(position, label); 
    } 

    private void showText(LatLng pos, String label) { 
     mMap.addGroundOverlay(new GroundOverlayOptions().position(pos, 10000) 
       .image(
        BitmapDescriptorFactory.fromBitmap(
         getBitmapFromView(label) 
        ) 
       ) 
       .zIndex(1000) 
       .transparency(0) 
       .visible(true) 
     ); 
    } 

    private Bitmap getBitmapFromView(String label) { 
     Bitmap myRefBitmap = BitmapFactory.decodeResource(getResources(), 
       R.drawable.transparent); 

     Bitmap myWrittenBitmap = Bitmap.createBitmap(myRefBitmap.getWidth(), 
       myRefBitmap.getHeight(), Bitmap.Config.ARGB_4444); 

     float scale = getResources().getDisplayMetrics().density; 

     Canvas canvas = new Canvas(myWrittenBitmap); 
     Paint txtPaint = new Paint(); 
     txtPaint.setColor(Color.BLUE); 
     txtPaint.setTextSize(48*scale); 
     txtPaint.setFlags(Paint.ANTI_ALIAS_FLAG); 
     txtPaint.setTypeface(Typeface.DEFAULT_BOLD); 

     //draw ref bitmap then text on our canvas 
     canvas.drawBitmap(myRefBitmap, 0, 0, null); 
     canvas.drawText(label, 5, myRefBitmap.getHeight(), txtPaint); 

     return myWrittenBitmap; 
    } 
} 

你可以看到下面的截圖結果

enter image description here

完整的示例項目可在Github上:

https://github.com/xomena-so/so45856063

請用您的API代替。

我希望這有助於!