在上一篇文章中给大家带来了给地图如何添加标注物,这篇文章将要告诉大家如何在地图的范围内进行检索于对路线进行搜索
如果有什么不懂的请看上一篇帖子
《002 走上移动开发之安卓项目实战(百度地图:给地图添加标注物)》
如果还有什么看不懂的请您先从第一篇文章看起
《001 走上移动开发之安卓项目实战(百度地图:建立百度地图开发环境)》
还请大家注意在文章进行转载的时候麻烦注明出处
《http://blog.csdn.net/shuaiyinoo》谢谢
第一个:接下来正式开始给大家带来新的知识点,首先给大家带来的是如何在地图中进行检索
在进行地图检索的时候其实特别的简单,你只需要自定义一个 MySearchListener ,去实现 MKSearchListener 这个有百度地图提供的API即可,当然里面还得实现类里面的方法
//搜索对象的实现 public class MySearchListener implements MKSearchListener{ @Override public void onGetAddrResult(MKAddrInfo arg0, int arg1) { } @Override public void onGetBusDetailResult(MKBusLineResult arg0, int arg1) { } @Override public void onGetDrivingRouteResult(MKDrivingRouteResult result, int type) { //对调用的搜索方法进行回调响应 if(result == null){ return; } RouteOverlay routeOverlay = new RouteOverlay(BaiDu_SuYiActivity.this, mapView); //里面的参赛之所以填0是应为我们只需要返回第一条线路 routeOverlay.setData(result.getPlan(0).getRoute(0)); mapView.getOverlays().add(routeOverlay); mapView.invalidate(); } @Override public void onGetPoiDetailSearchResult(int arg0, int arg1) { } @Override public void onGetPoiResult(MKPoiResult result, int type, int iError) { //对调用的搜索方法进行回调响应 if(result == null){ return; } PoiOverlay poiOverlay = new PoiOverlay(BaiDu_SuYiActivity.this, mapView); poiOverlay.setData(result.getAllPoi()); mapView.getOverlays().add(poiOverlay); mapView.invalidate(); } @Override public void onGetRGCShareUrlResult(String arg0, int arg1) { } @Override public void onGetSuggestionResult(MKSuggestionResult arg0, int arg1) { } @Override public void onGetTransitRouteResult(MKTransitRouteResult arg0, int arg1) { } @Override public void onGetWalkingRouteResult(MKWalkingRouteResult arg0, int arg1) { } }注意别忘了定义搜索对象,在类的最前面定义
//定义搜索对象 private MKSearch mkSearch ;
然后在 onCreate 方法中加入如下代码
比如我要以天安门为中心搜索周围5000M的厕所就可以用
mkSearch.poiSearchNearBy("厕所", new GeoPoint((int)(39.915*1E6),(int)(116.404*1E6)), 5000);即可,这里我就不一一列举。
//v4.00 //mapController.setZoom(14); //在地图范围内实现对物体的搜索 //mkSearch = new MKSearch(); //mkSearch.init(bMapManager, new MySearchListener()); //这个方法表示根据中心点搜索周边的内容 //mkSearch.poiSearchNearBy("厕所", new GeoPoint((int)(39.915*1E6),(int)(116.404*1E6)), 5000);
第二个:要给大家介绍的就是对驾车路线的搜索
第一步跟 《第一个:在地图范围内搜索一样》自定义一个 MySearchListener ,去实现 MKSearchListener 这个有百度地图提供的API即可,当然里面还得实现类里面的方法
然后同样在 onCreate 方法中加入如下代码
//v5.00 mapController.setZoom(14); //在地图范围内实现对物体的搜索 mkSearch = new MKSearch(); mkSearch.init(bMapManager, new MySearchListener()); //给定第一个坐标 start = new MKPlanNode(); start.pt = new GeoPoint((int)(39.915*1E6),(int)(116.404*1E6)); //给定第二个坐标 end = new MKPlanNode(); end.pt = new GeoPoint(40057031,116307852); //路线的优先顺序 mkSearch.setDrivingPolicy(MKSearch.EBUS_TIME_FIRST); //调用路线的回调方法 mkSearch.drivingSearch(null, start, null, end);
注意这里要在类的最上面定义两个点,起始点和结束点
//定义一个起点 private MKPlanNode start; //定义一个终点 private MKPlanNode end;
这里要注意的有两个地方,第一个就是线路的优先顺序
在mkSearch.setDrivingPolicy() 这个方法中有多种类型可以供选择,百度地图提供的API中有如下选择对象-->官方文档地址
然后要注意的是 drivingSearch 方法中的参数要注意
最后:给大家说两句说说,其实我这写的只是皮毛中的皮毛,仅仅给那些跟我水平一样的人提供一些方便,相互的学习共同成长,还请那些大牛,大卡,们不要见笑
每天在睡觉的时候,希望大家明白,明天又是美好的一天哦......
1.关于JQueryMobile框架的基本页面搭建。
需要工具:DW CS5.5 版本的开发工具。
最新版的JQM的架包(写文档时最新的为1.3.0)
DW有移动程序开发的模板,新建一个站点并且有相应的模拟器启动方法。
a.每新建一个HTML页都需要有这样的头:
<head>
<meta charset="utf-8">
<title>jQuery Mobile Web 应用程序</title>
<meta name="viewport" content="width=device-width, initial-scale=1">
<!--JQueryMobile引用-->
<link rel="stylesheet" href="/blog_article/jquery-mobile/jquery.mobile-1.3.0.min.css" />
<link rel="stylesheet" href="/blog_article/jquery-mobile/jquery.mobile.structure-1.3.0.min.css" />
<link rel="stylesheet" href="/blog_article/jquery-mobile/jquery.mobile.theme-1.3.0.min.css" />
<script src="/blog_article/jquery-mobile/jquery-1.8.2.min.js"></script>
<script src="/blog_article/jquery-mobile/jquery.mobile-1.3.0.min.js"></script>
</head>
红色区域必须有的引入,例子引的是本地站点的文件,也可以连接服务器上的文件,官网推荐连接服务器上的这种方式,(我认为如果移动终端未联网或许会获取不到,为了保险我还是习惯于用本地文件。)如下:
<link rel="stylesheet" href="http://code.jquery.com/mobile/1.3.0/jquery.mobile-1.3.0.min.css" />
<
<script src="http://code.jquery.com/jquery-1.8.2.min.js"></script>
<
<script src="http://code.jquery.com/mobile/1.3.0/jquery.mobile-1.3.0.min.js"></script>
b.JQM的页面结构
<body>
<!------------------------------------------------首页导航---------------------------------------------------->
<div data-role="page" id="page">
<div data-role="header">
<h1>首页</h1>
</div>
<div data-role="content">
<ul data-role="listview">
<li><a href="#makeListViewPage" data-rel="dialog">Make a listview</a></li>
<li><a href="#addUIView" data-transition="pop">Add UIView</a></li>
<li><a href="/blog_article/page2.html" data-prefetch data-ajax="false">第 4 页</a></li>
</ul>
</div>
<div data-role="footer">
<h4>页面脚注</h4>
</div>
</div>
</body>
标签属性:
JQM的标签是在正常的HTML的标签中加入data-attribute调去API中的相应的属性来进行设置。
<div data-role="page" id="page"> 表示当前这个div是一个页面体,标识是data-role="page"。
<div data-role="header"> 表示当前这个div是一个页面体的头,标识是data-role="header"。
<div data-role="content">表示当前这个div是一个页面体的内容,标识是data-role="content"。
<div data-role="footer">表示当前这个div是一个页面体的底部,标识是data-role="footer"。
以上是整个页面体的主要标签,所有标签都是成对出现的,并且在标签中还可以使用正常的HTML语言和CSS样式。
<ul data-role="listview">表示当前这个ul是一个listview,标识是data-role="listview"。并且listview的使用必须是ul的HTML标签。
<a href="#makeListViewPage" data-rel="dialog">Make a listview</a>表示当前的想要连接的页面是以一个对话框的形式展现的。标识是data-rel="dialog"。
<a href="#addUIView" data-transition="pop">Add UIView</a>表示当前想要连接的页面的转场效果的改变。标识是data-transition="pop",还有几个效果,可以试试。
<a href="/blog_article/page2.html" data-prefetch data-ajax="false">第 4 页</a>表示当前连接的页面不在同一个DOM中,因为同一个DOM中的页面都是ajax来控制的,所以不在同一个DOM中的转场需要关闭ajax的控制,标识是data-ajax="false"。
标识data-prefetch,表示当前要跳转的页面需要预加载,也就是在同一个DOM都加载完成后,浏览器会上后台去加载有这个表示的HTML页面,但是需要注意的是这种情况多的话,会加重浏览器内存的消耗,从而使程序变卡,直到崩溃,尤其是安卓的终端。
C.页面的UIView(listview slider button)
代码如下:
<div data-role="content" >
<!---------------加个滑动条 Add a slider--------------->
<!--
注意:这个滑动条是用html5新的input类型“range”写的,不需要 data-role属性。务必把他放到form标签内,并且与label 元素相关联。
-->
<form>
<label for="slider-0">Input slider:</label>
<input type="range" name="slider" id="slider-0" value="25" min="0" max="100" />
</form>
<!---------------加个按钮 Add Button--------------->
<form>
<a href="#" data-role="button" data-icon="info" data-iconpos="left" data-theme="a">Touch me theme A</a>
<a href="#" data-role="button" data-icon="info" data-iconpos="left" data-theme="b">Touch me theme B</a>
<a href="#" data-role="button" data-icon="info" data-iconpos="left" data-theme="c">Touch me theme C</a>
<a href="#" data-role="button" data-icon="info" data-iconpos="left" data-theme="d">Touch me theme D</a>
<a href="#" data-role="button" data-icon="info" data-iconpos="left" data-theme="e">Touch me theme E</a>
</form>
</div>
以上代码表示,我在一个页面体的内容中加入一个滑动条和按钮。
滑动条代码表示:在一个form表单中加入了一个label和一个rang类型的input,由于这个滑动条是用html5新的input类型“range”写的,不需要 data-role属性。务必把他放到form标签内,并且与label 元素相关联。
按钮代码表示:在一个form表单中加入一个a标签但是类型是JQM的button(data-role="button") 并且按钮上的图标显示为info的样式的(data-icon="info"还有许多样式可以自己选择) 并将这个按钮图片的位置放在按钮的最左端(data-iconpos="left")并且给按钮设置不同的样式(data-theme="a" 官网说一共有26个 因为就有26个字母,每个样式就是a-z)
<!---------------listview补充--------------->
<div data-role="content">
<ul data-role="listview" data-inset="true" data-filter="true">
<li><a href="#">Acura</a></li>
<li><a href="#">Audi</a></li>
<li><a href="#">BMW</a></li>
<li><a href="#">Cadillac</a></li>
<li><a href="#">Ferrari</a></li>
</ul>
</div>
以上代码表示:在一个listview的列表展现形式上,每一行有边框的效果(data-inset="true")并且要有一个查询的框(data-filter="true")
沈阳斌子 原创
1.概述
widget宿主端进程(比如Launcher) :AppWidgetService AppWidgetManager AppWidgetHostView AppWidgetHost
widget客户端进程:RmoteViews AppWidgetProviderInfo AppWidgetProvider(extends BroadcastReceiver)
2.1.AppWidgetService.java
这是widget framework的核心类,是系统service之一,它承担着所有widget的
管理工作。Widget安装,删除,更新等等都需要经过AppWidgetService.它是开机就启动的.在开机过程中,java层进程System Server启动后(这个进程管理着所有的系统service, 例如
activity manager service, windows manager service, power manager service等),会创建
AppWdigetService的实例,并调用它的SystemReady()方法,在这个方法里,它做了三件事:
1)遍历所有的安装包,找到符合条件ACTION=ACTION_APPWIDGET_UPDATE和<meta-data android:name="android.appwidget.provider"/>的intent receiver,解析相关信息,保存到本地数据成员中。
2)读取本地文件数据:/data/system/appwidgets.xml,所有已安装到桌面的widget的信息都保存在这个文件里。读出来,也保存到本地数据成员里。
3)注册了三个消息:ACTION_BOOT_COMPLETED(系统启动到桌面就会发送此消息),ACTION_PACKAGE_ADDED(有新APK包安装到系统),ACTION_PACKAGE_REMOVED(有APK包被删除)。当系统启动到桌面后,AppWidgetService接收到了ACTION_BOOT_COMPLETED消息,它会去检查本地数据成员,如果有已经安装到桌面的widget,它会上发ACTION_APPWIDGET_ENABLED和ACTION_APPWIDGET_UPDATE消息。如果有widget设置了updatePeriodMillis的属性,它就会开始计时(这个是通过AlarmManager来实现的),到时间时,就会再次上发ACTION_APPWIDGET_UPDATE消息。
是AppWidgetService的客户端代理,是标准的AIDL通讯。IAppWidgetService.java
2.3.RemoteViews并不是一个真正的View,它没有实现View的接口,而只是一个用于描述View的实体。比如:创建View需要的资源ID和各个控件的事件响应方法。RemoteViews会通过进程间通信机制传递给AppWidgetHost。
2.4.AppWidgetHostView是真正的View,但它只是一个容器,用来容纳实际的AppWidget的View。这个AppWidget的View是根据RemoteViews的描述来创建。这是在updateAppWidget里做的:
remoteViews.apply创建了实际的View
是真正容纳AppWidget的地方,它的主要功能有两个:
o 监听来自AppWidgetService的事件:
o 另外一个功能就是创建AppWidgetHostView。
3.在自己的程序中添加appWidget如何创建一个AppWidget网上有大量的资料和代码,我这里就不赘述了。
下面来看看如何在自己的程序中添加appWidget(仿Launcher)
一共有三个源文件
- LauncherAppWidgetHostView扩展了AppWidgetHostView,实现了对长按事件的处理。
public class LauncherAppWidgetHostView extends AppWidgetHostView { private LayoutInflater mInflater; private Context mContext; private int mPreviousOrientation; public LauncherAppWidgetHostView(Context context) { super(context); mContext = context; // mLongPressHelper = new CheckLongPressHelper(this); mInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); } // @Override // protected View getErrorView() { // return mInflater.inflate(R.layout.appwidget_error, this, false); // } @Override public void updateAppWidget(RemoteViews remoteViews) { mPreviousOrientation = mContext.getResources().getConfiguration().orientation; super.updateAppWidget(remoteViews); } public boolean orientationChangedSincedInflation() { int orientation = mContext.getResources().getConfiguration().orientation; if (mPreviousOrientation != orientation) { return true; } return false; } public boolean onInterceptTouchEvent(MotionEvent ev) { // return true :Consume any touch events for ourselves after longpress is triggered // Otherwise continue letting touch events fall through to children return false; } }
- LauncherAppWidgetHost扩展了AppWidgetHost,这里只是重载了onCreateView,创建LauncherAppWidgetHostView的实例。
public class LauncherAppWidgetHost extends AppWidgetHost { public LauncherAppWidgetHost(Context context, int hostId) { super(context, hostId); } @Override protected AppWidgetHostView onCreateView(Context context, int appWidgetId, AppWidgetProviderInfo appWidget) { return new LauncherAppWidgetHostView(context); } @Override public void stopListening() { super.stopListening(); clearViews(); } }
- HelloAcitvity.java
public class HelloActivity extends Activity { private ArrayList<AppWidgetProviderInfo> mWidgets = new ArrayList<AppWidgetProviderInfo>(); private LauncherAppWidgetHost mAppWidgetHost; private PackageManager mPackageManager; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // Get the list of widgets updatePackages(); mPackageManager = this.getPackageManager(); mAppWidgetHost = new LauncherAppWidgetHost(this, 1001); //startListening AppWidgetChanged mAppWidgetHost.startListening(); int appWidgetId = mAppWidgetHost.allocateAppWidgetId(); final AppWidgetProviderInfo widgetInfo = mWidgets.get(4); //获取RemoteView描述的对应的View LauncherAppWidgetHostView hostView = (LauncherAppWidgetHostView) mAppWidgetHost.createView( this, appWidgetId, widgetInfo); final LinearLayout layout2 = new LinearLayout(this); layout2.setOrientation(LinearLayout.VERTICAL); layout2.addView(hostView); setContentView(layout2); } // 取自 AppsCustomizePagedView public void updatePackages() { mWidgets.clear(); List<AppWidgetProviderInfo> widgets = AppWidgetManager.getInstance(this).getInstalledProviders(); // Intent shortcutsIntent = new Intent(Intent.ACTION_CREATE_SHORTCUT); // List<ResolveInfo> shortcuts = // mPackageManager.queryIntentActivities(shortcutsIntent, 0); for (AppWidgetProviderInfo widget : widgets) { if (widget.minWidth > 0 && widget.minHeight > 0) { Log.d("yzy", widget.label); mWidgets.add(widget); } } // mWidgets.addAll(shortcuts); } }