- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我的应用程序中有一个 MapView,我正在这张 map 上绘制几个圆形叠加层。一切正常,但当我放大 map 时,覆盖半径没有改变。我曾尝试在论坛和谷歌上搜索解决方案,但找不到适合我的解决方案。有人有什么想法吗?
这是我的代码:
HelloGoogleMaps.java(主要 Activity )
package com.adam.maps;
import java.util.Iterator;
import java.util.List;
import android.content.Context;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.Bundle;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnTouchListener;
import android.widget.AbsoluteLayout;
import android.widget.RelativeLayout;
import android.widget.Toast;
import android.widget.ZoomButtonsController.OnZoomListener;
import com.google.android.maps.GeoPoint;
import com.google.android.maps.MapActivity;
import com.google.android.maps.MapController;
import com.google.android.maps.MapView;
public class HelloGoogleMaps extends MapActivity {
//create new LocationManager
//and LocationListener objects
LocationManager lm;
LocationListener locationListener;
OnZoomListener listener;
//create a new MapView
//and MapController object
MapView mapView;
MapController mc;
RelativeLayout parent;
int num = 4;
//LoopRegion region[] = new LoopRegion[num];
//LoopRegion border[] = new LoopRegion[num];
float regionX[] = {(float) 42.91556645193364, (float) 42.9151598328247,
(float) 43.00110298764482, (float) 43.00054196511636};
float regionY[] = {(float) -78.87073255078127, (float) -78.8714594294243,
(float) -78.78354466454317, (float) -78.78226256863405};
int regionR[] = {100, 70, 150, 75};
GeoPoint regionC[] = new GeoPoint[num];
CustomOverlay overlay[] = new CustomOverlay[num];
CustomOverlay overlayLoc;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Toast.makeText(getBaseContext(),
"Welcome to 'sound clusters'" ,
Toast.LENGTH_LONG).show();
//---use the LocationManager class to obtain GPS locations---
lm = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
locationListener = new MyLocationListener();
lm.requestLocationUpdates(
LocationManager.GPS_PROVIDER,
0,
0,
locationListener);
//set our mapViewer object to our "mapview" namespace in the xml layout file
//this allows us to set the zoom control "ON" in our view
mapView = (MapView) findViewById(R.id.mapview);
//this will enable zoom controls, and put it on the screen
mapView.setBuiltInZoomControls(true);
//--------------------------------------------------------//
parent = (RelativeLayout) findViewById(R.id.parent);
//-------this is part of creating an overlay icon-------------------------------
/*List<Overlay> mapOverlays = mapView.getOverlays();
Drawable drawable = this.getResources().getDrawable(R.drawable.icon);
CustomItemizedOverlay itemizedOverlay =
new CustomItemizedOverlay(drawable, this);*/
//------------------------------------------------------------------------------
// Create new Overlay
for (int i = 0; i < num; i++){
regionC[i] = new GeoPoint(
(int) (regionX[i] * 1E6),
(int) (regionY[i] * 1E6));
int newRadius = (int) feetToPixels(mapView.getZoomLevel(), regionR[i]);
overlay[i] = new CustomOverlay(regionC[i], newRadius);
mapView.getOverlays().add(overlay[i]);
}
//-------this is part of creating an overlay icon-------------------------------
/*OverlayItem overlayitem =
new OverlayItem(point, "Hello", "I'm in Athens, Greece!");
itemizedOverlay.addOverlay(overlayitem);
mapOverlays.add(itemizedOverlay);*/
//------------------------------------------------------------------------------
mc = mapView.getController();
mc.setZoom(20);
mapView.setSatellite(true);
Toast.makeText(getBaseContext(),
"Zoom level: " + mapView.getZoomLevel(),
Toast.LENGTH_SHORT).show();
}
//not sure what this does, but Google says you need it----//
@Override
protected boolean isRouteDisplayed() {
return false;
}
//--------------------------------------------------------//
private class MyLocationListener implements LocationListener
{
//@Override
public void onLocationChanged(Location loc) {
if (loc != null) {
List overlays = mapView.getOverlays();
// first remove old overlay
if (overlays.size() > 0) {
for (Iterator iterator = overlays.iterator(); iterator
.hasNext();) {
iterator.next();
iterator.remove();
}
}
GeoPoint p = new GeoPoint(
(int) (loc.getLatitude() * 1E6),
(int) (loc.getLongitude() * 1E6));
overlayLoc = new CustomOverlay(p, 5);
mapView.getOverlays().add(overlayLoc);
for (int i = 0; i < num; i++){
mapView.getOverlays().add(overlay[i]);
}
//mc.animateTo(p);
//mc.setZoom(16);
mapView.invalidate();
}
}
//@Override
public void onProviderDisabled(String provider) {
// TODO Auto-generated method stub
}
//@Override
public void onProviderEnabled(String provider) {
// TODO Auto-generated method stub
}
//@Override
public void onStatusChanged(String provider, int status,
Bundle extras) {
// TODO Auto-generated method stub
}
}
//custom functions--------------------------------------------------------------------
private static final double equatorFeet = 131479920;
private double feetToPixels(int zoomLevel, int feet) {
double equatorPixels = 256;
for (int i = 1; i < zoomLevel; i++) {
equatorPixels = equatorPixels * 2;
}
double pixelPerFoot = equatorPixels / equatorFeet;
return feet * pixelPerFoot;
}
//------------------------------------------------------------------------------------
}
和覆盖类CustomOverlay.java
package com.adam.maps;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Point;
import com.google.android.maps.GeoPoint;
import com.google.android.maps.MapView;
import com.google.android.maps.Overlay;
import com.google.android.maps.Projection;
public class CustomOverlay extends Overlay {
private GeoPoint geopoint;
private int rad;
public CustomOverlay(GeoPoint point, int radius) {
geopoint = point;
rad = radius;
}
@Override
public void draw(Canvas canvas, MapView mapView, boolean shadow) {
// Transform geo-position to Point on canvas
Projection projection = mapView.getProjection();
Point point = new Point();
//store the transformed geopoint into a point with pixel values
projection.toPixels(geopoint, point);
/*// text "My Location"
Paint text = new Paint();
text.setAntiAlias(true);
text.setColor(Color.BLUE);
text.setTextSize(12);
text.setTypeface(Typeface.MONOSPACE);*/
// the circle to mark the spot
Paint circlePaint = new Paint();
circlePaint.setAntiAlias(true);
//fill region
circlePaint.setColor(Color.RED);
circlePaint.setAlpha(90);
circlePaint.setStyle(Paint.Style.FILL);
canvas.drawCircle(point.x, point.y, rad, circlePaint);
//border region
circlePaint.setColor(Color.WHITE);
circlePaint.setAlpha(255);
circlePaint.setStyle(Paint.Style.STROKE);
circlePaint.setStrokeWidth(3);
canvas.drawCircle(point.x, point.y, rad, circlePaint);
/*canvas.drawText("My Location", point.x + 3 * CIRCLERADIUS, point.y + 3
* CIRCLERADIUS, text);*/
}
}
预先感谢您的帮助!
最佳答案
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.Point;
import com.google.android.maps.GeoPoint;
import com.google.android.maps.MapView;
import com.google.android.maps.Overlay;
public class MapCircleOverlay extends Overlay {
private GeoPoint point;
private Paint paint1, paint2;
private float radius; //in meters
public MapCircleOverlay(GeoPoint point, float radius) {
this.point = point;
paint1 = new Paint();
paint1.setARGB(128, 0, 0, 255);
paint1.setStrokeWidth(2);
paint1.setStrokeCap(Paint.Cap.ROUND);
paint1.setAntiAlias(true);
paint1.setDither(false);
paint1.setStyle(Paint.Style.STROKE);
paint2 = new Paint();
paint2.setARGB(64, 0, 0, 255);
this.radius = radius;
}
@Override
public void draw(Canvas canvas, MapView mapView, boolean shadow) {
Point pt = mapView.getProjection().toPixels(point, null);
float projectedRadius = mapView.getProjection().metersToEquatorPixels(radius);
canvas.drawCircle(pt.x, pt.y, projectedRadius, paint2);
canvas.drawCircle(pt.x, pt.y, projectedRadius, paint1);
}
}
我修改了 Bundius 的答案,因此它适用于您可以作为构造函数的一部分输入的仪表。
关于android maps circle overlay,动态改变半径?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5722490/
我有一个带有用于覆盖的 css 类的面板,其中包含一个不应该透明的 div
我已经尝试了 2 天不让 openldap 的 memberof overlay 工作并给出一些实际结果。我的数据库配置: database bdb suffix "dc=exampl
我想使用 jquery ui 弹出一个模式对话框,其中覆盖层是全黑的。我知道我可以在主题中设置它,但我不希望所有对话框都有黑色覆盖。只是其中之一。 有没有办法在每个对话框的基础上配置对话框的背景(覆盖
我是新来的,所以如果我问错了问题或忘记了什么,我先道歉。我尝试了其他问题/答案中的内容,但无法解决我的问题。 我在 div1 上有一个简单的叠加 div2。 div1 里面有一个 svg。 svg 向
我正在使用 npm overlay-navbar 模块创建一个 overlay-navbar https://www.npmjs.com/package/overlay-navbar但是我收到一个错误
我只想为我在 nix 的叠加层中定义的构建应用配置点。 也就是我要设置 permittedInsecurePackages = [ "webkitgtk-2.4.11" ]; 在叠加层中。我
我需要有关如何正确使用 Google Maps API v3 自定义叠加层的 onRemove() 方法的帮助。我在 Google map 上有一个标记,单击该标记时,将显示一个 d3 圆环图,该图将
首先这是我正在使用和尝试做的事情: 此效果的最小设置:flowplayer.org/tools/demos/overlay/index.html 然后是 Apple Leopard 预览效果:flow
我的问题真的很简单...... 想象一张代表您家周围的街道和建筑物的背景图片,请注意这是专门制作的图片。此图像( View )是可缩放的,到目前为止一切都很好。类似于 map ,但使用图像代替。 现在
我正在使用花式框在行内 div 中打开各种编辑功能。我使用ajax获取div内容,将其移动到div中,然后在Fancybox中打开div。大多数情况下效果很好。一些编辑 block 中包含 ckedi
在应用程序中扩展 OSMdroid Overlay 类时 import org.osmdroid.views.overlay.Overlay; ... public class MapOverlayA
我的应用程序有问题,其中包括 osmdroid。每次我尝试在我的设备上运行该应用程序并触摸 map 时,该应用程序都会崩溃,并且出现此错误: 2018-10-02 14:11:45.191 1
我如何在UWP应用程序中实现这样的功能?使用案例:静态图像包含蓝点(覆盖),使用户有机会在蓝点上单击/悬停以了解更多信息。当用户悬停/单击蓝点时,会弹出一个文本来描述图像中的内容。。1)如何在静态图像
仅适用于 iOS:当您将叠加层添加到 Web HTML 用户界面时,您无法通过设置 overflow: hidden on the body 或 html 来阻止底层页面滚动到叠加层之外。这在桌面和
我是 HTML/CSS 新手。我创建了这个侧边栏,当单击时,它会从左侧滑动,滑动时会显示不透明背景。不幸的是,图像显示在不透明覆盖层的顶部,我找不到让它停止在不透明覆盖层上如此明亮地显示的问题。我正在
是否可以创建一个窗口作为另一个窗口的叠加层,例如,您可以在窗口的标题栏或状态栏中显示一个图标? 为了这个问题的目的假设: 该窗口是一个外部窗口(不属于我的应用程序) 叠加层为 16x16 像素并具有透
在 bokeh Holoviews 画廊中,有一个名为“Scatter economic”的示例。 http://holoviews.org/gallery/demos/bokeh/scatter_e
制作 gwt 覆盖类型的深拷贝的最佳方法是什么? 我正在寻找一个函数或库来检查 GWT 覆盖并克隆它。它必须能够克隆包含的数组或对象。 谢谢 最佳答案 我会考虑两种方式。大多数时候覆盖对象与 JSON
最近,我尝试创建一个 Ionic 侧边菜单。我想让侧面菜单覆盖联系人。 但是,我不想推送内容。 --> fu
我正在尝试在另一个正在运行的应用程序上方创建一个覆盖窗口。 让我们说火狐。我通过使用实现 创建窗口 win = XCreateWindow( display, *firefoxwindow,
我是一名优秀的程序员,十分优秀!