`
java-mans
  • 浏览: 11420597 次
文章分类
社区版块
存档分类
最新评论

Android开源代码解读の地图照片应用Panoramio的实现详解(三)

 
阅读更多

本文介绍程序主界面的实现,对应的文件是Panoramio.java,主界面提供给用户从地图上选择搜索区域的功能,因此,直接从MapActivity继承,并实现OnClickListener接口。这样一来,这个类的初始框架如下代码所示:

import com.google.android.maps.MapActivity;

import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;

public class MainActivity extends MapActivity implements OnClickListener {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
    }

    
	@Override
	//为了统计目的,地图服务器需要知道我们的MapActivity是否显示路线信息,例如行车方向等
	protected boolean isRouteDisplayed() { 
		return false;
	}

	public void onClick(View arg0) {
		// TODO Auto-generated method stub
		
	}
}
重温下程序界面,如下图:


对照着上图,布局文件main.xml也就一目了然,结合采用线性布局和帧布局,如下所示:(注意,picture_frame.9.png是一张9-patch图片)

<?xml version="1.0" encoding="utf-8"?>

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    >
	<FrameLayout 
		android:layout_width="fill_parent" 
	    android:layout_height="0dip"
	    android:layout_weight="1"
   		android:padding="10dip">
   		
		<FrameLayout 
			android:id="@+id/frame"
			android:layout_width="fill_parent" 
		    android:layout_height="fill_parent"
		    android:background="@drawable/picture_frame"
		    /> 
	</FrameLayout> 

	<Button
    	android:id="@+id/go"
 		android:layout_width="wrap_content" 
	    android:layout_height="wrap_content" 
	    android:layout_gravity="center_horizontal"
	    
	    android:text="@string/go"
	    android:minWidth="150dip"
	    android:layout_marginBottom="2dip"
	    />
	    
</LinearLayout>

下面是Panoramio.java的代码,注释很清楚了,这里就不多说了:

package com.google.android.panoramio;

import com.google.android.maps.GeoPoint;
import com.google.android.maps.MapActivity;
import com.google.android.maps.MapView;
import com.google.android.maps.MyLocationOverlay;

import android.content.Intent;
import android.os.Bundle;
import android.view.Gravity;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup.LayoutParams;
import android.widget.Button;
import android.widget.FrameLayout;


/**
 * 该Activity提供MapView给用户选择周边图片搜索区域
 *
 */
public class Panoramio extends MapActivity implements OnClickListener {
    private MapView mMapView; //显示地图的map
    private MyLocationOverlay mMyLocationOverlay; //在地图上画出用户目前位置的Overlay
    private ImageManager mImageManager; //负责从Panoramio服务器下载并解析指定区域的图片资源
    
    public static final int MILLION = 1000000;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        
        setContentView(R.layout.main);
        
        mImageManager = ImageManager.getInstance(this); //ImageManager是一个单例类
        
        FrameLayout frame = (FrameLayout) findViewById(R.id.frame);
        Button goButton = (Button) findViewById(R.id.go);
        goButton.setOnClickListener(this);
       
        //将MapView加入到FrameLayout中,Panoramio_DummyAPIKey是Google地图API密钥
        mMapView = new MapView(this, "Panoramio_DummyAPIKey");
        frame.addView(mMapView, 
                new FrameLayout.LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT));

        // 创建Overlay显示用户当前位置
        mMyLocationOverlay = new MyLocationOverlay(this, mMapView);
        //
        mMyLocationOverlay.runOnFirstFix(new Runnable() { public void run() {
            mMapView.getController().animateTo(mMyLocationOverlay.getMyLocation());
        }});

        mMapView.getOverlays().add(mMyLocationOverlay); //将我们的LocationOverlay加入Overlay链表中
        mMapView.getController().setZoom(15); //设置缩放级别(1~21)
        mMapView.setClickable(true);
        mMapView.setEnabled(true);
        mMapView.setSatellite(true);
        
        addZoomControls(frame);
    }

    @Override
    protected void onResume() {
        super.onResume();
        mMyLocationOverlay.enableMyLocation();
    }

    @Override
    protected void onStop() {
        mMyLocationOverlay.disableMyLocation();
        super.onStop();
    }

    /**
     * 给指定的FrameLayout添加缩放控制
     */
    private void addZoomControls(FrameLayout frame) {
    	//获取MapView的缩放控制视图
        View zoomControls = mMapView.getZoomControls();
        
        //将缩放控制视图添加到FrameLayout的底部
        FrameLayout.LayoutParams p = 
            new FrameLayout.LayoutParams(LayoutParams.WRAP_CONTENT,
                LayoutParams.WRAP_CONTENT, Gravity.BOTTOM + Gravity.CENTER_HORIZONTAL);
        frame.addView(zoomControls, p);
    }
    
    @Override
    protected boolean isRouteDisplayed() {
        return false; //不显示路线信息
    }
    
    /**
     * 点击搜索按钮的事件响应
     */
    public void onClick(View view) {
        // 获取搜索区域的经纬度信息
        int latHalfSpan = mMapView.getLatitudeSpan() >> 1; //纬度跨度的一半(当前选中搜索区域的纬度半径),十进制形式度数*1000000
        int longHalfSpan = mMapView.getLongitudeSpan() >> 1; //经度跨度的一半(当前选中搜索区域的经度半径),十进制形式度数*1000000
        
        //保存当前地图的位置信息,以便后续以相同位置显示
        GeoPoint center = mMapView.getMapCenter();
        int zoom = mMapView.getZoomLevel();       //缩放级别
        int latitudeE6 = center.getLatitudeE6();  //中心点的纬度*1E6(1E6=1000000)
        int longitudeE6 = center.getLongitudeE6();//中心点的经度*1E6(1E6=1000000)

        //构造Intent,传递给ImageList.class
        Intent i = new Intent(this, ImageList.class);
        i.putExtra(ImageManager.ZOOM_EXTRA, zoom);
        i.putExtra(ImageManager.LATITUDE_E6_EXTRA, latitudeE6);
        i.putExtra(ImageManager.LONGITUDE_E6_EXTRA, longitudeE6);

        //计算搜索区域中经度和纬度的最小值和最大值(搜索区域是一个圆)
        float minLong = ((float) (longitudeE6 - longHalfSpan)) / MILLION;
        float maxLong = ((float) (longitudeE6 + longHalfSpan)) / MILLION;

        float minLat = ((float) (latitudeE6 - latHalfSpan)) / MILLION;
        float maxLat = ((float) (latitudeE6 + latHalfSpan)) / MILLION;

        mImageManager.clear(); //清空上次下载的内容
        
        // 开始下载搜索区域内的图片信息资源
        mImageManager.load(minLong, maxLong, minLat, maxLat);
        
        //跳转到图片列表界面
        startActivity(i);
    }
}


分享到:
评论

相关推荐

    Panoramio Android源码

    Android开源代码解读の地图照片应用Panoramio的实现详解系列的源代码(http://blog.csdn.net/ace1985/article/details/7289040)

    apps-for-android

    •Panoramio的:一个应用程序,显示你附近的照片和兴趣点。 •照片流:一个应用程序,让您从在线照片托管服务查看照片媒体。 •雷达:雷达式的相对位置显示视图,用于Panoramio的(谷歌照片分享服务)等。 •...

    Panoramio.zip_android开发_Java_

    Panoramio example integration project for android

    谷歌地图 delphi 封装库 2013 0.1.9 全面支持google maps api

    一个老外(西班牙)编写的控件,封装了全部google maps api ,使用在DELPHI中使用谷歌地图变得非常简单 GMLib - Google Maps Library Send suggestions to gmlib@cadetill.com Supported Delphi version: Delphi 6...

    Fishmap:带有捕鱼信息的伊利诺伊州湖泊混搭地图

    简而言之,它是 GoogleMaps、Flickr、Panoramio 以及我从我去过的地方和见过的鱼中收集的大量信息的混搭。 目前,Fishmap 包含的数据仅限于伊利诺伊州。 #快速开始如果你只是想看到它运行,你可以查看它: : 如果...

    quentinuk.github.com:网络资料

    网络资料。 可以具有颜色的参数(要显示颜色名称,请单击空白),例如 SVG图片 盖尔语:在给定的单词和页面上指向盖... 将所有给定用户和标签的照片放在地图上。 (Google现在已关闭Panoramio,因此不再起作用。)

    python计算机视觉编程

    代码示例约定 第2章 局部图像描述子 2.1 harris角点检测器 2.2 sift(尺度不变特征变换) 2.2.1 兴趣点 2.2.2 描述子 2.2.3 检测兴趣点 2.2.4 匹配描述子 2.3 匹配地理标记图像 2.3.1 从...

    GoogleDesktopSetup

    GoogleDesktopSetup GoogleEarthPluginSetup.exe picasa3-setup.exe 世界照片:http://www.panoramio.com/

    GoogleEarth Pro 6.1.0.5001

    谷歌地图专业版 在“开始”----“运行”里输入: \WINDOWS\system32\drivers\etc 点确定。 后找到:“ hosts ”文件名, 双击打开 hosts , 选择打开方式“记事本”----确定。 在最下面添加复制粘贴内容: 74.125...

    谷歌地球打不开解决方法

    谷歌地球照片打不开解决方法: 开始-----运行----输入:C:WindowsSystem32driversetchosts,用记事本打开, 在里面最后一行添加:72.14.203.101 www.panoramio.com 然后保存。 好多人问,把此绝密方法贡献给大家。

    Wally-开源

    Wally是Qt4墙纸/背景更改器,使用文件,文件夹,FTP远程文件夹,Flickr,Panoramio,Ipernity,Photobucket,Buzznet,Picasa,Smugmug,Google,Vladstudio和deviantART图像等多种来源。

    Google:trade_mark:的快捷方式「Shortcuts for Google:trade_mark:」-crx插件

     - android开发者控制台  主持人  - 产品的想法  - 公共数据浏览器  - 绿色  - 驾驶  - 应用程序和应用程序仪表板  - 玩店,玩杂志  - 联系人  - 谷歌设置  - 新闻档案  - 网络历史  - 货币换算  - ...

    Headphone-Jack-to-Arduino:通过耳机插Kong和 Arduino 从智能手机触发相机闪光灯

    如果您来这里是为了寻找从 Panoramio 和 Flickr 获取某个位置图片的代码,这是给您的: : 设置 使用 Javascript 和 Web Audio API,从手机上运行的网页发送 50 毫秒长的声音脉冲。 ATtiny85 微处理器正在监听来自...

    FreeImageZoom-crx插件

    这是原始开源HoverZoom扩展的分支。 此扩展名已被删除(它正在使用跟踪,收集用户数据等)。 此扩展程序不会以任何方式跟踪用户的操作。 它唯一需要的权限是访问所有网站上的数据(以提取完整图像),以及*可选*权限...

    iOS-Images-Slideshow:一个图片幻灯片,基于 UIImageView 子类

    iOS-图片-幻灯片基于 ...如何使用特性名称类型描述图片可变数组它表示将在幻灯片上显示的一组图像名称或远程图像 url(例如 google 图像、panoramio 等) 间隔整数幻灯片的计时器间隔(默认 5) 代表ID 类委托(见 L3...

Global site tag (gtag.js) - Google Analytics