Android mapOverlay项目背景未出现在旋转的mapview中?
您好,在我的应用程序中,我正在使用旋转贴图的mapview,这意味着将mapview添加到rotateview类中,并使用sensormanager。在mapview中,我在单击特定的管脚后加载了很多管脚,它在覆盖项上显示了该位置的名称,该管脚使用BalloniteMizedVerlay类 但是当我删除rotate类时,它显示如下 这是我的rotateview课程`Android mapOverlay项目背景未出现在旋转的mapview中?,android,android-mapview,Android,Android Mapview,您好,在我的应用程序中,我正在使用旋转贴图的mapview,这意味着将mapview添加到rotateview类中,并使用sensormanager。在mapview中,我在单击特定的管脚后加载了很多管脚,它在覆盖项上显示了该位置的名称,该管脚使用BalloniteMizedVerlay类 但是当我删除rotate类时,它显示如下 这是我的rotateview课程` public class RotateView extends ViewGroup implements SensorL
public class RotateView extends ViewGroup implements SensorListener
{
private static final float SQ2 = 1.414213562373095f;
private final SmoothCanvas mCanvas = new SmoothCanvas();
private float mHeading = 0;
boolean check=false;
public RotateView(Context context) {
super(context);
}
public void onSensorChanged(int sensor, float[] values) {
//Log.d(TAG, "x: " + values[0] + "y: " + values[1] + "z: " + values[2]);
synchronized (this) {
mHeading = values[0];
if(!check)
{
if(Math.round(values[0])>0 || Math.round(values[0])<=90)
{
onGpsUpdate();
direction="NE";
GetPlacesDoInBack doinback=new GetPlacesDoInBack();
doinback.execute();
}
if(Math.round(values[0])>90 || Math.round(values[0])<=180)
{
check=true;
onGpsUpdate();
direction="SE";
GetPlacesDoInBack doinback=new GetPlacesDoInBack();
doinback.execute();
}
if(Math.round(values[0])>180 || Math.round(values[0])<=270)
{
check=true;
onGpsUpdate();
direction="SW";
GetPlacesDoInBack doinback=new GetPlacesDoInBack();
doinback.execute();
}
if(Math.round(values[0])>270 || Math.round(values[0])<=360)
{
check=true;
onGpsUpdate();
direction="NW";
GetPlacesDoInBack doinback=new GetPlacesDoInBack();
doinback.execute();
}
check=true;
}
else
{
if(Math.round(values[0])>0)
{
if(Math.round(values[0])==45)
{
onGpsUpdate();
direction="NE";
GetPlacesDoInBack doinback=new GetPlacesDoInBack();
doinback.execute();
}
if(Math.round(values[0])==135)
{
check=true;
onGpsUpdate();
direction="SE";
GetPlacesDoInBack doinback=new GetPlacesDoInBack();
doinback.execute();
}
if(Math.round(values[0])==225)
{
check=true;
onGpsUpdate();
direction="SW";
GetPlacesDoInBack doinback=new GetPlacesDoInBack();
doinback.execute();
}
if(Math.round(values[0])==315)
{
check=true;
onGpsUpdate();
direction="NW";
GetPlacesDoInBack doinback=new GetPlacesDoInBack();
doinback.execute();
}
}
}
double lat=Double.parseDouble(lati);
double lag=Double.parseDouble(longi);
Location zeroLocation = new Location("");
zeroLocation.setLatitude(lat);
zeroLocation.setLongitude(lag);
Location testLocation = new Location("");
testLocation.setLatitude(Double.parseDouble("27.74993670"));
testLocation.setLongitude(Double.parseDouble("85.37316799"));
final float[] results= new float[3];
// The computed distance in meters is stored in results[0].
// If results has length 2 or greater, the initial bearing is stored in results[1].
// If results has length 3 or greater, the final bearing is stored in results[2].
Location.distanceBetween(lat, lag, Double.parseDouble("27.74993670"), Double.parseDouble("85.37316799"), results);
final float bearing = results[1];
double lat1=Double.parseDouble(lati);
double lon1=Double.parseDouble(longi);
double lat2=Double.parseDouble("27.74993670");
double lon2=Double.parseDouble("85.37316799");
double d1= Math.toRadians(lat2-lat1);
double d2= Math.toRadians(lon2-lon1);
lat1=Math.toRadians(lat1);
lat2=Math.toRadians(lat2);
double y=Math.sin(d2) * Math.cos(lat2);
double x=Math.cos(lat1)*Math.sin(lat2) -
Math.sin(lat1)*Math.cos(lat2)*Math.cos(d2);
double brng = Math.toDegrees(Math.atan2(y, x));
brng=360-Math.abs(brng);
// Log.e("","****"+brng+"***"+mHeading+"***"+(brng-mHeading));
brng=360-Math.abs(zeroLocation.bearingTo(testLocation));
//Log.e("",""+zeroLocation.bearingTo(testLocation)+"****"+bearing+"***"+(brng-mHeading));
invalidate();
}
}
class GetPlacesDoInBack extends AsyncTask<URL, Integer, Long>
{
int i=0;
@Override
protected Long doInBackground(URL... arg0)
{
lati="35.227087";longi="-80.843127";
response=UrltoValue.getValuefromUrl(DataUrls.nearbylocationsurl+"?lat="+lati+"&long="+longi+"&direction="+direction+"&id="+scatid);
Log.e("Check",UrltoValue.getValuefromUrl(DataUrls.nearbylocationsurl+"?lat="+lati+"&long="+longi+"&direction="+direction+"&id="+scatid));
Log.e("getplaces response", response);
try
{
JSONArray jarray=new JSONArray(response);
placesname=new String[jarray.length()];
placeslat=new String[jarray.length()];
placeslon=new String[jarray.length()];
placesaddr=new String[jarray.length()];
for(int i=0;i<jarray.length();i++)
{
placesname[i]=jarray.getJSONObject(i).getString("name");
placeslat[i]=jarray.getJSONObject(i).getString("latitude");
placeslon[i]=jarray.getJSONObject(i).getString("longitude");
placesaddr[i]=jarray.getJSONObject(i).getString("address");
Log.e("placesname",placesname[i]);Log.e("placeslat",placeslat[i]);
Log.e("placeslon",placeslon[i]);Log.e("placesaddr",placesaddr[i]);
}
}
catch(Exception e)
{
e.printStackTrace();
}
return null;
}
protected void onPostExecute(Long result)
{
home.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
if(click==0)
{
click=1;
headertext.setText("Categories");
home.setBackgroundResource(R.drawable.homeicon);
maplayout.setVisibility(View.GONE);
vlayout.setVisibility(View.VISIBLE);
}
else
{
BalloonItemizedOverlay.check=0;
InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(v.getWindowToken(),0);
Intent in=new Intent(DNCActivity.this,Main.class);
startActivity(in);
finish();
}
}
});
if(response.trim().equals("[]"))
{
}
else
{
try
{
for (Overlay overlay : mapOverlays) {
if (overlay instanceof BalloonItemizedOverlay<?> ) {
if (((BalloonItemizedOverlay<?>) overlay).balloonView != null)
((BalloonItemizedOverlay<?>) overlay).balloonView.setVisibility(View.GONE);
}
}
mapOverlays.clear();
if(!mapOverlays.isEmpty())
{
mapOverlays.remove(itemizedOverlay);
mapView.invalidate();
mapView.getOverlays().remove(mapOverlays);
mapOverlays.clear();
}
for(int j=0;j<placeslon.length;j++)
{
String templat=placeslat[j];
String templon=placeslon[j];
String title="Name: "+placesname[j];
String park="Address: "+placesaddr[j];
mapLoad(templat,templon,title);
}
}
catch(Exception e)
{
}
}
}
}
@Override
protected void dispatchDraw(Canvas canvas)
{
canvas.save(Canvas.MATRIX_SAVE_FLAG);
canvas.rotate(-mHeading, getWidth() * 0.5f, getHeight() * 0.5f);
mCanvas.delegate = canvas;
super.dispatchDraw(mCanvas);
canvas.restore();
}
@Override
protected void onLayout(boolean changed, int l, int t, int r, int b)
{
final int width = getWidth();
final int height = getHeight();
final int count = getChildCount();
for (int i = 0; i < count; i++)
{
final View view = getChildAt(i);
final int childWidth = view.getMeasuredWidth();
final int childHeight = view.getMeasuredHeight();
final int childLeft = (width - childWidth) / 2;
final int childTop = (height - childHeight) / 2;
view.layout(childLeft, childTop, childLeft + childWidth, childTop + childHeight);
}
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec)
{
int w = getDefaultSize(getSuggestedMinimumWidth(), widthMeasureSpec);
int h = getDefaultSize(getSuggestedMinimumHeight(), heightMeasureSpec);
int sizeSpec;
if (w > h)
{
sizeSpec = MeasureSpec.makeMeasureSpec((int) (w * SQ2), MeasureSpec.EXACTLY);
}
else
{
sizeSpec = MeasureSpec.makeMeasureSpec((int) (h * SQ2), MeasureSpec.EXACTLY);
}
final int count = getChildCount();
for (int i = 0; i < count; i++)
{
getChildAt(i).measure(sizeSpec, sizeSpec);
}
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
}
@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
return super.dispatchTouchEvent(ev);
}
public void onAccuracyChanged(int sensor, int accuracy) {
}
}
公共类RotateView扩展视图组实现SensorListener
{
专用静态最终浮动SQ2=1.414213562373095f;
private final SmoothCanvas mCanvas=新的SmoothCanvas();
私有浮动mHeading=0;
布尔检查=假;
公共旋转视图(上下文){
超级(上下文);
}
已更改传感器上的公共void(int传感器,浮点[]值){
//Log.d(标记“x:”+值[0]+“y:”+值[1]+“z:”+值[2]);
已同步(此){
mHeading=值[0];
如果(!检查)
{
if(Math.round(值[0])>0 | | Math.round(值[0])90 | | | Math.round(值[0])180 | | Math.round(值[0])270 | | Math.round(值[0])0)
{
if(数学舍入(值[0])==45)
{
OngpUpdate();
方向=“NE”;
GetPlacesDoInBack doinback=新建GetPlacesDoInBack();
doinback.execute();
}
if(数学舍入(值[0])==135)
{
检查=正确;
OngpUpdate();
方向=“SE”;
GetPlacesDoInBack doinback=新建GetPlacesDoInBack();
doinback.execute();
}
if(数学四舍五入(值[0])==225)
{
检查=正确;
OngpUpdate();
方向=“SW”;
GetPlacesDoInBack doinback=新建GetPlacesDoInBack();
doinback.execute();
}
if(数学四舍五入(值[0])==315)
{
检查=正确;
OngpUpdate();
方向=“NW”;
GetPlacesDoInBack doinback=新建GetPlacesDoInBack();
doinback.execute();
}
}
}
双lat=double.parseDouble(lati);
双滞后=double.parseDouble(longi);
位置zeroLocation=新位置(“”);
零位置。设置纬度(纬度);
设置经度(滞后);
位置testLocation=新位置(“”);
testLocation.setLatitude(Double.parseDouble(“27.74993670”));
setLongitude(Double.parseDouble(“85.37316799”);
最终浮动[]结果=新浮动[3];
//以米为单位计算的距离存储在结果[0]中。
//如果结果的长度为2或更大,则初始轴承将存储在结果[1]中。
//如果结果的长度为3或更大,则最终轴承将存储在结果[2]中。
位置之间的距离(lat、lag、Double.parseDouble(“27.74993670”)、Double.parseDouble(“85.37316799”)、结果);
最终浮动轴承=结果[1];
双lat1=double.parseDouble(lati);
double lon1=double.parseDouble(longi);
double lat2=double.parseDouble(“27.74993670”);
double lon2=double.parseDouble(“85.37316799”);
双d1=数学toradian(lat2-lat1);
双d2=数学托拉迪安(lon2-lon1);
lat1=数学托拉迪安(lat1);
lat2=数学托拉迪安(lat2);
双y=数学sin(d2)*数学cos(lat2);
双x=数学cos(lat1)*数学sin(lat2)-
数学sin(lat1)*数学cos(lat2)*数学cos(d2);
double brng=数学toDegrees(数学atan2(y,x));
brng=360数学绝对值(brng);
//Log.e(“,”***“+brng+”***“+mHeading+”***“+(brng mHeading));
brng=360 Math.abs(零位置。承载到(测试位置));
//Log.e(“,”+zeroLocation.bearingTo(testLocation)+“******”+轴承+“***”+(brng mHeading));
使无效();
}
}
类GetPlacesDoInBack扩展了AsyncTask
{
int i=0;
@凌驾
受保护的长doInBackground(URL…arg0)
{
lati=“35.227087”longi=“-80.843127”;
response=UrltoValue.getValuefromUrl(dataURL.nearbylocationsurl+”?lat=“+lati+”&long=“+longi+”&direction=“+direction+”&id=“+scatid”);
Log.e(“检查”,UrltoValue.getValuefromUrl(dataURL.nearbylocationsurl+”?lat=“+lati+”&long=“+longi+”&direction=“+direction+”&id=“+scatid));
Log.e(“getplaces响应”,响应);
尝试
{
JSONArray jarray=新JSONArray(响应);
placesname=新字符串[jarray.length()];
placeslat=新字符串[jarray.length()];
placeslon=新字符串[jarray.length()];
placesaddr=新字符串[jarray.length()];
对于(int i=0;i在使用rotateview旋转mapview时,您必须通过覆盖dispatchTouchEvent()
请参阅下面的代码
@Override
public boolean dispatchTouchEvent(MotionEvent event) {
float[] coords = new float[] {
event.getX(), event.getY()
};
adjustCoords(coords, -mHeading);
MotionEvent evt = MotionEvent.obtain(event.getDownTime(), event.getEventTime(), event
.getAction(), coords[0], coords[1], event.getPressure(), event.getSize(), event
.getMetaState(), event.getXPrecision(), event.getYPrecision(), event.getDeviceId(),
event.getEdgeFlags());
return super.dispatchTouchEvent(evt);
}
protected void adjustCoords(float[] coords, float deg) {
float x = coords[0];
float y = coords[1];
int centerX = getWidth() / 2;
int centerY = getHeight();
// convert to radians
float rad = (float) ((deg * Math.PI) / 180F);
float s = (float) Math.sin(rad);
float c = (float) Math.cos(rad);
// translate point back to origin:
x -= centerX;
y -= centerY;
// apply rotation
float tmpX = x * c - y * s;
float tmpY = x * s + y * c;
x = tmpX;
y = tmpY;
// translate point back:
x += centerX;
y += centerY;
coords[0] = x;
coords[1] = y;
}