Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/187.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android mapOverlay项目背景未出现在旋转的mapview中?_Android_Android Mapview - Fatal编程技术网

Android mapOverlay项目背景未出现在旋转的mapview中?

Android mapOverlay项目背景未出现在旋转的mapview中?,android,android-mapview,Android,Android Mapview,您好,在我的应用程序中,我正在使用旋转贴图的mapview,这意味着将mapview添加到rotateview类中,并使用sensormanager。在mapview中,我在单击特定的管脚后加载了很多管脚,它在覆盖项上显示了该位置的名称,该管脚使用BalloniteMizedVerlay类 但是当我删除rotate类时,它显示如下 这是我的rotateview课程` public class RotateView extends ViewGroup implements SensorL

您好,在我的应用程序中,我正在使用旋转贴图的mapview,这意味着将mapview添加到rotateview类中,并使用sensormanager。在mapview中,我在单击特定的管脚后加载了很多管脚,它在覆盖项上显示了该位置的名称,该管脚使用BalloniteMizedVerlay类

但是当我删除rotate类时,它显示如下

这是我的rotateview课程`

     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;
    }