2017-08-24 117 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代替。

我希望这有助于!