简体   繁体   English

如何更改谷歌地图标记上方的标题和片段设计

[英]How to change design of title and snippet above google maps marker

i am currently working on an application involving google maps.我目前正在开发一个涉及谷歌地图的应用程序。 I want to change the design of the information above the location marker.我想更改位置标记上方信息的设计。 But i cannot figure out how to do this.但我无法弄清楚如何做到这一点。

To explain;解释;

i have this:我有这个:

带有标准信息窗口的地图

and i want this:我想要这个:

自定义信息窗口的设计

I have the design for the blue box as an image.我有蓝色盒子的设计作为图像。 But i do not know if i need to use the image or write code to make it look like the image.但我不知道是否需要使用图像或编写代码使其看起来像图像。

Here is the code i have so far:这是我到目前为止的代码:

MainActivity主要活动

import android.content.Context;
import android.location.Criteria;
import android.location.Location;
import android.location.LocationManager;
import android.os.Build;
import android.os.Bundle;
import android.provider.Settings;
import android.support.v4.app.FragmentActivity;
import android.text.TextUtils;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.TextView;

import com.google.android.gms.location.LocationListener;
import com.google.android.gms.maps.CameraUpdateFactory;
import com.google.android.gms.maps.GoogleMap;
import com.google.android.gms.maps.SupportMapFragment;
import com.google.android.gms.maps.model.BitmapDescriptorFactory;
import com.google.android.gms.maps.model.LatLng;
import com.google.android.gms.maps.model.Marker;
import com.google.android.gms.maps.model.MarkerOptions;


public class MainActivity extends FragmentActivity implements     LocationListener {

    GoogleMap map;
    LatLng myPosition;

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    isLocationEnabled(this);


    // Getting reference to the SupportMapFragment of activity_main.xml
    SupportMapFragment fm = (SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map);

    // Getting GoogleMap object from the fragment
    map = fm.getMap();

    // remove geolocation button
    map.getUiSettings().setMyLocationButtonEnabled(false);

    // Enabling MyLocation Layer of Google Map
    map.setMyLocationEnabled(true);

    // Getting LocationManager object from System Service LOCATION_SERVICE
    LocationManager locationManager = (LocationManager) getSystemService(LOCATION_SERVICE);

    // Creating a criteria object to retrieve provider
    Criteria criteria = new Criteria();

    // Getting the name of the best provider
    String provider = locationManager.getBestProvider(criteria, true);

    // Getting Current Location
    Location location = locationManager.getLastKnownLocation(provider);

    if (location != null) {
        // Getting latitude of the current location
        double latitude = location.getLatitude();

        // Getting longitude of the current location
        double longitude = location.getLongitude();

        // Creating a LatLng object for the current location
        LatLng latLng = new LatLng(latitude, longitude);

        myPosition = new LatLng(latitude, longitude);
        LatLng amsterdam = new LatLng(52.3667, 4.9000);


        // create marker
        MarkerOptions marker = new MarkerOptions().position(myPosition);
        // setting custom marker
        marker.icon(BitmapDescriptorFactory.fromResource(R.drawable.map_marker));

        MarkerOptions markerOptions = new MarkerOptions();
        markerOptions.position(myPosition);
        markerOptions.icon(BitmapDescriptorFactory.fromResource(R.drawable.map_marker));
        markerOptions.title(" Title");

        markerOptions.snippet(" Here comes the address ");


        // create and add marker
        Marker locationMarker = map.addMarker(markerOptions);
        // always show info text
        locationMarker.showInfoWindow();
        // opening maps zoomed in at current location
        map.moveCamera(CameraUpdateFactory.newLatLngZoom(amsterdam, 17.0f));



    }
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.menu_main, menu);
    return true;
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    // Handle action bar item clicks here. The action bar will
    // automatically handle clicks on the Home/Up button, so long
    // as you specify a parent activity in AndroidManifest.xml.
    int id = item.getItemId();

    //noinspection SimplifiableIfStatement
    if (id == R.id.action_settings) {
        return true;
    }

    return super.onOptionsItemSelected(item);
}


@Override
public void onLocationChanged(Location location) {


}

public static boolean isLocationEnabled(Context context) {
    int locationMode = 0;
    String locationProviders;

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
        try {
            locationMode = Settings.Secure.getInt(context.getContentResolver(), Settings.Secure.LOCATION_MODE);

        } catch (Settings.SettingNotFoundException e) {
            e.printStackTrace();
        }

        return locationMode != Settings.Secure.LOCATION_MODE_OFF;

    } else {
        locationProviders = Settings.Secure.getString(context.getContentResolver(), Settings.Secure.LOCATION_PROVIDERS_ALLOWED);
        return !TextUtils.isEmpty(locationProviders);
    }


    }
}

activity_main.xml活动_main.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">

<TextView
    android:id="@+id/tv_location"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content" />

<fragment xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/map"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_below="@id/tv_location"
    class="com.google.android.gms.maps.SupportMapFragment"
    tools:layout="@layout/abc_action_bar_title_item" />


</RelativeLayout>

Excuse me in advance if i used sloppy coding or bad practices.如果我使用了草率的编码或不好的做法,请提前原谅我。 These files are a playground for me to create the functionality so that i can put it in the actual application later on.这些文件是我创建功能的游乐场,以便我稍后可以将其放入实际应用程序中。

To change the look of the info window ("the information above the location marker"), you use an InfoWindowAdapter .要更改信息窗口的外观(“位置标记上方的信息”),请使用InfoWindowAdapter In your case, you want to replace the whole window, both the contents and the frame (the thing with the caret that points to the marker).在您的情况下,您想要替换整个窗口,包括内容和框架(带有指向标记的插入符号的东西)。 So, your InfoWindowAdapter would implement getInfoWindow() and return the View to use for the given Marker .因此,您的InfoWindowAdapter将实现getInfoWindow()并返回View以用于给定的Marker You then call setInfoWindowAdapter() on your GoogleMap to tell it to ask your InfoWindowAdapter for the View to use when the user taps on a Marker .然后,您在GoogleMap上调用setInfoWindowAdapter()以告诉它在用户点击Marker时向您的InfoWindowAdapter询问要使用的View

This sample app demonstrates the concept, though I override getInfoContents() instead of getInfoWindow() , as I wanted to replace the contents but use the existing info window frame. 这个示例应用程序演示了这个概念,尽管我覆盖了getInfoContents()而不是getInfoWindow() ,因为我想替换内容但使用现有的信息窗口框架。 You wind up with something like this:你会得到这样的结果:

MapsV2/ImagePopups 示例屏幕截图

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM