【问题标题】:Fixed marker size at the android Google map修复了 android Google 地图上的标记大小
【发布时间】:2017-11-03 20:46:41
【问题描述】:

是否有可能将标记设为静态? 缩放更改时,我不需要增加/减小标记大小。 我知道groundoverlay - 这里不是一个选项。

结果应该是这样的:

【问题讨论】:

  • 为什么?如果再次缩小,标记将消失。
  • 是的,当然。但目前我必须在图片上设置标记的比例。它不会是动态的。它必须作为地面覆盖层
  • @inaps:你能解决这个问题吗?我有同样的问题
  • 官方文档说“标记不会根据缩放改变大小。如果你想要这种效果,请使用 GroundOverlays”。为什么地面覆盖层不可接受?
  • 为什么GroundOverlay “这不是一个选项。” ?

标签: android google-maps


【解决方案1】:

Ben P 在他的评论中是正确的:“标记不会根据缩放改变大小”。但是,可以通过在(例如)onCameraIdle() 中为每个缩放级别删除并重新创建具有自定义图标大小的标记来实现此标记行为。与:

public class MainActivity extends AppCompatActivity implements OnMapReadyCallback {

    private static final String TAG = MainActivity.class.getSimpleName();
    private static final int DIAMETER_IN_METERS = 300;

    private final LatLng MARKER_LOCATION = new LatLng(37.762555, -122.244221);

    private GoogleMap mGoogleMap;
    private MapFragment mMapFragment;

    private Marker mMarker = null;


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

        mMapFragment = (MapFragment) getFragmentManager()
                .findFragmentById(R.id.map_fragment);
        mMapFragment.getMapAsync(this);
    }

    @Override
    public void onMapReady(GoogleMap googleMap) {
        mGoogleMap = googleMap;

        mGoogleMap.setOnCameraIdleListener(new GoogleMap.OnCameraIdleListener() {
            @Override
            public void onCameraIdle() {

                if (mMarker != null) {
                    mMarker.remove();
                }
                mMarker = createResizedMarker(MARKER_LOCATION);
            }
        });
        mGoogleMap.animateCamera(CameraUpdateFactory.newLatLngZoom(MARKER_LOCATION, 16));
    }

    private Marker createResizedMarker(LatLng marker_location) {
        // get vector drawable
        final Drawable iconDrawable = getResources().getDrawable(R.drawable.ic_letter_m);
        // calc map resolution (meters per pixel) for current zoom level for details see e.g. https://msdn.microsoft.com/en-us/library/aa940990.aspx
        final double meters_per_pixel = (Math.cos(mGoogleMap.getCameraPosition().target.latitude * Math.PI / 180) * 2 * Math.PI * 6378137) / (256 * Math.pow(2, mGoogleMap.getCameraPosition().zoom));
        // calc marker icon diameter in pixels
        final int diameter = (int)(DIAMETER_IN_METERS / meters_per_pixel);
        // create marker icon bitmap for current scale
        final Bitmap bitmap = Bitmap.createBitmap(diameter, diameter, Bitmap.Config.ARGB_8888);
        Canvas canvas = new Canvas(bitmap);
        iconDrawable.setBounds(0, 0, canvas.getWidth(), canvas.getHeight());
        iconDrawable.draw(canvas);

        Marker marker = mGoogleMap.addMarker(new MarkerOptions()
                .position(MARKER_LOCATION)
                .anchor(0.5f, 0.5f)
                .icon(BitmapDescriptorFactory.fromBitmap(bitmap)));

        return marker;
    }
}

R.drawable.ic_letter_m - xml 可绘制矢量(用于完美缩放),例如:

<?xml version="1.0" encoding="utf-8"?>
<vector xmlns:android="http://schemas.android.com/apk/res/android"
        android:width="512dp"
        android:height="512dp"
        android:viewportWidth="512"
        android:viewportHeight="512">

    <path
        android:name="canvas_background"
        android:pathData="M -1 -1 H 581 V 401 H -1 V -1 Z" />
    <path
        android:name="SVGCleanerId_0"
        android:fillColor="#54BBFF"
        android:pathData="M256,0l-61.811005,256l61.811005,256c141.384979,0 256,-114.61499
256,-256s-114.61499,-256 -256,-256z" />
    <path
        android:name="SVGCleanerId_1"
        android:fillColor="#8DD2FF"
        android:pathData="M0,256c0,141.384979 114.614998,256 256,256l0,-512c-141.385002,0 -256,114.614998
-256,256z" />
    <path
        android:name="svg_1"
        android:fillColor="#C6E8FF"
        android:pathData="M256,30.905001l0,450.188993c124.31601,0 225.095001,-100.777985
