GVKun编程网logo

Java-Google Map API V2调整大小屏幕以匹配绘制的圆(google java style)

9

想了解Java-GoogleMapAPIV2调整大小屏幕以匹配绘制的圆的新动态吗?本文将为您提供详细的信息,我们还将为您解答关于googlejavastyle的相关问题,此外,我们还将为您介绍关于An

想了解Java-Google Map API V2调整大小屏幕以匹配绘制的圆的新动态吗?本文将为您提供详细的信息,我们还将为您解答关于google java style的相关问题,此外,我们还将为您介绍关于Android 2.3和Google Maps API v2、Android Google Map API V2(显示地图)、android – Google Maps Api V2围绕当前位置绘制圆圈、android – Google Maps API v2调用点击mylocationbutton的行为的新知识。

本文目录一览:

Java-Google Map API V2调整大小屏幕以匹配绘制的圆(google java style)

Java-Google Map API V2调整大小屏幕以匹配绘制的圆(google java style)

我正在地图上(用户的当前位置)绘制一个圆,并且希望屏幕进行缩放以使圆在全屏中具有一定的边距.我现在正在做什么:

drawCercleAroundPin(_googleMap, DataManager.RADIUS_SEARCH_CERCLE, _location);

moveCamera(_googleMap, (10 / ((DataManager.RADIUS_SEARCH_CERCLE / 900) + 1))+10, 2000, _location, null);

好吧,我尝试了一些愚蠢的演算,因为我找不到合适的解决方案…

有人有主意吗?

解决方法:

如果我理解正确,您是否希望地图适合圆形边界?如果是这样的话

添加一个像this的圆圈

mMap.addCircle(new CircleOptions()
        .center(new LatLng(location.getLatitude(), location.getLongitude()))
        .radius(100)
        .strokeColor(Color.RED)
        .fillColor(Color.BLUE));

**那么您需要您的圆的边界框,请阅读this **

LatLngBounds bounds = boundsWithCenterandLatLngdistance(new LatLng(location.getLatitude(), location.getLongitude()),200,200);

**并尝试**

private static final double ASSUMED_INIT_LATLNG_DIFF = 1.0;
private static final float ACCURACY = 0.01f;

