您的位置:首页 > 产品设计 > UI/UE

最新基于高德地图的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());
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  android