android现学现用第九天(消失了两天~我又回来啦)

这段代码很不错,正在试验可行性~

第五步:自定义地图的图层

  接下来,我们需要为地图多增加一些自定义的功能,比如可以在地图上进行一些标注。为了实现这样的功能,我们可以继承Overlay这个类,这个类是一个基类,提供了可以在地图上添加图层的基本功能。而另外的选择是,我们可以继承itemzedOverlay这个类,

  它提供了一种快捷的方法,可以把标记图片和相关的文本分配给特定的地理位置。ItemizedOverlay实例可以处理每一个OverlayItem(OverlayItem可以简单理解为在地图上的每一个标记)标记的绘制、放置、单击处理、焦点控制和布局优化。下面我们看代码:

package com.javacodegeeks.android.googlemaps;
import java.util.ArrayList;
import android.app.AlertDialog;
import android.content.Context;
import android.graphics.drawable.Drawable;
import com.google.android.maps.ItemizedOverlay;
import com.google.android.maps.OverlayItem;
public class CustomItemizedOverlay extends ItemizedOverlay<OverlayItem> {
   
   
private ArrayList<OverlayItem> mapOverlays = new ArrayList<OverlayItem>();
   
   
private Context context;
   
   
public CustomItemizedOverlay(Drawable defaultMarker) {
        super(boundCenterBottom(defaultMarker));
   }
   
   
public CustomItemizedOverlay(Drawable defaultMarker, Context context) {
        this(defaultMarker);
        this.context 
= context;
   }

   @Override
   protected OverlayItem createItem(
int i) {
      return mapOverlays.get(i);
   }

   @Override
   
public int size() {
      return mapOverlays.size();
   }
   
   @Override
   protected 
boolean onTap(int index) {
      OverlayItem item 
= mapOverlays.get(index);
      AlertDialog.Builder dialog 
= new AlertDialog.Builder(context);
      dialog.setTitle(item.getTitle());
      dialog.setMessage(item.getSnippet());
      dialog.show();
      return 
true;
   }
   
   
public void addOverlay(OverlayItem overlay) {
      mapOverlays.add(overlay);
       this.populate();
   }

}

  在这个类中,需要在构造函数中使用Drawable类,这将被用作来绘制一个标记。此外,我们使用ArrayList去保存所有的Overlayitems,而createitem和size方法则容易理解了,分别是返回每一个Overlayitem和返回目前的所有标记的数目。而onTap方法则是在当某个标记在地图上真正标注时所触发的,比如当在触摸屏上点击时,也可以触发该事件。在这个例子中,我们只是通过弹出对话框的方法展示给用户看。最后,在addOverlay方法中,我们向标记数组mapOverlays中增加一个overlayitem标记,并且调用populate方法将其展示出来。

  接下来我们看下如何使用上面的这个类,将代码修改如下:

package com.javacodegeeks.android.googlemaps;

import java.util.List;

import android.graphics.drawable.Drawable;
import android.os.Bundle;

import com.google.android.maps.GeoPoint;
import com.google.android.maps.MapActivity;
import com.google.android.maps.MapController;
import com.google.android.maps.MapView;
import com.google.android.maps.Overlay;
import com.google.android.maps.OverlayItem;

public class GMapsActivity extends MapActivity {
    
    
private MapView mapView;
    
    
private static final int latitudeE6 = 37985339;
    
private static final int longitudeE6 = 23716735;
    
    @Override
    
public void onCreate(Bundle savedInstanceState) {
        
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        
        mapView 
= (MapView) findViewById(R.id.map_view);       
        mapView.setBuiltInZoomControls(
true);
        
        List
<OVERLAY> mapOverlays = mapView.getOverlays();
        Drawable drawable 
= this.getResources().getDrawable(R.drawable.icon);
        CustomItemizedOverlay itemizedOverlay 
= 
             
new CustomItemizedOverlay(drawable, this);
        
        GeoPoint point 
= new GeoPoint(latitudeE6, longitudeE6);
        OverlayItem overlayitem 
= 
             
new OverlayItem(point, "Hello""I'm in Athens, Greece!");
        
        itemizedOverlay.addOverlay(overlayitem);
        mapOverlays.add(itemizedOverlay);
        
        MapController mapController 
= mapView.getController();
        
        mapController.animateTo(point);
        mapController.setZoom(
6);
        
    }

