研究《精通Android 3》书有一个月,对于所看过的知识点不是掌握的很好,所以想找个项目来练手,想到就去做,在eoeAndroid的开发社区找到了Android天气预报小程序,就把它下载了下来。首先,将项目的源代码导入到Eclipse里面,我使用的模拟器的版本是Android 2.3.3的,点击运行出现在我们眼前的是一个欢迎界面,心情有点激动,呵呵!如图所示:
欢迎界面
接着就进入到主界面,如图所示:
主界面
体验了一番之后,从感观上知道程序是采用什么方式布局的,猜测程序的各个控件具备些什么功能,并且是通过什么方法去实现它的。接着开始分析程序的源代码,在分析源代码的过程中,有不懂的我就google或者bing,基本的思路有了,就开始动手做这个天气预报的小程序。
首先,将“欢迎界面”的Activity截图下来,使用“画图”工具打开,在右侧写出“欢迎界面”Activity的实现步骤,接着,将“主界面”的Activity也截图下来,使用“画图”工具打开,与“欢迎界面”的Activity一样,将实现的步骤写出来,最后,将Eclipse项目中的每个包中的类都展开(如图所示),截图后用“画图”工具打开,将每个类需要做的哪些事情用文字描述出来,关于以上提到的三个截图,要做到分析的越详细越好,这样有便于开发。
包的命名以及类的命名
在开始写这个程序之前,要确保准备工作是否做好了,如果觉得哪一块还是不太懂的话,还是再把源代码拿出来研究一番,直到搞懂为止。扯远点,这样有利于在这个程序的基础上附加些自己想要的功能。
现在,可以动手写Android天气预报小程序了,以下是我对编写这个程序的理解,表述的不是很好,望指出,呵呵!
LoadUI.java需要做的事情有:
1.加载进度条,代码如下:
GIFView gif = new GIFView(LoadUI.this, R.drawable.progress); ((RelativeLayout) findViewById(R.id.progress)).addView(gif);
GIFView类,该类中的调用了GIFDecode类中的方法,对于GIFDecode类的理解不是很透彻,我是使用另外一种方法解决“欢迎界面”Activity的进度条加载方法,没有使用到GIFDecode类,但是,加载进度条的效果非常的逊色。以下代码是放在GIFView类中的。
public class GIFView extends View { private Movie mMovie; private long mMovieStart; public GIFView(Context context, int img) { super(context); // 以文件流的方式读取文件 mMovie = Movie.decodeStream(getResources().openRawResource(img)); } @Override protected void onDraw(Canvas canvas) { long curTime = SystemClock.uptimeMillis(); // 第一次播放 if (mMovieStart == 0) { mMovieStart = curTime; } if (mMovie != null) { int duration = mMovie.duration(); int relTime = (int) ((curTime - mMovieStart) % duration); mMovie.setTime(relTime); mMovie.draw(canvas, 0, 0); // 强制重绘 invalidate(); } super.onDraw(canvas); } }
2.使用Intent加载天气预报数据的服务,代码如下:
intent = new Intent(LoadUI.this, LoadDataService.class); Bundle bundle = new Bundle(); // 创建天气内容 bundle.putString("city", WeatherUtil.getDefaultCity(LoadUI.this)); bundle.putBoolean("check", false); // 不编写内容 intent.putExtras(bundle); // 封装天气 LoadUI.this.startService(LoadUI.this.intent);
LoadDataService类是用于加载天气预报数据的服务类,这个类需要做以下几件事情:
2.1.将当前城市的解码为UTF-8,代码如下:
city = URLEncoder.encode(city, "UTF-8");
例如:输入“南昌”,它会将“南昌”解码成%E5%8D%97%E6%98%8C,为什么需要将城市解码为UTF-8,可以用浏览器测试,当在我浏览器中输入http://www.google.com/ig/api?hl=zh-cn&weather=%E5%8D%97%E6%98%8C时,它会显示南昌的天气,当我在浏览器中输入http://www.google.com/ig/api?hl=zh-cn&weather=南昌,出现<problem_cause data=""/>错误。除了利用解码的方式,还有一种方法,输入城市的拼音,像http://www.google.com/ig/api?hl=zh-cn&weather=Nanchang。
2.2.通过将城市解码成UTF-8编码后,就可以开始解析http://www.google.com/ig/api?hl=zh-cn&weather=“解码后的城市名”网站的xml,解析工作交给XmlParse类,这个类需要去扩展DefaultHandler,并且需要重写startElement()和endElement()两个方法。
2.3.通过google上的天气图标名称如:<icon data="/ig/images/weather/chance_of_rain.gif"/>来与本地图片的Map中的键是否包含,如果包含,通过该键,得到本地图片的资源,本地图片的资源就是值。实现如下,以下代码还判断了白天与晚上显示的天气图片是不一样的:
public static int getImageName(String imageUrl, boolean isNight) { String[] str = imageUrl.split("/"); // str[str.length - 1]:表示的是 google icon的名称 if (isNight) { if (Constant.NIGHT_IMAGE_MAP.containsKey(str[str.length - 1])) { return Constant.NIGHT_IMAGE_MAP.get(str[str.length - 1]); } else { return Constant.DEFAULT_IMG; } } else { if (Constant.DAY_IMAGE_MAP.containsKey(str[str.length - 1])) { return Constant.DAY_IMAGE_MAP.get(str[str.length - 1]); } else { return Constant.DEFAULT_IMG; } } }
对于LoadDataService类的讲解到此为止,现在还是继续讲解LoadUI.java需要做的事情。
3.启动“主界面”Activity。
最后,感谢写Android天气预报小程序的人,给了我怎样去编写天气预报程序的思路。在此,说声“谢谢”了。讲解的很凌乱,不好意思啊,各位!