- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我正在开发一个获取当前用户位置并在该位置添加标记的应用。还有三个具有静态位置的标记,并且有一个名为“drawCircle”的函数可以在这些标记周围绘制圆圈,以测量这三个标记位置与用户当前位置之间的距离。
“Avatar”类包含一个构造函数,该构造函数填充了三个标记名称、经度和纬度。
如何随机设置三个标记的位置,以便它们随时间变化?
这是我的代码:
public class MapsActivity extends FragmentActivity implements
OnMapReadyCallback,
GoogleApiClient.ConnectionCallbacks,
GoogleApiClient.OnConnectionFailedListener,
LocationListener{
private GoogleMap mMap;
private GoogleMap firstMarker;
private GoogleMap secondMarker;
private GoogleMap thirdMarker;
private GoogleApiClient googleApiClient;
private LocationRequest locationRequest;
private Location mlocation;
private LocationManager locationManager;
private Marker currentUserLocationMarker;
Avatar[] character;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_maps);
googleApiClient = new GoogleApiClient.Builder(this)
.addConnectionCallbacks(this)
.addOnConnectionFailedListener(this)
.addApi(LocationServices.API)
.build();
locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
// 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);
Avatar = new Avatar[3];
Avatar[0] = new Avatar("firstMarker", 1000, 1000, 45.827159, 13.341452);
Avatar[1] = new Avatar("secondMarker", 1000, 1000, 45.886060, 13.284799);
Avatar[2] = new Avatar("thirdMarker", 1000, 1000, 45.825058, 13.345014);
}
@Override
public void onMapReady(GoogleMap googleMap) {
mMap = googleMap;
firstMarker = googleMap;
secondMarker = googleMap;
thirdMarker = googleMap;
LatLng posFirstMarker = new LatLng(Avatar[0].Lat, Avatar[0].Long);
LatLng posSecondMarker = new LatLng(Avatar[1].Lat, Avatar[1].Long);
LatLng posThirdMarker = new LatLng(Avatar[2].Lat, Avatar[2].Long);
BitmapDrawable dr = (BitmapDrawable) getResources().getDrawable(R.drawable.firstMarkerImg);
Bitmap bitmapD = Bitmap.createScaledBitmap(dr.getBitmap(), 200, 200, false);
BitmapDrawable bt = (BitmapDrawable) getResources().getDrawable(R.drawable.secondMarkerImg);
Bitmap bitmapB = Bitmap.createScaledBitmap(bt.getBitmap(), 200, 200, false);
BitmapDrawable sp = (BitmapDrawable) getResources().getDrawable(R.drawable.thirdMarkerImg);
Bitmap bitmapS = Bitmap.createScaledBitmap(sp.getBitmap(), 125, 125, false);
firstMarker.addMarker(new MarkerOptions().snippet("My Snippet").icon(BitmapDescriptorFactory.fromBitmap(bitmapB)).position(posFirstMarker).title("Pipistrello"));
firstMarker.moveCamera(CameraUpdateFactory.newLatLng(posFirstMarker));
secondMarker.addMarker(new MarkerOptions().snippet("My Snippet").icon(BitmapDescriptorFactory.fromBitmap(bitmapD)).position(posSecondMarker).title("Drago"));
secondMarker.moveCamera(CameraUpdateFactory.newLatLng(posSecondMarker));
thirdMarker.addMarker(new MarkerOptions().snippet("My Snippet").icon(BitmapDescriptorFactory.fromBitmap(bitmapS)).position(posThirdMarker).title("Serpe"));
thirdMarker.moveCamera(CameraUpdateFactory.newLatLng(posThirdMarker));
private GoogleMap Mymarker;
@Override
public void onMapReady (GoogleMap googleMap){
Mymarker = googleMap;
LatLng markerPosition = new LatLng(Lat, Long);
BitmapDrawable dr = (BitmapDrawable) getResources().getDrawable(R.drawable.my_image);
Bitmap bitmapD = Bitmap.createScaledBitmap(dr.getBitmap(), 200, 200, false);
Mymarker.addMarker(new MarkerOptions().snippet("My Snippet").icon(BitmapDescriptorFactory.fromBitmap(bitmapD)).position(markerPosition).title("Marker"));
Mymarker.moveCamera(CameraUpdateFactory.newLatLng(markerPosition));
}
}
@Override
public void onConnected(Bundle bundle) {
if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
// TODO: Consider calling
// ActivityCompat#requestPermissions
// here to request the missing permissions, and then overriding
// public void onRequestPermissionsResult(int requestCode, String[] permissions,
// int[] grantResults)
// to handle the case where the user grants the permission. See the documentation
// for ActivityCompat#requestPermissions for more details.
return;
}
startLocationUpdates();
mlocation = LocationServices.FusedLocationApi.getLastLocation(googleApiClient);
if (mlocation == null) {
startLocationUpdates();
}
if (mlocation != null) {
double latitude = mlocation.getLatitude();
double longitude = mlocation.getLongitude();
} else {
Toast.makeText(this, "Location not Detected", Toast.LENGTH_SHORT).show();
}
}
protected void startLocationUpdates() {
// Create the location request
locationRequest = LocationRequest.create()
.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY)
.setInterval(1100)
.setFastestInterval(1100);
// Request location updates
if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
// TODO: Consider calling
// ActivityCompat#requestPermissions
// here to request the missing permissions, and then overriding
// public void onRequestPermissionsResult(int requestCode, String[] permissions,
// int[] grantResults)
// to handle the case where the user grants the permission. See the documentation
// for ActivityCompat#requestPermissions for more details.
return;
}
LocationServices.FusedLocationApi.requestLocationUpdates(googleApiClient,
locationRequest, this);
Log.d("reque", "--->>>>");
}
@Override
public void onConnectionSuspended(int i) {
}
@Override
public void onConnectionFailed(ConnectionResult connectionResult) {
}
@Override
public void onStart() {
super.onStart();
googleApiClient.connect();
}
@Override
public void onStop() {
super.onStop();
if (googleApiClient.isConnected()) {
googleApiClient.disconnect();
}
}
@Override
public void onLocationChanged(Location location) {
mlocation = location;
if (currentUserLocationMarker != null) {
currentUserLocationMarker.remove();
}
LatLng latLng = new LatLng(location.getLatitude(), location.getLongitude());
MarkerOptions markerOptions = new MarkerOptions();
markerOptions.position(latLng);
markerOptions.title("Current Location");
markerOptions.icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_ORANGE));
currentUserLocationMarker = mMap.addMarker(markerOptions);
drawCircle(new LatLng(location.getLatitude(), location.getLongitude()));
Distance(new LatLng(location.getLatitude(), location.getLongitude()));
mMap.moveCamera(CameraUpdateFactory.newLatLng(latLng));
//mMap.animateCamera(CameraUpdateFactory.zoomBy(13));
if (googleApiClient != null) {
LocationServices.FusedLocationApi.removeLocationUpdates(googleApiClient, this);
}
}
private void drawCircle(LatLng point) {
// Instantiating CircleOptions to draw a circle around the marker
CircleOptions circleOptions = new CircleOptions();
// Specifying the center of the circle
circleOptions.center(point);
// Radius of the circle
circleOptions.radius(1000);
// Border color of the circle
circleOptions.strokeColor(Color.BLACK);
// Fill color of the circle
circleOptions.fillColor(0x30ff0000);
// Border width of the circle
circleOptions.strokeWidth(2);
// Adding the circle to the GoogleMap
mMap.addCircle(circleOptions);
}
private void Distance(LatLng distance) {
float[] results = new float[1];
for (int i = 0; i < 3; i++) {
Location.distanceBetween(mlocation.getLatitude(), mlocation.getLongitude(),
Avatar[i].Lat, Avatar[i].Long, results);
}
}}
最佳答案
我在我的应用程序中做了类似的事情,以防止标记相互重叠。每当我加载它们时,我都会添加一个小的随机偏移量(这是一种简单且效果很好的 hack)。因此,从技术上讲,标记每次加载时都处于不同的位置。您可以修改我的代码来实现您想要的。
我从数据库(字符串)获取坐标,将其解析为 double ,并添加一个小的随机偏移量。您可以根据自己的目的增加偏移量。
new LatLng(parseCoordRandom(arrayList.get(i).getLatitude()), parseCoordRandom(arrayList.get(i).getLongitude()))
public static double parseCoordRandom(@NonNull String s_coord)
return tryParseStringToDouble(s_coord, 0.0) +getMarkerOffset();
}
public static double tryParseStringToDouble(@NonNull String s, double defaultValue) {
try {
return Double.parseDouble(s);
} catch (NumberFormatException e) {
return defaultValue;
}
}
public static double getMarkerOffset(){
//add tiny random offset to keep markers from dropping on top of themselves
double offset =Math.random()/4000;
boolean isEven = ((int)(offset *400000)) %2 ==0;
if (isEven) return offset;
else return -offset;
}
关于android - 如何设置随时间变化的标记随机位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55858334/
这个问题已经有答案了: Is there any way to accept only numeric values in a JTextField? (20 个回答) It's possible i
我使用戴尔 XPS M1710。笔记本电脑的盖子、侧面扬声器和前置扬声器都有灯(3 组灯可以单独调节)和鼠标垫下方的灯。在 BIOS 中,我可以更改这些灯的颜色,至少是每个组。另外,我可以在鼠标垫下打
我知道我可以使用 在 iOS 5 中打开设置应用 [[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"prefs://"
我有一个 Django 应用程序,我正在尝试为其设置文档。目录结构如下: - doc - project | - manage.py 我已经设置了路径以便 Sphinx 可以看到东西,但是当我尝试使用
我正在使用 768mb ram 运行 centos 5.5。我一直在日志中获取 server reached MaxClients setting, consider raising the MaxC
我在具有以下配置的服务器内运行了 Drupal 安装: StartServers 5 MinSpareServers 5 MaxSpareServers 15 MaxClien
是否可以使用 Microsoft.Web.Administration 包为给定的 location 配置 asp 设置? 我想以编程方式将以下部分添加到本地 IIS applicationHost.
我一直在阅读为 kube-proxy 提供参数的文档,但没有解释应该如何使用这些参数。我使用 az aks create 创建我的集群使用 azure-cli 程序,然后我获得凭据并使用 kubect
我想知道与在 PHP 中使用 setcookie() 函数相比,在客户端通过 JavaScript 设置一些 cookie 是否有任何明显的优势?我能想到的唯一原因是减少一些网络流量(第一次)。但不是
我有一个按钮可以将 body class 设置为 .blackout 我正在使用 js-cookie设置cookie,下面的代码与我的按钮相关联。 $('#boToggle').on('click'
我有一堆自定义的 HTML div。我将其中的 3 存储在具有 slide 类的 div 中。然后,我使用该幻灯片类调用 slick 函数并应用如下设置: $('.slide').slick({
我正在创建一个应该在 Windows 8(桌面)上运行的应用 我需要: 允许用户使用我的应用启动“文件历史记录”。我需要找到打开“文件历史记录”的命令行。 我需要能够显示“文件历史记录”的当前设置。
我刚买了一台新的 MacBook Pro,并尝试在系统中设置 RVM。我安装了 RVM 并将默认设置为 ➜ rvm list default Default Ruby (for new shells)
由于有关 Firestore 中时间戳行为即将发生变化的警告,我正在尝试更改我的应用的初始化代码。 The behavior for Date objects stored in Firestore
在 ICS 中,网络 -> 数据使用设置屏幕中现在有“限制后台数据”设置。 有没有办法以编程方式为我的应用程序设置“限制后台数据”? 或 有没有办法为我的应用程序调出具有选项的“数据使用”设置? 最佳
我正在尝试使用 NextJS 应用程序设置 Jest,目前在 jest.config.js : module.exports = { testPathIgnorePatterns: ["/.n
我最近升级到 FlashDevelop 4,这当然已经将我之前的所有设置恢复到原来的状态。 我遇到的问题是我无法在新设置窗口的哪个位置找到关闭它在方括号、大括号等之前插入的自动空格的选项。 即它会自动
有没有办法以编程方式访问 iPhone/iPod touch 设置? 谢谢。比兰奇 最佳答案 大多数用户设置可以通过读取存储在 /User/Library/Preferences/ 中的属性列表来访问
删除某些值时,我需要选择哪些设置来维护有序队列。我创建了带有自动增量和主键的 id 的表。当我第一次插入值时,没问题。就像 1,2,3,4,5... 当删除某些值时,顺序会发生变化,例如 1,5,3.
我正在尝试设置示例 Symfony2 项目,如此处所示 http://symfony.com/doc/current/quick_tour/the_big_picture.html 在访问 confi
我是一名优秀的程序员,十分优秀!