    @Override
    protected 
boolean isRouteDisplayed() {
        return 
false;
    }
    
}

  在上面的代码中,我们实例化了CustomItemizedOverlay类,并为其构造函数传入了Android默认的Drawable类的实例进行初始化,接下来,我们用一个预先定义好的经纬度去实例化一个GeoPoint类,GeoPoint类表示一个具体的位置。然后再用这个geopoint类的实例去初始化OverlayItem对象的实例,并且传入一段文本,这样就产生了一个完整的地图上的标记了,最后把这个标记加入到图层中去,这是通过调用CustomItemizedOverlay类的addOverlay去实现的,最后该标记就会出现在地图上了。



证明可用,现在试验如何为我所用

android GeoPoint参数问题?

获取当前位置的经纬度是有小数的,如何调用这个方法呢?

x1E6


在使用LocationManager.getLastKnownLocation("gps")获取gps定位的过程中老是报空指针异常 

在网上百度查了不少资料发现这个问题多出现在2.0以上版本 
解决方法多是: 
1.在AndroidManifest.xml中添加

Xml代码 复制代码
  1. <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />  
  2. <uses-permission android:name="android.permission.INTERNET" />  
  3. <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />  


2.在emulator control中手动设置经纬度 

但是我的程序这些都写了依旧报空指针 

后来在外国论坛上终于找到一些启发 
一个哥们这样写代码

Java代码 复制代码
  1. LocationManager mgr = (LocationManager) getSystemService(Context.LOCATION_SERVICE);   
  2. Location location = mgr.getLastKnownLocation(bundle.getString("provider"));   
  3. while(location  == null)   
  4. {   
  5.   mgr.requestLocationUpdates("gps"600001, locationListener);   
  6. }  


我试了一下还真有效,他的解释是用debug发现getLastKnownLocation()方法不是一次就能定位的,必须多次才能成功。 

但是显然这样用循环一直等待很没效率,所以我重写了MapActivity的方法

Java代码 复制代码
  1.   /**  
  2.     * 这里一定要对LocationManager进行重新设置监听  
  3.     * mgr获取provider的过程不是一次就能成功的  
  4.     * mgr.getLastKnownLocation很可能返回null  
  5.     * 如果只在initProvider()中注册一次监听则基本很难成功  
  6.     */  
  7. @Override  
  8. protected void onResume() {   
  9.     super.onResume();   
  10.     mgr.requestLocationUpdates(bundle.getString("provider"), 600001, locationListener);   
  11. }   
  12.   
  13. @Override  
  14. protected void onPause() {   
  15.     super.onPause();   
  16.     mgr.removeUpdates(locationListener);   
  17. }  


一样也成功了。。 

在外国技术论坛上找了个解释,个人感觉很贴切: 

The call to request update for a location is not blocking, hence it wont wait there. Also the provider in emulator may not have been started. 

A possible check could be to see if the settings in it disable gps provider ? then send geo fix. 

However, I would use Location Listener, it would be ideal in your case since you need a geo fix to proceed further.Location Listener is Used for receiving notifications from the LocationManager when the location has changed. You can unregister the listener after first geofix. 



jiong  怎么添加多个标记呢

原来直接添加就可以,刚才不能是别的原因。

GeoPoint point = new GeoPoint(latitudeE6longitudeE6);

        OverlayItem overlayitem = 

             new OverlayItem(point, "Hello""I'm in Athens, Greece!");

        itemizedOverlay.addOverlay(overlayitem);

        GeoPoint point1 = new GeoPoint(22283149,114138014 );

        OverlayItem overlayitem1 = 

             new OverlayItem(point1, "Hello""I'm in Athens, Greece!");

        itemizedOverlay.addOverlay(overlayitem1);

        mapOverlays.add(itemizedOverlay);

        

        MapController mapController = mapView.getController();

        

        //mapController.animateTo(point);

        mapController.setZoom(18);

        mapView.getController().setCenter(point); 

今天的效果图是:

最后却出了点问题。没办法获得GPS服务了。。

首先 连接gps需要很长的时间,慢慢等

然后substring一直报错什么问题?每个参数都察看了没有问题,放到一起就出问题!

posted on 2011-09-11 13:23  Wind Runner  阅读(349)  评论(0编辑  收藏  举报

导航