- 浏览: 406166 次
- 性别:
- 来自: 福州
最新评论
-
野牛精:
感谢楼主分享,帮大忙了。
android ftp 客户端编写(ftp4j) -
happytianqiu:
你好,我最近也在搞这个,能发个demo吗,邮箱是:624951 ...
开发android机顶盒应用 事件,焦点处理 -
zhunanfengfeimeng:
http://www.iteye.comhttp://www. ...
android ftp 客户端编写(ftp4j) -
icyttea:
好棒!感谢楼主分享
vlc for android录制视频与截图 -
clwwlc:
有demo吗
开发android机顶盒应用 事件,焦点处理
遇见中使用百度地图可以在地图上显示头像功能,然后点击头像又会弹出气泡。
现在就来说一说这种效果的一种实现方式。 虽然我不知道他们如何处理的,但经过试验,效果差不多了。
使用的也是百度地图。
下载BaiduMapApi_Sample_Android_1.3.3.zip,目前官方最新版本。
直接使用里面的示例程序,ItemizedOverlayDemo就有气泡的效果,但里面的pop.png不是一个nine9patch文件,不能缩放。需要修改。
附件里面传一个可以缩放的图片。ps功底不好,图不是很好看。
现在就来说一说这种效果的一种实现方式。 虽然我不知道他们如何处理的,但经过试验,效果差不多了。
使用的也是百度地图。
下载BaiduMapApi_Sample_Android_1.3.3.zip,目前官方最新版本。
直接使用里面的示例程序,ItemizedOverlayDemo就有气泡的效果,但里面的pop.png不是一个nine9patch文件,不能缩放。需要修改。
附件里面传一个可以缩放的图片。ps功底不好,图不是很好看。
新建一个Activity:TItemizedOverlay extends MapActivity,可以直接把示例中的复制过来。 修改里面的oncreate:overitem=new OverItemT(marker, this, 3); //mMapView.getOverlays().add(overitem); //添加ItemizedOverlay实例到mMapView 不需要的是OverItemT。这是作为地图上的遮罩。 另外加入 Drawable markerDrawable=drawBitmap("test1"); mMapView.getOverlays().add(new MyOverItem(markerDrawable,TItemizedOverlay.this,new GeoPoint((int) (39.90923*1e6), (int) (116.397428*1e6)))); markerDrawable=drawBitmap("test2"); mMapView.getOverlays().add(new MyOverItem(markerDrawable,TItemizedOverlay.this,new GeoPoint((int) (39.90923*1e6), (int) (116.357428*1e6)))); markerDrawable=drawBitmap("test3"); mMapView.getOverlays().add(new MyOverItem(markerDrawable,TItemizedOverlay.this,new GeoPoint((int) (39.90923*1e6), (int) (116.437428*1e6)))); 三个点覆盖层。 因为ItemizedOverlay的构造方法中,只能用Drawable,所以我们要做的是,生成一个Drawable,然后传入。现在先处理同步的,就是数据已经存在的了。后面再说异步下载图片,如何将新下载的图片做成Drawable,然后再放到地图上。 Drawable drawBitmap(String title){ Bitmap bmp = Bitmap.createBitmap(100, 100, Bitmap.Config.ARGB_8888); Canvas canvas = new Canvas(bmp); LayoutInflater inflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE); View layout = inflater.inflate(R.layout.marker_view, null); TextView titleView=(TextView) layout.findViewById(R.id.title); titleView.setText(title); layout.setDrawingCacheEnabled(true); layout.measure(View.MeasureSpec.makeMeasureSpec(canvas.getWidth(), View.MeasureSpec.EXACTLY), View.MeasureSpec.makeMeasureSpec(canvas.getHeight(), View.MeasureSpec.EXACTLY)); layout.layout(0, 0, layout.getMeasuredWidth(), layout.getMeasuredHeight()); Paint paint = new Paint(); canvas.drawBitmap(layout.getDrawingCache(), 0, 0, paint); Drawable drawable = new BitmapDrawable(bmp); return drawable; } 这里通过布局文件引入,将需要的画成一个图。只是简单的处理画出来和图片大小是100*100的,动态的决定布局占用的大小更复杂一些。 因为遇见的效果就是一张图片。所以使用布局方面就可以简单的放一张图片,然后下面再有一张背景就可以了。 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="wrap_content" android:layout_height="wrap_content" android:background="@drawable/pop_bg"> <TextView android:id="@+id/title" android:maxWidth="120dp" android:text="testaa" android:textSize="20sp" android:textColor="@android:color/black" android:padding="4dp" android:layout_width="wrap_content" android:layout_height="wrap_content"/> </LinearLayout> 这里使用的文字,如果文字太多,而没有处理实际需要的大小就不好看了。 然后一个Overlay class MyOverItem extends ItemizedOverlay<OverlayItem> { private Drawable marker; private Context mContext; GeoPoint mPoint; OverlayItem mItem; public MyOverItem(Drawable marker, Context context, GeoPoint point) { //super(boundCenterBottom(marker)); super((marker));这里不要对齐,因为对齐后弹出的气泡会发生覆盖 this.marker=marker; this.mContext=context; mPoint=point; mItem=new OverlayItem(point, "", ""); populate(); //createItem(int)方法构造item。一旦有了数据,在调用其它方法前,首先调用这个方法 } @Override public void draw(Canvas canvas, MapView mapView, boolean shadow) { super.draw(canvas, mapView, shadow); //调整一个drawable边界,使得(0,0)是这个drawable底部最后一行中心的一个像素 //boundCenterBottom(marker);同样不能对齐 } @Override protected OverlayItem createItem(int i) { return mItem; } @Override public int size() { return 1; } // 处理当点击事件 @Override protected boolean onTap(int i) {//点击后就会弹出另一个气泡了。 setFocus(mItem); // 更新气泡位置,并使之显示 TextView title=(TextView) mPopView.findViewById(R.id.title); title.setText("lat:"+mPoint.getLatitudeE6()+" long:"+mPoint.getLongitudeE6()); mMapView.updateViewLayout(mPopView, new MapView.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT, mPoint, MapView.LayoutParams.BOTTOM_CENTER)); mPopView.setVisibility(View.VISIBLE); /*Toast.makeText(this.mContext, mItem.getSnippet(), Toast.LENGTH_SHORT).show();*/ return true; } @Override public boolean onTap(GeoPoint arg0, MapView arg1) { // 消去弹出的气泡 mPopView.setVisibility(View.GONE); return super.onTap(arg0, arg1); } } mPopView=super.getLayoutInflater().inflate(R.layout.popview, null);布局: <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:padding="2.0dip" android:background="@drawable/map_mark_bg" android:gravity="center_horizontal" android:layout_width="54dp" android:layout_height="81dp"> 这个高与宽需要指定,具体值与背景图片有关。就要是背景图片下面的三角形要显示出来。 <ImageView android:id="@+id/top_icon" android:src="@drawable/ic_launcher" android:layout_width="50dp" android:layout_height="50dp"/> </LinearLayout> 最后的效果图就是: [img]http://dl.iteye.com/upload/attachment/0071/5306/483e5585-88b2-354c-8780-56bedac54101.png[/img] 修改后的效果图: [img]http://dl.iteye.com/upload/attachment/0071/5573/ee5fc596-1850-326b-96b2-3df67fb9a78f.png[/img] 除 了上面的之外,其实在地图上加一些点,不直接使用它的Overlay也是可以的,对每个点加一个点击事件,每个点放的位置坐标需要知道。由于放的是drawable不是layout,所以自定义方面复杂一点。 对于异步的处理;提供示例代码: 源码不是个人的,不能给的,认包涵。 提供思路: oncreate()里面添加一个setMarker();方法 这个方法主要是执行数据的获取: private void setMarker() { new Thread(new Runnable() { @Override public void run() { AssetManager assetManager=getAssets(); try { InputStream inputStream=assetManager.open("store.json"); String js=HttpUtils.parseInputStream(inputStream); ArrayList<StoreBean> storeBeans=JsonParser.parseStoreBeans(js); updateOverlay(storeBeans); 在这里可以获取网络资源,也可以获取固定的资源,我不下载了,直接获取assets里面的 } catch (IOException e) { e.printStackTrace(); } catch (T8Exception e) { e.printStackTrace(); } finally { //assetManager.close(); } } }).start(); } private void updateOverlay(ArrayList<StoreBean> storeBeans) { if(null==storeBeans||storeBeans.size()<1){ Log.d("","没有取得商店数据。"); return; } StoreBean first=storeBeans.get(0); Message message=Message.obtain(); message.what=FIRST;//这里定义一个位置的中心,如果你在进入地图时已经有了中心点这就不需要了。 message.obj=first; mHandler.sendMessage(message); MyOverItem item; ArrayList<MyOverItem> overItems=new ArrayList<MyOverItem>(); for (StoreBean bean : storeBeans) { item=new MyOverItem(mMarkerDrawable, StoreMap.this, new GeoPoint((int) (bean.lat), (int) (bean.llong)), bean); myOverItemHashMap.put(bean.url, item); overItems.add(item); } if (overItems.size()>0) { message=Message.obtain(); message.obj=overItems; message.what=ALL; mHandler.sendMessage(message); Log.d("", "现在处理图片下载。");下面是模拟的, try { Thread.sleep(4000l); } catch (InterruptedException e) { e.printStackTrace(); } downloadAndUpdateOverlay(storeBeans); } } 主要的过程是:先获取地图上的点,如果没有坐标点,就没有标记了。这个数据来源可以在进入地图后获取,也可以在进入前intent带进来的。 2.获取地图的点后立即更新地图,并画上默认的图片。 3.异步线程获取地图点对应的图片或其它数据。 4.更新异步线程获取的地图点对应的数据,就可以展现出气泡了。 这里采用了单线程来处理多个图片资源的下载,如果网络慢的话,可能图片的展示也慢,可以使用线程池来处理。 private void downloadAndUpdateOverlay(ArrayList<StoreBean> storeBeans) { for (StoreBean bean : storeBeans) { try { if (!loadImg) { break; } Log.d("", "bean:"+bean); String url=bean.url; Bitmap img=App.getmImageLoader(StoreMap.this).getLargeBitmap(url, App.mCacheDir); Drawable markerDrawable; MyOverItem myOverItem; Message message; if (null!=img) { markerDrawable=drawBitmapLayout(img); myOverItem=new MyOverItem(markerDrawable, StoreMap.this, new GeoPoint((int) (bean.lat), (int) (bean.llong)), bean); message=Message.obtain(); message.what=OTHER;//表示非定位的点,如果在进入地图已经获取了中心点,这里就直接处理为普通的坐标点就可以了。 message.obj=myOverItem; mHandler.sendMessage(message); } myOverItemHashMap.remove(bean.url);移除已经下载的坐标点。 } catch (Exception e) { e.printStackTrace(); } } } Handler mHandler=new Handler() { @Override public void handleMessage(Message msg) { super.handleMessage(msg); int what=msg.what; switch (what) { case FIRST: try { StoreBean bean=(StoreBean) msg.obj; mMapView.getController().setCenter(new GeoPoint((int) bean.lat, (int) bean.llong)); } catch (Exception e) { e.printStackTrace(); } break; case OTHER: { MyOverItem myOverItem=(MyOverItem) msg.obj; mMapView.getOverlays().add(myOverItem); mMapView.postInvalidate(); break; } case ALL: ArrayList<MyOverItem> myOverItems=(ArrayList<MyOverItem>) msg.obj; mMapView.getOverlays().addAll(myOverItems); mMapView.postInvalidate(); break; case UPDATE: { MyOverItem myOverItem=(MyOverItem) msg.obj; List<Overlay> overlays=mMapView.getOverlays(); MyOverItem item; Overlay overlay; for (int i=0; i<overlays.size(); i++) { overlay=overlays.get(i); if (overlay instanceof MyOverItem) { item=(MyOverItem) overlay; if (item.mBean.id==myOverItem.mBean.id) { Log.d("", "更新的覆盖物是:"+myOverItem); overlays.remove(i); mMapView.getOverlays().add(myOverItem); mMapView.postInvalidate(); break; } } } break; } } } };
发表评论
-
android 批量打渠道包
2014-09-16 17:27 5820打包,是一个经常会遇到的问题,写个脚本就可以解决了.不同的脚本 ... -
vlc for android录制视频与截图
2014-09-08 18:31 7977首先说明,这不算原 ... -
android百度地图转为高德地图
2014-08-11 11:09 2910使用百度地图也不少时间了,但是一直出现无法解决的问题,在官 ... -
编译 i9000的cm系统
2014-08-04 13:10 1540[color=red][b]此文 并不 ... -
mp4v2 保存h264流
2014-05-01 21:15 11767大侠已经完成了很多操作了,唯一不足的是,工程完整性差一些,而且 ... -
baidumap的缩放到看到所有点
2014-04-09 21:03 1401之前使用1.3.5版本的sdk,通过调用mapviewcont ... -
ViewPager 查看图片
2014-02-13 12:59 4474一个图片查看器 , app到处都是 , 但那是别人的. 现在的 ... -
机顶盒 页面 选中后的 动画
2013-12-05 09:39 2133前面已经说过了,对于机顶盒的焦点的处理. 相信有不少人看 ... -
引爆你的图片浏览, ListView 大图片
2013-11-05 07:58 1265之前发现,ListView里面的图片资源越占越大,特别是当 ... -
微博开放源码
2013-10-23 12:09 987微博程序已经发布不少时间了,但一直也没有很多用户使用,主要在用 ... -
Mupdf 缩小apk包,减少字体
2013-10-20 15:53 3666在以前的apv中,字体占了很大的一部分,如果去除cjk字体 ... -
ActionBar appcompat 解决碎片化问题
2013-09-15 16:58 2122actionbarsherlock 这个在api11以下的系统 ... -
android机顶盒获取有线mac
2013-09-02 16:09 5440直接上代码: public static String ... -
android竖着的seekbar
2013-08-22 20:33 5432以前网上有位虾士发过一篇文章是关于竖着的seekbar,但是也 ... -
新浪微博oauth2.0 自动认证
2013-08-13 09:01 0oauth2.0作者认为它不先进,都放弃了.但是oauth2. ... -
android 颜表情.
2013-07-20 21:16 1781在使用TagsViewGroup 流布局后,我替换了原来的Gr ... -
flow 流布局.
2013-07-13 20:06 1260在git上看到一个FlowingViewGroup,代码有点旧 ... -
开发android机顶盒应用 事件,焦点处理
2013-07-13 19:58 19758机顶盒应用不同于手机 ... -
android 磁盘缓存.
2013-07-13 19:30 5236开发一个app,特别是图片的app,免不了要存储图片,内存缓存 ... -
TextView 文字淡入效果
2013-04-15 13:34 3454一个文本渐渐地从左到右的显示。 几步就可以了实现了。利用的是V ...
相关推荐
mars老师写的重写overlay类在google地图上添加标记的程序,代码清楚易懂
DICOM图像,overlay层,包含只有一层overlay,两侧overlay,overlay加原始图像三种DICOM图像。 不少DICOM开源框架对这种图像支持不够,显示有问题。便于测试系统对带有overlay图像的显示是否正确
Overlay附加数据处理,版权属于原作者,如有侵权请联系我网站及时删除
Android 高德地图自定义点聚合marker图片及Overlay点击选中功能的代码实现及布局文件
Merge Overlay v1.2 汉化版(数据叠加捆绑)
关于FPGA overlay的解释,很有参考价值,对于项目实践很有作用。。。。
主机overlay和网络overlay介绍 .pptx
基于SDN和Overlay的云计算数据中心网络.pdf
Overlay组播Overlay组播Overlay组播Overlay组播Overlay组播Overlay组播Overlay组播Overlay组播
是一个有关shell中如何使用overlayicon接口的代码
本代码实现了高德地图的覆盖方法,和照相机照相的功能实现,实现了从MapActivity和Activity之间的跳转功能
sso 单点登录cas使用(2): cas 4.2.7 maven cas-overlay服务端数据库配置
演示 新版baidu 地图 定位 overlay添加 坐标转换 可运行的DEMO
就内存的使用情况而言,Overlay技术与动态链接库是非常类似的。本文以TM320C6000系列DSP为目标平台,通过一个具体实例给出开发DSP覆盖(Overlay)程序设计技术的方法和实现步骤,详细地讨论了Overlay程序设计技术各个环节...
数据中心 OverLay SDN解决方案相关技术解析
docker清理大杀器/docker的overlay、overlay2文件占用磁盘太大的解决办法
SPM多重overlay方法,神经成像方面的人做为参考!SPM多重overlay方法,神经成像方面的人做为参考!
1.网络虚拟化技术介绍 2.Overlay基本概览和分类 3.VXLAN基础基础