public static LatLngBounds boundsWithCenterandLatLngdistance(LatLng center, float latdistanceInMeters, float lngdistanceInMeters) {
    latdistanceInMeters /= 2;
    lngdistanceInMeters /= 2;
    LatLngBounds.Builder builder = LatLngBounds.builder();
    float[] distance = new float[1];
    {
        boolean foundMax = false;
        double foundMinLngDiff = 0;
        double assumedLngDiff = ASSUMED_INIT_LATLNG_DIFF;
        do {
            Location.distanceBetween(center.latitude, center.longitude, center.latitude, center.longitude + assumedLngDiff, distance);
            float distanceDiff = distance[0] - lngdistanceInMeters;
            if (distanceDiff < 0) {
                if (!foundMax) {
                    foundMinLngDiff = assumedLngDiff;
                    assumedLngDiff *= 2;
                } else {
                    double tmp = assumedLngDiff;
                    assumedLngDiff += (assumedLngDiff - foundMinLngDiff) / 2;
                    foundMinLngDiff = tmp;
                }
            } else {
                assumedLngDiff -= (assumedLngDiff - foundMinLngDiff) / 2;
                foundMax = true;
            }
        } while (Math.abs(distance[0] - lngdistanceInMeters) > lngdistanceInMeters * ACCURACY);
        LatLng east = new LatLng(center.latitude, center.longitude + assumedLngDiff);
        builder.include(east);
        LatLng west = new LatLng(center.latitude, center.longitude - assumedLngDiff);
        builder.include(west);
    }
    {
        boolean foundMax = false;
        double foundMinLatDiff = 0;
        double assumedLatDiffnorth = ASSUMED_INIT_LATLNG_DIFF;
        do {
            Location.distanceBetween(center.latitude, center.longitude, center.latitude + assumedLatDiffnorth, center.longitude, distance);
            float distanceDiff = distance[0] - latdistanceInMeters;
            if (distanceDiff < 0) {
                if (!foundMax) {
                    foundMinLatDiff = assumedLatDiffnorth;
                    assumedLatDiffnorth *= 2;
                } else {
                    double tmp = assumedLatDiffnorth;
                    assumedLatDiffnorth += (assumedLatDiffnorth - foundMinLatDiff) / 2;
                    foundMinLatDiff = tmp;
                }
            } else {
                assumedLatDiffnorth -= (assumedLatDiffnorth - foundMinLatDiff) / 2;
                foundMax = true;
            }
        } while (Math.abs(distance[0] - latdistanceInMeters) > latdistanceInMeters * ACCURACY);
        LatLng north = new LatLng(center.latitude + assumedLatDiffnorth, center.longitude);
        builder.include(north);
    }
    {
        boolean foundMax = false;
        double foundMinLatDiff = 0;
        double assumedLatDiffSouth = ASSUMED_INIT_LATLNG_DIFF;
        do {
            Location.distanceBetween(center.latitude, center.longitude, center.latitude - assumedLatDiffSouth, center.longitude, distance);
            float distanceDiff = distance[0] - latdistanceInMeters;
            if (distanceDiff < 0) {
                if (!foundMax) {
                    foundMinLatDiff = assumedLatDiffSouth;
                    assumedLatDiffSouth *= 2;
                } else {
                    double tmp = assumedLatDiffSouth;
                    assumedLatDiffSouth += (assumedLatDiffSouth - foundMinLatDiff) / 2;
                    foundMinLatDiff = tmp;
                }
            } else {
                assumedLatDiffSouth -= (assumedLatDiffSouth - foundMinLatDiff) / 2;
                foundMax = true;
            }
        } while (Math.abs(distance[0] - latdistanceInMeters) > latdistanceInMeters * ACCURACY);
        LatLng south = new LatLng(center.latitude - assumedLatDiffSouth, center.longitude);
        builder.include(south);
    }
    return builder.build();
}

终于打电话

CameraUpdateFactory#newLatLngBounds(bounds, padding);

Android 2.3和Google Maps API v2

Android 2.3和Google Maps API v2

