安卓开发_慕课网_百度地图_添加覆盖物

简介: 学习内容来自“慕课网” 本片学习内容接自前四篇基础 安卓开发_慕课网_百度地图 安卓开发_慕课网_百度地图_实现定位 安卓开发_慕课网_百度地图_实现方向传感器 安卓开发_慕课网_百度地图_实现模式转换 请先学习前4篇再学习本篇,因为本篇在前四篇的基础上进行代码的编写   一、新建一个类用来存放数据(距离,点赞数,介绍图等信息) 1 package com.

学习内容来自“慕课网”

本片学习内容接自前四篇基础

安卓开发_慕课网_百度地图

安卓开发_慕课网_百度地图_实现定位

安卓开发_慕课网_百度地图_实现方向传感器

安卓开发_慕课网_百度地图_实现模式转换

请先学习前4篇再学习本篇,因为本篇在前四篇的基础上进行代码的编写

 

一、新建一个类用来存放数据(距离,点赞数,介绍图等信息)

  1 package com.example.map;
  2 
  3 import java.io.Serializable;
  4 import java.util.ArrayList;
  5 import java.util.List;
  6 
  7 public class Info implements Serializable
  8 {
  9     private static final long serialVersionUID = -1010711775392052966L;
 10     //经纬度
 11     private double latitude;
 12     private double longitude;
 13     //图片id
 14     private int imgId;
 15     //商家的名称
 16     private String name;
 17     //距离
 18     private String distance;
 19     //点赞的数量
 20     private int zan;
 21 
 22     public static List<Info> infos = new ArrayList<Info>();
 23     //这里的数据都是死的,实际开发中数据都是从服务器中获取的,这里只演示如何添加覆盖物这个效果
 24     static
 25     {
 26         infos.add(new Info(34.242652, 108.971171, R.drawable.a01, "英伦贵族小旅馆",
 27                 "距离209米", 1456));
 28         infos.add(new Info(34.242952, 108.972171, R.drawable.a02, "沙井国际洗浴会所",
 29                 "距离897米", 456));
 30         infos.add(new Info(34.242852, 108.973171, R.drawable.a03, "五环服装城",
 31                 "距离249米", 1456));
 32         infos.add(new Info(34.242152, 108.971971, R.drawable.a04, "老米家泡馍小炒",
 33                 "距离679米", 1456));
 34     }
 35     //构造方法
 36     public Info(double latitude, double longitude, int imgId, String name,
 37             String distance, int zan)
 38     {
 39         this.latitude = latitude;
 40         this.longitude = longitude;
 41         this.imgId = imgId;
 42         this.name = name;
 43         this.distance = distance;
 44         this.zan = zan;
 45     }
 46 
 47     public double getLatitude()
 48     {
 49         return latitude;
 50     }
 51 
 52     public void setLatitude(double latitude)
 53     {
 54         this.latitude = latitude;
 55     }
 56 
 57     public double getLongitude()
 58     {
 59         return longitude;
 60     }
 61 
 62     public void setLongitude(double longitude)
 63     {
 64         this.longitude = longitude;
 65     }
 66 
 67     public int getImgId()
 68     {
 69         return imgId;
 70     }
 71 
 72     public void setImgId(int imgId)
 73     {
 74         this.imgId = imgId;
 75     }
 76 
 77     public String getName()
 78     {
 79         return name;
 80     }
 81 
 82     public void setName(String name)
 83     {
 84         this.name = name;
 85     }
 86 
 87     public String getDistance()
 88     {
 89         return distance;
 90     }
 91 
 92     public void setDistance(String distance)
 93     {
 94         this.distance = distance;
 95     }
 96 
 97     public int getZan()
 98     {
 99         return zan;
100     }
101 
102     public void setZan(int zan)
103     {
104         this.zan = zan;
105     }
106 
107 }

二、添加覆盖物

首先在菜单中增加"添加覆盖物"菜单项

res-menu-main.xml

红色字体部分为新添加的代码部分

 1 <menu xmlns:android="http://schemas.android.com/apk/res/android" >
 2 
 3     <item
 4         android:id="@+id/id_map_common"
 5         
 6         android:showAsAction="never"
 7         android:title="普通地图"/>
 8     <item
 9         android:id="@+id/id_map_site"
10         
11         android:showAsAction="never"
12         android:title="卫星地图"/>
13     <item
14         android:id="@+id/id_map_traffic"
15         
16         android:showAsAction="never"
17         android:title="实时交通(off)"/>
18     <item
19         android:id="@+id/id_map_location"
20         
21         android:showAsAction="never"
22         android:title="定位我的位置"/>
23     <item
24         android:id="@+id/id_mode_common"
25         
26         android:showAsAction="never"
27         android:title="普通模式"/>
28     <item
29         android:id="@+id/id_mode_following"
30         
31         android:showAsAction="never"
32         android:title="跟随模式"/>
33     <item
34         android:id="@+id/id_mode_compass"
35         
36         android:showAsAction="never"
37         android:title="罗盘模式"/>
38     <item
39         android:id="@+id/id_add_overlay"
40         
41         android:showAsAction="never"
42         android:title="添加覆盖物"/>
43 
44 </menu>

给菜单项添加响应事件

 1 //菜单按钮的响应事件
 2     @Override
 3     public boolean onOptionsItemSelected(MenuItem item) {
 4         // TODO Auto-generated method stub
 5         switch (item.getItemId()) {
 6         case R.id.id_map_common:
 7             mBaiduMap.setMapType(BaiduMap.MAP_TYPE_NORMAL);
 8             break;
 9         case R.id.id_map_site:
10             mBaiduMap.setMapType(BaiduMap.MAP_TYPE_SATELLITE);
11             break;
12         case R.id.id_map_traffic:
13             if(mBaiduMap.isTrafficEnabled())
14             {
15                 mBaiduMap.setTrafficEnabled(false);
16                 item.setTitle("实时交通(off)");
17             }
18             else
19             {
20                 mBaiduMap.setTrafficEnabled(true);
21                 item.setTitle("实时交通(on)");
22             }
23             break;
24         case R.id.id_map_location:
25             //定位最新自己的位置
26             centerToMyLocation();
27             break;
28 
29         case R.id.id_mode_common:
30             //设置普通模式
31             mLocationMode = LocationMode.NORMAL;
32             break;
33         case R.id.id_mode_following:
34             //设置跟随模式
35             mLocationMode = LocationMode.FOLLOWING;
36             break;
37         case R.id.id_mode_compass:
38             //设置罗盘模式
39             mLocationMode = LocationMode.COMPASS;
40             break;
41         case R.id.id_add_overlay:
42             //设置添加覆盖物
43             addOverlays(Info.infos);
44             break;
45         default:
46             break;
47         }
48         return super.onOptionsItemSelected(item);
49     }

 

这是添加覆盖物的方法 ,

 1 private void addOverlays(List<Info> infos) {
 2         // TODO Auto-generated method stub
 3         //添加覆盖物
 4         //清楚定位的一些图层
 5         mBaiduMap.clear();
 6         // 经纬度
 7         LatLng latLng = null;
 8         Marker marker = null;
 9         OverlayOptions options;
10         for (Info info : infos)
11         {
12             // 经纬度
13             latLng = new LatLng(info.getLatitude(), info.getLongitude());
14             // 图标
15             options = new MarkerOptions().position(latLng).icon(mMarker).zIndex(5);//5表示图层的位置,越大越在上面
16             marker = (Marker) mBaiduMap.addOverlay(options);
17             Bundle arg0 = new Bundle();
18             arg0.putSerializable("info", info);
19             marker.setExtraInfo(arg0);
20         }
21         //定位好之后,讲地图定位到最后一个图标的位置
22         MapStatusUpdate msu = MapStatusUpdateFactory.newLatLng(latLng);
23         mBaiduMap.setMapStatus(msu);
24         
25     }

效果图:

可以看到,地图上显示了4个覆盖物的坐标,但是这些坐标无法点击

。下面学习实现点击坐标显示相应的信息效果

二、实现覆盖物信息效果

实现建立显示信息的信息框的布局文件

 1 <RelativeLayout
 2         android:id="@+id/id_maker_ly"
 3         android:layout_width="match_parent"
 4         android:layout_height="220dp"
 5         android:layout_alignParentBottom="true"
 6         android:background="#cc4e5a6b"
 7         android:clickable="true"
 8         android:visibility="gone" >
 9 
10         <ImageView
11             android:id="@+id/id_info_img"
12             android:layout_width="fill_parent"
13             android:layout_height="150dp"
14             android:layout_marginBottom="10dp"
15             android:layout_marginLeft="12dp"
16             android:layout_marginRight="12dp"
17             android:layout_marginTop="10dp"
18             android:background="@drawable/img_border"
19             android:scaleType="fitXY"
20             android:src="@drawable/a01" >
21         </ImageView>
22 
23         <RelativeLayout
24             android:layout_width="fill_parent"
25             android:layout_height="50dp"
26             android:layout_alignParentBottom="true"
27             android:background="@drawable/bg_map_bottom" >
28 
29             <LinearLayout
30                 android:layout_width="wrap_content"
31                 android:layout_height="wrap_content"
32                 android:layout_centerVertical="true"
33                 android:layout_marginLeft="20dp"
34                 android:orientation="vertical" >
35 
36                 <TextView
37                     android:id="@+id/id_info_name"
38                     android:layout_width="wrap_content"
39                     android:layout_height="wrap_content"
40                     android:text="老米家泡馍"
41                     android:textColor="#fff5eb" />
42 
43                 <TextView
44                     android:id="@+id/id_info_distance"
45                     android:layout_width="wrap_content"
46                     android:layout_height="wrap_content"
47                     android:text="距离200米"
48                     android:textColor="#fff5eb" />
49             </LinearLayout>
50 
51             <LinearLayout
52                 android:layout_width="wrap_content"
53                 android:layout_height="wrap_content"
54                 android:layout_alignParentRight="true"
55                 android:layout_centerVertical="true"
56                 android:layout_marginRight="20dp"
57                 android:orientation="horizontal" >
58 
59                 <ImageView
60                     android:layout_width="wrap_content"
61                     android:layout_height="wrap_content"
62                     android:background="@drawable/map_zan"
63                     android:clickable="true" />
64 
65                 <TextView
66                     android:id="@+id/id_info_zan"
67                     android:layout_width="wrap_content"
68                     android:layout_height="wrap_content"
69                     android:layout_gravity="center"
70                     android:text="789"
71                     android:textColor="#fff5eb" />
72             </LinearLayout>
73         </RelativeLayout>
74     </RelativeLayout>

 

 

注意第18行代码

这里还需要建一个.xml文件

在res目录下新建文件夹drawable 在此文件夹下新建img_border.xml

res-drawable-img_border.xml

 1 <?xml version="1.0" encoding="utf-8"?>
 2 <shape xmlns:android="http://schemas.android.com/apk/res/android" >
 3 
 4     <stroke
 5         android:width="2dp"
 6         android:color="#AAFFFFFF" />
 7 
 8     <padding
 9         android:bottom="2dp"
10         android:left="2dp"
11         android:right="2dp"
12         android:top="2dp" >
13     </padding>
14 </shape>

 

信息框布局文件就由这两个.xml文件构成了

MainActivity.java

  1 package com.example.map;
  2 
  3 import java.util.List;
  4 
  5 import com.baidu.location.BDLocation;
  6 import com.baidu.location.BDLocationListener;
  7 import com.baidu.location.LocationClient;
  8 import com.baidu.location.LocationClientOption;
  9 import com.baidu.mapapi.SDKInitializer;
 10 import com.baidu.mapapi.map.BaiduMap;
 11 import com.baidu.mapapi.map.BaiduMap.OnMapClickListener;
 12 import com.baidu.mapapi.map.BaiduMap.OnMarkerClickListener;
 13 import com.baidu.mapapi.map.BitmapDescriptor;
 14 import com.baidu.mapapi.map.BitmapDescriptorFactory;
 15 import com.baidu.mapapi.map.InfoWindow;
 16 import com.baidu.mapapi.map.MapPoi;
 17 import com.baidu.mapapi.map.MapStatusUpdate;
 18 import com.baidu.mapapi.map.MapStatusUpdateFactory;
 19 import com.baidu.mapapi.map.MapView;
 20 import com.baidu.mapapi.map.Marker;
 21 import com.baidu.mapapi.map.MarkerOptions;
 22 import com.baidu.mapapi.map.MyLocationConfiguration;
 23 import com.baidu.mapapi.map.MyLocationConfiguration.LocationMode;
 24 import com.baidu.mapapi.map.MyLocationData;
 25 import com.baidu.mapapi.map.OverlayOptions;
 26 import com.baidu.mapapi.model.LatLng;
 27 import com.example.map.MyOrientationListener.OnOrientationListener;
 28 import com.example.map.R;
 29 
 30 import android.location.Location;
 31 import android.os.Bundle;
 32 import android.app.Activity;
 33 import android.content.Context;
 34 import android.graphics.Bitmap;
 35 import android.graphics.Color;
 36 import android.graphics.Point;
 37 import android.view.Menu;
 38 import android.view.MenuItem;
 39 import android.view.View;
 40 import android.view.Window;
 41 import android.widget.ImageView;
 42 import android.widget.RelativeLayout;
 43 import android.widget.TextView;
 44 import android.widget.Toast;
 45 
 46 public class MainActivity extends Activity {
 47     
 48     private MapView mMapView = null;
 49     private BaiduMap mBaiduMap;
 50     //简化代码            用于this.context=this;
 51     private Context context;
 52     //定位相关
 53     private LocationClient mLocationClient;
 54     private MyLocationListener mLocationListener;
 55     //是否第一次定位的标志
 56     private boolean isFirstIn = true;
 57     //定位经纬度
 58     private double mLatitude;
 59     private double mLongtitude;
 60     //自定义定位图标
 61     private BitmapDescriptor mIconLocation;
 62     private LocationMode mLocationMode;
 63     private MyOrientationListener myOrientationListener;
 64     private float mCurrentX;
 65     //添加覆盖物
 66     private BitmapDescriptor mMarker;
 67     //信息框的布局
 68     private RelativeLayout mMarkerLy;
 69     
 70     
 71     
 72     @Override
 73     protected void onCreate(Bundle savedInstanceState) {
 74         super.onCreate(savedInstanceState);
 75       //在使用SDK各组件之前初始化context信息,传入ApplicationContext  
 76         //注意该方法要再setContentView方法之前实现  
 77         SDKInitializer.initialize(getApplicationContext());  
 78         
 79         requestWindowFeature(Window.FEATURE_NO_TITLE);
 80         setContentView(R.layout.activity_main);
 81         this.context = this;
 82         initView();
 83         //初始化定位
 84         initLocation();
 85         //初始化覆盖物相关
 86         initMarker();
 87         mBaiduMap.setOnMarkerClickListener(new OnMarkerClickListener()
 88         {
 89             @Override
 90             public boolean onMarkerClick(Marker marker)
 91             {
 92                 Bundle extraInfo = marker.getExtraInfo();
 93                 Info info = (Info) extraInfo.getSerializable("info");
 94                 
 95                 ImageView iv = (ImageView) mMarkerLy.findViewById(R.id.id_info_img);
 96                 TextView distance = (TextView) mMarkerLy.findViewById(R.id.id_info_distance);
 97                 TextView name = (TextView) mMarkerLy.findViewById(R.id.id_info_name);
 98                 TextView zan = (TextView) mMarkerLy.findViewById(R.id.id_info_zan);
 99                 
100                 iv.setImageResource(info.getImgId());
101                 distance.setText(info.getDistance());
102                 name.setText(info.getName());
103                 zan.setText(info.getZan() + "");
104 
105                 mMarkerLy.setVisibility(View.VISIBLE);
106                 return true;
107             }
108         });
109         mBaiduMap.setOnMapClickListener(new OnMapClickListener()
110         {
111 
112             @Override
113             public boolean onMapPoiClick(MapPoi arg0)
114             {
115                 return false;
116             }
117 
118             @Override
119             public void onMapClick(LatLng arg0)
120             {
121                 mMarkerLy.setVisibility(View.GONE);
122                 mBaiduMap.hideInfoWindow();
123             }
124         });
125     }
126     
127     private void initMarker() {
128         // TODO Auto-generated method stub
129         //标记图标
130         mMarker = BitmapDescriptorFactory.fromResource(R.drawable.maker);
131         mMarkerLy = (RelativeLayout) findViewById(R.id.id_maker_ly);
132     }
133 
134     private void initView() {
135         // TODO Auto-generated method stub
136         mMapView = (MapView) findViewById(R.id.id_bmapView);
137         mBaiduMap = mMapView.getMap();
138         //设置打开时的显示比列  这里显示500m左右
139         MapStatusUpdate msu = MapStatusUpdateFactory.zoomTo(15.0f); 
140         mBaiduMap.setMapStatus(msu);
141         }
142     private void initLocation() {
143         // TODO Auto-generated method stub
144         mLocationClient = new LocationClient(this);
145         mLocationListener = new MyLocationListener();
146         mLocationClient.registerLocationListener(mLocationListener);
147         //默认模式为普通型
148         mLocationMode = LocationMode.NORMAL;
149         LocationClientOption option = new LocationClientOption();
150         option.setCoorType("bd09ll");
151         option.setIsNeedAddress(true);
152         option.setOpenGps(true);
153         option.setScanSpan(1000);
154         
155         mLocationClient.setLocOption(option);
156         
157         // 初始化图标
158         mIconLocation = BitmapDescriptorFactory.fromResource(R.drawable.navi_map_gps_locked);
159         myOrientationListener = new MyOrientationListener(context);
160         myOrientationListener.setOnOrientationListener(new OnOrientationListener()
161         {
162             @Override
163             public void onOrientationChanged(float x)
164             {
165                 mCurrentX = x;
166             }
167         });
168     }
169     //activity销毁时百度地图也销毁
170     @Override  
171     protected void onDestroy() {   
172         super.onDestroy();  
173         //在activity执行onDestroy时执行mMapView.onDestroy(),实现地图生命周期管理  
174         mMapView.onDestroy();  
175     }  
176     @Override
177     protected void onStart() {
178         // TODO Auto-generated method stub
179         super.onStart();
180         // 开启定位
181         mBaiduMap.setMyLocationEnabled(true);
182         if (!mLocationClient.isStarted())
183             mLocationClient.start();
184         // 开启方向传感器
185         myOrientationListener.start();
186             
187     }
188     @Override
189     protected void onStop() {
190         // TODO Auto-generated method stub
191         super.onStop();
192         // 停止定位
193         mBaiduMap.setMyLocationEnabled(false);
194         mLocationClient.stop();
195         // 停止方向传感器
196         myOrientationListener.stop();
197     }
198     @Override  
199     protected void onResume() {  
200         super.onResume();  
201         //在activity执行onResume时执行mMapView. onResume (),实现地图生命周期管理  
202         mMapView.onResume();  
203         }  
204     @Override  
205     protected void onPause() {  
206         super.onPause();  
207         //在activity执行onPause时执行mMapView. onPause (),实现地图生命周期管理  
208         mMapView.onPause();  
209         }  
210     @Override
211     public boolean onCreateOptionsMenu(Menu menu) {
212         // TODO Auto-generated method stub
213         
214         getMenuInflater().inflate(R.menu.main, menu);
215         return true;
216     }
217     //菜单按钮的响应事件
218     @Override
219     public boolean onOptionsItemSelected(MenuItem item) {
220         // TODO Auto-generated method stub
221         switch (item.getItemId()) {
222         case R.id.id_map_common:
223             mBaiduMap.setMapType(BaiduMap.MAP_TYPE_NORMAL);
224             break;
225         case R.id.id_map_site:
226             mBaiduMap.setMapType(BaiduMap.MAP_TYPE_SATELLITE);
227             break;
228         case R.id.id_map_traffic:
229             if(mBaiduMap.isTrafficEnabled())
230             {
231                 mBaiduMap.setTrafficEnabled(false);
232                 item.setTitle("实时交通(off)");
233             }
234             else
235             {
236                 mBaiduMap.setTrafficEnabled(true);
237                 item.setTitle("实时交通(on)");
238             }
239             break;
240         case R.id.id_map_location:
241             //定位最新自己的位置
242             centerToMyLocation();
243             break;
244 
245         case R.id.id_mode_common:
246             //设置普通模式
247             mLocationMode = LocationMode.NORMAL;
248             break;
249         case R.id.id_mode_following:
250             //设置跟随模式
251             mLocationMode = LocationMode.FOLLOWING;
252             break;
253         case R.id.id_mode_compass:
254             //设置罗盘模式
255             mLocationMode = LocationMode.COMPASS;
256             break;
257         case R.id.id_add_overlay:
258             //设置添加覆盖物
259             addOverlays(Info.infos);
260             break;
261         default:
262             break;
263         }
264         return super.onOptionsItemSelected(item);
265     }
266     private void addOverlays(List<Info> infos) {
267         // TODO Auto-generated method stub
268         //添加覆盖物
269         //清楚定位的一些图层
270         mBaiduMap.clear();
271         // 经纬度
272         LatLng latLng = null;
273         Marker marker = null;
274         OverlayOptions options;
275         for (Info info : infos)
276         {
277             // 经纬度
278             latLng = new LatLng(info.getLatitude(), info.getLongitude());
279             // 图标
280             options = new MarkerOptions().position(latLng).icon(mMarker).zIndex(5);//5表示图层的位置,越大越在上面
281             marker = (Marker) mBaiduMap.addOverlay(options);
282             Bundle arg0 = new Bundle();
283             arg0.putSerializable("info", info);
284             marker.setExtraInfo(arg0);
285         }
286         //定位好之后,讲地图定位到最后一个图标的位置
287         MapStatusUpdate msu = MapStatusUpdateFactory.newLatLng(latLng);
288         mBaiduMap.setMapStatus(msu);
289         
290     }
291 
292     //进到自己的位置
293     private void centerToMyLocation() {
294         LatLng latLng = new LatLng(mLatitude,mLongtitude);
295         
296         MapStatusUpdate msu = MapStatusUpdateFactory.newLatLng(latLng);
297         mBaiduMap.animateMapStatus(msu);
298     }
299     private class MyLocationListener implements BDLocationListener{
300 
301         @Override
302         public void onReceiveLocation(BDLocation location) {
303             // TODO Auto-generated method stub
304             MyLocationData data = new MyLocationData.Builder()//
305             .direction(mCurrentX)//
306             .accuracy(location.getRadius())//
307             .latitude(location.getLatitude())//
308             .longitude(location.getLongitude())//
309             .build();
310     mBaiduMap.setMyLocationData(data);
311     // 设置自定义图标
312     MyLocationConfiguration config = new MyLocationConfiguration(mLocationMode, true, mIconLocation);
313     mBaiduMap.setMyLocationConfigeration(config);
314     //获取最新经纬度
315     mLatitude = location.getLatitude();
316     mLongtitude = location.getLongitude();
317     //判断是否第一次定位
318     if (isFirstIn)
319     {
320         //设置经纬度
321         LatLng latLng = new LatLng(location.getLatitude(),location.getLongitude());
322         
323         MapStatusUpdate msu = MapStatusUpdateFactory.newLatLng(latLng);
324         mBaiduMap.animateMapStatus(msu);
325         //将是否第一次定位的标志 变为不是第一次定位
326         isFirstIn = false;
327         //显示当前定位的位置
328         Toast.makeText(context, location.getAddrStr(),
329                 Toast.LENGTH_SHORT).show();
330     }
331 
332         }
333         
334     }
335 }

 

 其中红色字体部分为本篇新加代码 

对应布局文件

activity_main.xml

 1 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
 2     xmlns:tools="http://schemas.android.com/tools"
 3     android:layout_width="match_parent"
 4     android:layout_height="match_parent" >
 5 
 6     <com.baidu.mapapi.map.MapView
 7         android:id="@+id/id_bmapView"
 8         android:layout_width="fill_parent"
 9         android:layout_height="fill_parent"
10         android:clickable="true" />
11 
12     <RelativeLayout
13         android:id="@+id/id_maker_ly"
14         android:layout_width="match_parent"
15         android:layout_height="220dp"
16         android:layout_alignParentBottom="true"
17         android:background="#cc4e5a6b"
18         android:clickable="true"
19         android:visibility="gone" >
20 
21         <ImageView
22             android:id="@+id/id_info_img"
23             android:layout_width="fill_parent"
24             android:layout_height="150dp"
25             android:layout_marginBottom="10dp"
26             android:layout_marginLeft="12dp"
27             android:layout_marginRight="12dp"
28             android:layout_marginTop="10dp"
29             android:background="@drawable/img_border"
30             android:scaleType="fitXY"
31             android:src="@drawable/a01" >
32         </ImageView>
33 
34         <RelativeLayout
35             android:layout_width="fill_parent"
36             android:layout_height="50dp"
37             android:layout_alignParentBottom="true"
38             android:background="@drawable/bg_map_bottom" >
39 
40             <LinearLayout
41                 android:layout_width="wrap_content"
42                 android:layout_height="wrap_content"
43                 android:layout_centerVertical="true"
44                 android:layout_marginLeft="20dp"
45                 android:orientation="vertical" >
46 
47                 <TextView
48                     android:id="@+id/id_info_name"
49                     android:layout_width="wrap_content"
50                     android:layout_height="wrap_content"
51                     android:text="老米家泡馍"
52                     android:textColor="#fff5eb" />
53 
54                 <TextView
55                     android:id="@+id/id_info_distance"
56                     android:layout_width="wrap_content"
57                     android:layout_height="wrap_content"
58                     android:text="距离200米"
59                     android:textColor="#fff5eb" />
60             </LinearLayout>
61 
62             <LinearLayout
63                 android:layout_width="wrap_content"
64                 android:layout_height="wrap_content"
65                 android:layout_alignParentRight="true"
66                 android:layout_centerVertical="true"
67                 android:layout_marginRight="20dp"
68                 android:orientation="horizontal" >
69 
70                 <ImageView
71                     android:layout_width="wrap_content"
72                     android:layout_height="wrap_content"
73                     android:background="@drawable/map_zan"
74                     android:clickable="true" />
75 
76                 <TextView
77                     android:id="@+id/id_info_zan"
78                     android:layout_width="wrap_content"
79                     android:layout_height="wrap_content"
80                     android:layout_gravity="center"
81                     android:text="789"
82                     android:textColor="#fff5eb" />
83             </LinearLayout>
84         </RelativeLayout>
85     </RelativeLayout>
86 
87 </RelativeLayout>
activity_main.xml

