最新基于高德地图的android进阶开发(5)地图的基本操作、事件监听、用户UI、图层选择等
2016-07-29 10:05
801 查看
1.高德地图的基本操作:最简单的莫过于第一次加载地图
布局文件:basic_map.xml,在下面的操作中,未作特别说明都采用此布局文件。
<?xml version="1.0" encoding="utf-8"?> <com.amap.api.maps.MapView xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/map" android:layout_width="match_parent" android:layout_height="match_parent" > </com.amap.api.maps.MapView>
基本操作:第一次加载地图。
package com.dragon.arnav.basicFuction.basic; import android.app.Activity; import android.os.Bundle; import com.amap.api.maps.AMap; import com.amap.api.maps.MapView; import com.dragon.arnav.R; /** * This file created by dragon on 2016/7/28 21:26,belong to com.dragon.arnav.basicFuction.basic . */ public class basicMap extends Activity { private MapView mapView; private AMap aMap; @Override protected void onCreate(Bundle savedInstanceState){ super.onCreate(savedInstanceState); //采用这种方式或是下面注视的动态加载都是可以的 setContentView(R.layout.basic_map); mapView = (MapView) findViewById(R.id.map); // mapView = new MapView(this); // setContentView(mapView); mapView.onCreate(savedInstanceState); init(); } private void init(){ if(aMap == null){ aMap = mapView.getMap(); } } @Override protected void onResume(){ super.onResume(); mapView.onResume(); } @Override protected void onPause() { super.onPause(); mapView.onPause(); } @Override protected void onDestroy(){ super.onDestroy(); mapView.onDestroy(); } @Override public void onSaveInstanceState(Bundle outState){ super.onSaveInstanceState(outState); mapView.onSaveInstanceState(outState); } }
2.camera视图实战,包括移动、动画视图、停止等,来自官方的demo
布局文件:
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal" > <LinearLayout android:layout_width="wrap_content" android:layout_height="match_parent" android:orientation="vertical" > <Button android:id="@+id/stop_animation" android:layout_width="40dip" android:layout_height="40dip" android:text="@string/stop_animation" /> <ToggleButton android:id="@+id/animate" android:layout_width="wrap_content" android:layout_height="wrap_content" android:checked="true" android:textOff="@string/animate" android:textOn="@string/animate" /> </LinearLayout> <LinearLayout android:layout_width="wrap_content" android:layout_height="wrap_content" android:orientation="vertical" > <Button android:id="@+id/Lujiazui" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/go_to_lujiazui" /> <Button android:id="@+id/Zhongguancun" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/go_to_zhongguancun" /> </LinearLayout> <RelativeLayout android:layout_width="0dp" android:layout_height="match_parent" android:layout_weight="1" android:gravity="center_horizontal" > <Button android:id="@+id/scroll_left" android:layout_width="40dip" android:layout_height="40dip" android:layout_alignParentLeft="true" android:layout_centerVertical="true" android:text="@string/left_arrow" /> <Button android:id="@+id/scroll_up" android:layout_width="40dip" android:layout_height="40dip" android:layout_alignParentTop="true" android:layout_toRightOf="@id/scroll_left" android:text="@string/up_arrow" /> <Button android:id="@+id/scroll_down" android:layout_width="40dip" android:layout_height="40dip" android:layout_below="@id/scroll_up" android:layout_toRightOf="@id/scroll_left" android:text="@string/down_arrow" /> <Button android:id="@+id/scroll_right" android:layout_width="40dip" android:layout_height="40dip" android:layout_centerVertical="true" android:layout_toRightOf="@id/scroll_down" android:text="@string/right_arrow" /> </RelativeLayout> <LinearLayout android:layout_width="wrap_content" android:layout_height="match_parent" android:layout_gravity="right" android:orientation="vertical" > <Button android:id="@+id/zoom_in" android:layout_width="40dip" android:layout_height="40dip" android:text="@string/zoom_in" /> <Button android:id="@+id/zoom_out" android:layout_width="40dip" android:layout_height="40dip" android:text="@string/zoom_out" /> </LinearLayout> </LinearLayout> <com.amap.api.maps.MapView android:id="@+id/map" android:layout_width="match_parent" android:layout_height="match_parent" /> </LinearLayout>
核心代码:
package com.dragon.arnav.basicFuction.basic; import android.app.Activity; import android.os.Bundle; import android.view.View; import android.widget.Button; import android.widget.CompoundButton; import android.widget.ToggleButton; import com.amap.api.maps.AMap; import com.amap.api.maps.CameraUpdate; import com.amap.api.maps.CameraUpdateFactory; import com.amap.api.maps.MapView; import com.amap.api.maps.model.BitmapDescriptorFactory; import com.amap.api.maps.model.CameraPosition; import com.amap.api.maps.model.MarkerOptions; import com.dragon.arnav.R; import com.dragon.arnav.basicFuction.util.Constants; import com.dragon.arnav.basicFuction.util.ToastUtil; /** * This file created by dragon on 2016/7/28 21:26,belong to com.dragon.arnav.basicFuction.basic . */ public class basicMap extends Activity implements View.OnClickListener,AMap.CancelableCallback { private MapView mapView; private AMap aMap; // 上下左右一次的移动像素点 private static final int SCROLL_BY_PX = 100; @Override protected void onCreate(Bundle savedInstanceState){ super.onCreate(savedInstanceState); setContentView(R.layout.basic_map); mapView = (MapView) findViewById(R.id.map); mapView.onCreate(savedInstanceState); init(); } private void init(){ if(aMap == null){ aMap = mapView.getMap(); } // 各种事件的监听方式 Button stopAnimation = (Button)findViewById(R.id.stop_animation); stopAnimation.setOnClickListener(this); ToggleButton animate = (ToggleButton)findViewById(R.id.animate); animate.setOnClickListener(this); Button Lujiazui = (Button) findViewById(R.id.Lujiazui); Lujiazui.setOnClickListener(this); Button Zhongguancun = (Button) findViewById(R.id.Zhongguancun); Zhongguancun.setOnClickListener(this); Button scrollLeft = (Button)findViewById(R.id.scroll_left); scrollLeft.setOnClickListener(this); Button scrollRight = (Button)findViewById(R.id.scroll_right); scrollRight.setOnClickListener(this); Button scrollUp = (Button)findViewById(R.id.scroll_up); scrollUp.setOnClickListener(this); Button scrollDown = (Button) findViewById(R.id.scroll_down); scrollDown.setOnClickListener(this); Button zoomIn = (Button) findViewById(R.id.zoom_in); zoomIn.setOnClickListener(this); Button zoomOut = (Button)findViewById(R.id.zoom_out); zoomOut.setOnClickListener(this); } @Override protected void onResume(){ super.onResume(); mapView.onResume(); } @Override protected void onPause() { super.onPause(); mapView.onPause(); } @Override protected void onDestroy(){ super.onDestroy(); mapView.onDestroy(); } @Override public void onSaveInstanceState(Bundle outState){ super.onSaveInstanceState(outState); mapView.onSaveInstanceState(outState); } // 根据动画按钮的状态来选择不同的camera来改变可视区域 // AMap.CanclelableCallback:当一个任务完成或关闭时的回调接口。 private void changeCamera(CameraUpdate update, AMap.CancelableCallback callback){ boolean animated = ((CompoundButton)findViewById(R.id.animate)).isChecked(); if(animated){ //在指定的持续时间内,动画地移动地图到指定的位置,完成时调用可选的回调方法。 如果运动过程中调用getCameraPosition(),它将返回可视区域飞行中的当前位置。 // 第一个参数:定义转换的时间,第二个参数:运动的持续时间,第三个参数:回调函数 aMap.animateCamera(update,1000,callback); }else{ // 照传入的CameraUpdate 参数移动可视区域。这个方法为瞬间移动,没有移动过程,如果在调用此方法后再调用getCameraPosition()将返回移动后位置。 aMap.moveCamera(update); } } @Override public void onClick(View v){ switch(v.getId()){ /** * 点击停止动画按钮响应事件 */ case R.id.stop_animation: aMap.stopAnimation(); break; /** * 点击“去中关村”按钮响应事件 */ case R.id.Zhongguancun: changeCamera( CameraUpdateFactory.newCameraPosition(new CameraPosition( Constants.ZHONGGUANCUN, 18, 0, 30)), null); break; /** * 点击“去陆家嘴”按钮响应事件 */ case R.id.Lujiazui: changeCamera( CameraUpdateFactory.newCameraPosition(new CameraPosition( Constants.SHANGHAI, 18, 30, 0)), this); break; /** * 点击向左移动按钮响应事件,camera将向左边移动 */ case R.id.scroll_left: changeCamera(CameraUpdateFactory.scrollBy(-SCROLL_BY_PX, 0), null); break; /** * 点击向右移动按钮响应事件,camera将向右边移动 */ case R.id.scroll_right: changeCamera(CameraUpdateFactory.scrollBy(SCROLL_BY_PX, 0), null); break; /** * 点击向上移动按钮响应事件,camera将向上边移动 */ case R.id.scroll_up: changeCamera(CameraUpdateFactory.scrollBy(0, -SCROLL_BY_PX), null); break; /** * 点击向下移动按钮响应事件,camera将向下边移动 */ case R.id.scroll_down: changeCamera(CameraUpdateFactory.scrollBy(0, SCROLL_BY_PX), null); break; /** * 点击地图放大按钮响应事件 */ case R.id.zoom_in: changeCamera(CameraUpdateFactory.zoomIn(), null); break; /** * 点击地图缩小按钮响应事件 */ case R.id.zoom_out: changeCamera(CameraUpdateFactory.zoomOut(), null); break; default: break; } } /** * 地图动画效果终止回调方法 */ @Override public void onCancel() { ToastUtil.show(basicMap.this, "Animation to 陆家嘴 canceled"); } /** * 地图动画效果完成回调方法 */ @Override public void onFinish() { ToastUtil.show(basicMap.this, "Animation to 陆家嘴 complete"); } }
效果图
3.事件监听,主要包括单击,长按,触摸等事件
布局文件
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <TextView android:id="@+id/tap_text" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="@string/tap_instructions" /> <TextView android:id="@+id/camera_text" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="@string/move_the_camera" /> <TextView android:id="@+id/touch_text" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="@string/touch_the_map" /> <com.amap.api.maps.MapView android:id="@+id/map" android:layout_width="match_parent" android:layout_height="match_parent" /> </LinearLayout>
核心代码(来自官方demo)
package com.amap.map3d.demo.basic; import android.app.Activity; import android.os.Bundle; import android.view.MotionEvent; import android.widget.TextView; import com.amap.api.maps.AMap; import com.amap.api.maps.AMap.OnCameraChangeListener; import com.amap.api.maps.AMap.OnMapClickListener; import com.amap.api.maps.AMap.OnMapLongClickListener; import com.amap.api.maps.AMap.OnMapTouchListener; import com.amap.api.maps.MapView; import com.amap.api.maps.model.CameraPosition; import com.amap.api.maps.model.LatLng; import com.amap.api.maps.model.LatLngBounds; import com.amap.api.maps.model.VisibleRegion; import com.amap.map3d.demo.util.Constants; import com.amap.map3d.demo.util.ToastUtil; import com.amap.map3d.demo.R; /** * AMapV2地图中简单介绍OnMapClickListener, OnMapLongClickListener, * OnCameraChangeListener三种监听器用法 */ public class EventsActivity extends Activity implements OnMapClickListener, OnMapLongClickListener, OnCameraChangeListener, OnMapTouchListener { private AMap aMap; private MapView mapView; private TextView mTapTextView; private TextView mCameraTextView; private TextView mTouchTextView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.events_activity); mapView = (MapView) findViewById(R.id.map); mapView.onCreate(savedInstanceState);// 此方法必须重写 init(); } /** * 初始化AMap对象 */ private void init() { if (aMap == null) { aMap = mapView.getMap(); setUpMap(); } mTapTextView = (TextView) findViewById(R.id.tap_text); mCameraTextView = (TextView) findViewById(R.id.camera_text); mTouchTextView = (TextView) findViewById(R.id.touch_text); } /** * amap添加一些事件监听器 */ private void setUpMap() { aMap.setOnMapClickListener(this);// 对amap添加单击地图事件监听器 aMap.setOnMapLongClickListener(this);// 对amap添加长按地图事件监听器 aMap.setOnCameraChangeListener(this);// 对amap添加移动地图事件监听器 aMap.setOnMapTouchListener(this);// 对amap添加触摸地图事件监听器 } /** * 方法必须重写 */ @Override protected void onResume() { super.onResume(); mapView.onResume(); } /** * 方法必须重写 */ @Override protected void onPause() { super.onPause(); mapView.onPause(); } /** * 方法必须重写 */ @Override protected void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); mapView.onSaveInstanceState(outState); } /** * 方法必须重写 */ @Override protected void onDestroy() { super.onDestroy(); mapView.onDestroy(); } /** * 对单击地图事件回调 */ @Override public void onMapClick(LatLng point) { mTapTextView.setText("tapped, point=" + point); } /** * 对长按地图事件回调 */ @Override public void onMapLongClick(LatLng point) { mTapTextView.setText("long pressed, point=" + point); } /** * 对正在移动地图事件回调 */ @Override public void onCameraChange(CameraPosition cameraPosition) { mCameraTextView.setText("onCameraChange:" + cameraPosition.toString()); } /** * 对移动地图结束事件回调 */ @Override public void onCameraChangeFinish(CameraPosition cameraPosition) { mCameraTextView.setText("onCameraChangeFinish:" + cameraPosition.toString()); VisibleRegion visibleRegion = aMap.getProjection().getVisibleRegion(); // 获取可视区域、 LatLngBounds latLngBounds = visibleRegion.latLngBounds;// 获取可视区域的Bounds boolean isContain = latLngBounds.contains(Constants.SHANGHAI);// 判断上海经纬度是否包括在当前地图可见区域 if (isContain) { ToastUtil.show(EventsActivity.this, "上海市在地图当前可见区域内"); } else { ToastUtil.show(EventsActivity.this, "上海市超出地图当前可见区域"); } } /** * 对触摸地图事件回调 */ @Override public void onTouch(MotionEvent event) { mTouchTextView.setText("触摸事件:屏幕位置" + event.getX() + " " + event.getY()); } }
相关文章推荐
- 使用C++实现JNI接口需要注意的事项
- Android IPC进程间通讯机制
- Android Manifest 用法
- [转载]Activity中ConfigChanges属性的用法
- Android之获取手机上的图片和视频缩略图thumbnails
- Android之使用Http协议实现文件上传功能
- Android学习笔记(二九):嵌入浏览器
- android string.xml文件中的整型和string型代替
- i-jetty环境搭配与编译
- android之定时器AlarmManager
- android wifi 无线调试
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- android 代码实现控件之间的间距
- android FragmentPagerAdapter的“标准”配置
- Android"解决"onTouch和onClick的冲突问题
- android:installLocation简析
- android searchView的关闭事件
- SourceProvider.getJniDirectories