225.095001,-225.095001s-100.778992,-225.093992 -225.095001,-225.093992z" />
    <path
        android:name="svg_2"
        android:fillColor="#FFFFFF"
        android:pathData="M450.188995,256c0,-124.315994 -86.94101,-225.094999
-194.188995,-225.094999c-124.315994,0 -225.094999,100.779005
-225.094999,225.094999s100.779005,225.095001 225.094999,225.095001c107.247986,0
194.188995,-100.778992 194.188995,-225.095001z" />
    <path
        android:name="svg_3"
        android:fillColor="#54BBFF"
        android:pathData="M306.993988,395.589996c-11.378998,0 -20.604004,-9.223999
-20.604004,-20.604004l0,-137.592987l-11.453003,26.722992c-3.246002,7.576019
-10.694977,12.488007 -18.937988,12.488007c-8.240997,0 -15.69101,-4.912018
-18.938004,-12.488007l-11.453003,-26.722992l0,137.593018c0,11.378998
-9.223999,20.603973 -20.604004,20.603973c-11.378998,0 -20.603989,-9.223999
-20.603989,-20.603973l0,-237.972015c0,-9.782997 6.878998,-18.215996
16.460999,-20.182999c9.584,-1.968002 19.227005,3.075005
23.080002,12.065994l32.059006,74.798004l32.056,-74.796997c3.852997,-8.990997
13.502014,-14.032997 23.079987,-12.066002c9.583008,1.968002 16.460999,10.401001
16.460999,20.183006l0,237.971985c0.001007,11.377991 -9.223999,20.602997
-20.602997,20.602997z" />
    <path
        android:name="SVGCleanerId_0_1_"
        android:fillColor="#F655A0"
        android:pathData="M256,0l-61.811005,256l61.811005,256c141.384979,0 256,-114.61499
256,-256s-114.61499,-256 -256,-256z" />
    <path
        android:name="SVGCleanerId_1_1_"
        android:fillColor="#F655A0"
        android:pathData="M0,256c0,141.384979 114.614998,256 256,256l0,-512c-141.385002,0 -256,114.614998
-256,256z" />
    <path
        android:name="svg_8"
        android:fillColor="#FFFFFF"
        android:pathData="M335.771271,393.589996c-17.577087,0 -31.826935,-9.223999
-31.826935,-20.604004l0,-137.592987l-17.691406,26.722992c-5.014069,7.576019
-16.520477,12.488007 -29.253418,12.488007c-12.729828,0 -24.237839,-4.912018
-29.253448,-12.488007l-17.691406,-26.722992l0,137.593018c0,11.378998
-14.248276,20.603973 -31.82692,20.603973c-17.577087,0 -31.826889,-9.223999
-31.826889,-20.603973l0,-237.972015c0,-9.782997 10.625946,-18.215996
25.427231,-20.182999c14.804367,-1.968002 29.699875,3.075005
35.651581,12.065994l49.521408,74.798004l49.516754,-74.796997c5.951721,-8.990997
20.856506,-14.032997 35.651581,-12.066002c14.802826,1.968002 25.427216,10.401001
25.427216,20.183006l0,237.971985c0.001556,11.377991 -14.24826,20.602997
-31.825348,20.602997z" />
</vector>

你得到了类似的东西:

但实际上,Ground Overlay 可以直接完成所有工作。使用地面覆盖物来完成这样的任务确实更好(至少为了更好的性能和平滑的缩放)。如果你需要,例如如果您需要绘制汽车运动,您可以随时重新创建地面叠加层(使用不同的位图或位图大小,如上面的标记)。您还可以使用.setBearing() 旋转地面覆盖物,如标记。

【讨论】:

    【解决方案2】:

    我遇到了同样的问题,使用以下代码作为解决方案。您可以将以下代码用于固定大小的标记。在我的研究中,我们只有位图选项。

    int height = 100;
    int width = 100;
    BitmapDrawable bitmapdraw=(BitmapDrawable)getResources().getDrawable(R.mipmap.marker);
    Bitmap b=bitmapdraw.getBitmap();
    Bitmap smallMarker = Bitmap.createScaledBitmap(b, width, height, false);
    

    要添加市场,请使用以下代码:

    gMap.addMarker(new MarkerOptions()
                            .position(POSITION)
                            .title("Title")
                            .icon(BitmapDescriptorFactory.fromBitmap(smallMarker))
                    );
    

    【讨论】:

    • 如果您发现上述任何解决方案有帮助,请接受最相关的答案,以便对其他开发者有所帮助。
    猜你喜欢
    • 2013-01-14
    • 1970-01-01
    • 1970-01-01
    • 2013-02-12
    • 1970-01-01
    • 2023-02-07
    • 2011-12-12
    • 2015-12-18
    • 1970-01-01
    相关资源
    最近更新 更多