效果图:

点击坐标便显示对应的信息,点击几个坐标以外的位置,信息框便会消失

相关文章
|
10天前
|
开发框架 前端开发 Android开发
安卓与iOS开发中的跨平台策略
在移动应用开发的战场上,安卓和iOS两大阵营各据一方。随着技术的演进,跨平台开发框架成为开发者的新宠,旨在实现一次编码、多平台部署的梦想。本文将探讨跨平台开发的优势与挑战,并分享实用的开发技巧,帮助开发者在安卓和iOS的世界中游刃有余。
|
15天前
|
搜索推荐 Android开发 开发者
探索安卓开发中的自定义视图:打造个性化UI组件
【10月更文挑战第39天】在安卓开发的世界中,自定义视图是实现独特界面设计的关键。本文将引导你理解自定义视图的概念、创建流程,以及如何通过它们增强应用的用户体验。我们将从基础出发,逐步深入,最终让你能够自信地设计和实现专属的UI组件。
|
1天前
|
Java 调度 Android开发
安卓与iOS开发中的线程管理差异解析
在移动应用开发的广阔天地中,安卓和iOS两大平台各自拥有独特的魅力。如同东西方文化的差异,它们在处理多线程任务时也展现出不同的哲学。本文将带你穿梭于这两个平台之间,比较它们在线程管理上的核心理念、实现方式及性能考量,助你成为跨平台的编程高手。
|
17天前
|
Android开发 Swift iOS开发
探索安卓与iOS开发的差异和挑战
【10月更文挑战第37天】在移动应用开发的广阔舞台上,安卓和iOS这两大操作系统扮演着主角。它们各自拥有独特的特性、优势以及面临的开发挑战。本文将深入探讨这两个平台在开发过程中的主要差异,从编程语言到用户界面设计,再到市场分布的不同影响,旨在为开发者提供一个全面的视角,帮助他们更好地理解并应对在不同平台上进行应用开发时可能遇到的难题和机遇。
|
19天前
|
XML 存储 Java
探索安卓开发之旅:从新手到专家
【10月更文挑战第35天】在数字化时代,安卓应用的开发成为了一个热门话题。本文旨在通过浅显易懂的语言,带领初学者了解安卓开发的基础知识,同时为有一定经验的开发者提供进阶技巧。我们将一起探讨如何从零开始构建第一个安卓应用,并逐步深入到性能优化和高级功能的实现。无论你是编程新手还是希望提升技能的开发者,这篇文章都将为你提供有价值的指导和灵感。
|
17天前
|
存储 API 开发工具
探索安卓开发:从基础到进阶
【10月更文挑战第37天】在这篇文章中,我们将一起探索安卓开发的奥秘。无论你是初学者还是有经验的开发者,这篇文章都将为你提供有价值的信息和建议。我们将从安卓开发的基础开始,逐步深入到更复杂的主题,如自定义组件、性能优化等。最后,我们将通过一个代码示例来展示如何实现一个简单的安卓应用。让我们一起开始吧!
|
18天前
|
存储 XML JSON
探索安卓开发:从新手到专家的旅程
【10月更文挑战第36天】在这篇文章中,我们将一起踏上一段激动人心的旅程,从零基础开始,逐步深入安卓开发的奥秘。无论你是编程新手,还是希望扩展技能的老手,这里都有适合你的知识宝藏等待发掘。通过实际的代码示例和深入浅出的解释,我们将解锁安卓开发的关键技能,让你能够构建自己的应用程序,甚至贡献于开源社区。准备好了吗?让我们开始吧!
26 2
|
19天前
|
Android开发
布谷语音软件开发:android端语音软件搭建开发教程
语音软件搭建android端语音软件开发教程!
|
27天前
|
编解码 Java Android开发
通义灵码:在安卓开发中提升工作效率的真实应用案例
本文介绍了通义灵码在安卓开发中的应用。作为一名97年的聋人开发者,我在2024年Google Gemma竞赛中获得了冠军,拿下了很多项目竞赛奖励,通义灵码成为我的得力助手。文章详细展示了如何安装通义灵码插件,并通过多个实例说明其在适配国际语言、多种分辨率、业务逻辑开发和编程语言转换等方面的应用,显著提高了开发效率和准确性。
|
26天前
|
Android开发 开发者 UED
安卓开发中自定义View的实现与性能优化
【10月更文挑战第28天】在安卓开发领域,自定义View是提升应用界面独特性和用户体验的重要手段。本文将深入探讨如何高效地创建和管理自定义View,以及如何通过代码和性能调优来确保流畅的交互体验。我们将一起学习自定义View的生命周期、绘图基础和事件处理,进而探索内存和布局优化技巧,最终实现既美观又高效的安卓界面。
32 5