今天,我尝试使用适用于Android 2.3.3的Google Maps api v2我的步骤:

  • 从debug.keystore获得SHA1代码
  • 在Google API控制台中创建一个新项目
  • 注册一个新的ID
  • 启用了Google Maps android api v2
  • 使用输入SHA1创建一个Android密钥; it.mappe(it.mappe是我的包)
  • 获取API密钥
  • 更新AndroidManifest文件:
        <permission android:name="it.mappe.permission.MAPS_RECEIVE" android:protectionLevel="signature" />

    <uses-permission android:name="it.mappe.permission.MAPS_RECEIVE" />
    <uses-sdk android:minSdkVersion="10" android:targetSdkVersion="16" />

    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
    <uses-permission android:name="com.google.android.providers.gsf.permission.READ_GSERVICES"/>

    <uses-feature android:glEsVersion="0x00020000" android:required="true"` />

    <application     android:allowBackup="true"    android:icon="@drawable/ic_launcher"  android:label="@string/app_name"  android:theme="@style/AppTheme" >
        <meta-data
            android:name="com.google.android.maps.v2.API_KEY"
            android:value="MY_KEY" />

            <activity
                android:name="it.mappe.MainActivity"
                android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>
  • 我的主要活动
        public class MainActivity extends Activity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
    }   
  • 我的activity_main:

    <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_SDK_DIR/extras/google/google_play_services/libproject/google-play-services_lib到项目的根目录

  • 添加/extras/android/compatibility/v4/android-support-v4.jar为外部罐

  • 将下一行添加到 YOUR_PROJECT/project.properties android.library.reference.1=google-play-services_lib

当我在三星银河S上运行它(使用Google Play服务apk)时,它崩溃并且logcat显示此错误

    E/AndroidRuntime(6435): FATAL EXCEPTION: main java.lang.RuntimeException: Unable to start activity ComponentInfo{it.mappe/it.mappe.MainActivity}: 

    android.view.InflateException: Binary XML file line #2: Error inflating class fragment
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1651)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1667)
        at android.app.ActivityThread.access$1500(ActivityThread.java:117)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:935)
        at android.os.Handler.dispatchMessage(Handler.java:99)
        at android.os.Looper.loop(Looper.java:123)
        at android.app.ActivityThread.main(ActivityThread.java:3687)
        at java.lang.reflect.Method.invokeNative(Native Method)
        at java.lang.reflect.Method.invoke(Method.java:507)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:842)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:600)
        at dalvik.system.NativeStart.main(Native Method)
     Caused by: android.view.InflateException: Binary XML file line #2: Error inflating class fragment
        at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:581)
        at android.view.LayoutInflater.inflate(LayoutInflater.java:386)
        at android.view.LayoutInflater.inflate(LayoutInflater.java:320)
        at android.view.LayoutInflater.inflate(LayoutInflater.java:276)
        at com.android.internal.policy.impl.PhoneWindow.setContentView(PhoneWindow.java:209)
        at android.app.Activity.setContentView(Activity.java:1657)
        at it.mappe.MainActivity.onCreate(MainActivity.java:12)
        at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1615)
        ... 11 more
     Caused by: java.lang.ClassNotFoundException: android.view.fragment in loader dalvik.system.PathClassLoader[/data/app/it.mappe-2.apk]
        at dalvik.system.PathClassLoader.findClass(PathClassLoader.java:240)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:551)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:511)
        at android.view.LayoutInflater.createView(LayoutInflater.java:471)
        at android.view.LayoutInflater.onCreateView(LayoutInflater.java:549)
        at com.android.internal.policy.impl.PhoneLayoutInflater.onCreateView(PhoneLayoutInflater.java:66)
        at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:568)
        ... 19 more

一些建议?

编辑

这是我的main.xml:

    <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 Google Map API V2(显示地图)

Android Google Map API V2(显示地图)

        检查Android SDK ,确保Google Play service已经安装,现象见图:

                    

开发的应用要支持2.2+导入Froyo的工程,支持3.1+的,使用第二个。Google Map Lib 的工程位于 ~/android Sdk/extras/google/,选择合适的工程导入eclipse。


创建自己的工程,然后将上面的工程作为库,引进来


AndroidManifest.xml的配置

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.sample.app"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk android:minSdkVersion="8" />
  
    <!-- permission  -->
    <uses-permission android:name="android.permission.INTERNET"/>
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
    <uses-permission android:name="com.google.android.providers.gsf.permission.READ_GSERVICES"/>

    <!-- OpenGL ES 2 -->
    <uses-feature android:glEsVersion="0x00020000" android:required="true"/>

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name" >
        
        <activity
            android:name="com.sample.app.MainActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        
        <!-- Google Map V2 key -->
        <meta-data
    		android:name="com.google.android.maps.v2.API_KEY"
    		android:value="API_KEY"/>
        
    </application>

</manifest>


布局文件:

<?xml version="1.0" encoding="utf-8"?>
<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:name="com.google.android.gms.maps.MapFragment"/>

Activity

import android.app.Activity;
import android.os.Bundle;

public class MainActivity extends Activity {

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


执行结果:


android – Google Maps Api V2围绕当前位置绘制圆圈

android – Google Maps Api V2围绕当前位置绘制圆圈

我目前在 Android项目上使用Google Maps API V2,我需要能够在用户当前位置周围绘制一个圆圈,并在用户当前位置周围显示兴趣点内的标记.

我正在努力获得表示用户当前位置的小标记,以便我可以围绕它绘制一个圆圈.

到目前为止这是我的代码.

//Set up map and display users current position.
    MapFragment mapFragment = (MapFragment) getFragmentManager()
            .findFragmentById(R.id.nearbyMapSearch);
    mapFragment.getMapAsync(this);

    final GoogleMap map = (((MapFragment) getFragmentManager().findFragmentById(R.id.nearbyMapSearch)).getMap());
    map.setMyLocationEnabled(true);

    //zoom to users location
    GeoLocationHandler geoHandler = new GeoLocationHandler(getActivity().getApplicationContext());
    Log.i("Search Fragment","" + geoHandler.getCurrentLatitude() + "," + geoHandler.getCurrentLongitude());
    LatLng loc = new LatLng(geoHandler.getCurrentLatitude(),geoHandler.getCurrentLongitude());

    //Begin animating camera.
    map.animateCamera(CameraUpdateFactory.newLatLngZoom(
            new LatLng(loc.latitude,loc.longitude),13));

    //Instantiate new Camera position
    CameraPosition cameraPosition = new CameraPosition.Builder()
            .target(new LatLng(loc.latitude,loc.longitude))
            .zoom(3)
            .bearing(0)
            .tilt(0)
            .build();
    map.animateCamera(CameraUpdateFactory.newCameraPosition(cameraPosition));

任何帮助都将非常感谢谢谢.

解决方法

Circle circle = map.addCircle(new CircleOptions()
     .center(new LatLng(loc.latitude,loc.longitude))
     .radius(1000)
     .strokeColor(Color.RED)
     .fillColor(Color.BLUE));

更多信息https://developers.google.com/android/reference/com/google/android/gms/maps/model/Circle

您应该订阅用户位置的更新并重置圆心

circle.setCenter(newLocation);

android – Google Maps API v2调用点击mylocationbutton的行为

android – Google Maps API v2调用点击mylocationbutton的行为

我有一个完全正常工作的GoogleMap,我可以通过调用显示我的用户位置

mMap.setMyLocationEnabled(true);

我想要实现的是实际点击按钮的功能,该按钮现在出现在GoogleMap上(即,使用正确的缩放等将地图设置为用户位置的动画).

功能已经在GoogleMap对象中,我该如何使用它?

我不想使用LocationListener等来实现这一点,我只想“调用相同的代码”,当我点击地图上的按钮时,它会被调用.可以这么简单吗?

提前致谢.

编辑:

我基本上想要做的是将地图置于用户位置,这与我单击按钮时GoogleMap在用户位置中心的方式完全相同.像这样:

GoogleMap mMap = this.getMap();
    if(mMap != null) {
        mMap.setMyLocationEnabled(true);
        //Todo center the map on mylocation
    }

编辑:

显然谷歌正在努力解决这个问题. http://code.google.com/p/gmaps-api-issues/issues/detail?id=4644

解决方法

不确定为什么其他答案正在谈论OnMyLocationchangelisteners.这不是OP中提出的问题.问的是如何复制点击MyLocationButton的确切行为,这实际上比仅仅将相机设置为用户位置更复杂.该按钮根据您当前所处的缩放级别执行不同的操作.

例如,当您缩小显示时,单击该按钮会在放大时将您设置为您的位置动画,而如果您已经处于某些缩放级别,则单击该按钮只会在保持当前状态的同时将您设置为您的位置.缩放级别.

如果我们只是简单地获得对MyLocationButton的引用并且只是,你知道,点击它就不是那么费力地试图复制这种行为,而不是很难.嗯,这是我发现当前最好的方法:

@OnClick(R.id.fabMyLocation)
public void onMyLocationClick(FloatingActionButton fabMyLocation) {
    View myLocationButton = ((View) mapFragment.getView().findViewById(Integer.parseInt("1")).getParent())
            .findViewById(Integer.parseInt("2"));

    myLocationButton.performClick();
}

是的,它并不漂亮,并且依赖于可能在未来版本的Google Maps API中更改的硬编码ID.但是这种检索按钮的方法基于this highly rated answer from 2013,到目前为止,从Google Play Services 8.4.0开始,仍然可以正常运行.

关于Java-Google Map API V2调整大小屏幕以匹配绘制的圆google java style的介绍已经告一段落,感谢您的耐心阅读,如果想了解更多关于Android 2.3和Google Maps API v2、Android Google Map API V2(显示地图)、android – Google Maps Api V2围绕当前位置绘制圆圈、android – Google Maps API v2调用点击mylocationbutton的行为的相关信息,请在本站寻找。

本文标签: