当前位置:   article > 正文

【项目源码】- 【天气预报】模仿魅族系统天气预报android_魅族天气现象代码

魅族天气现象代码

这个天气预报主要学习下网络方面的东西,比如json数据的读取,了解网络的一些知识。


其中还涉及的知识点包括:

 动画的操作,如入云的移动用的translateAnimation ,

还有 assert中txt文本的读取,

listview中的按钮点击事件,

scrollview的一些拖动的操作锁定边界的一些操作,

文字大小动作变化等等。


效果图如下:


数据存储采用SharedPreference,内容还不够完善,定位没有处理,预警信息没有,主要的接口信息只有一个。


采用http请求代码如下:

  1. package com.weather.utils;
  2. import android.content.Context;
  3. import android.text.TextUtils;
  4. import android.util.Log;
  5. import com.weather.activity.MainActivity;
  6. import com.weather.bean.WeatherInfo;
  7. import java.io.BufferedInputStream;
  8. import java.io.BufferedReader;
  9. import java.io.InputStream;
  10. import java.io.InputStreamReader;
  11. import java.net.HttpURLConnection;
  12. import java.net.URL;
  13. import org.json.JSONObject;
  14. /**
  15. * Created by Administrator on 2016/4/19.
  16. */
  17. public class HttpUtils{
  18. public HttpUtils(){
  19. }
  20. public static String getWeatherJsonData(String path){
  21. if(TextUtils.isEmpty(path)) {
  22. Log.e("提示信息:", "路径不能为空");
  23. return null;
  24. }else{
  25. try {
  26. URL url = new URL(path);
  27. HttpURLConnection conn = (HttpURLConnection) url.openConnection();
  28. conn.setRequestMethod("GET");
  29. conn.setReadTimeout(5000);
  30. conn.setRequestProperty("User-Agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET4.0C; .NET4.0E; .NET CLR 2.0.50727; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729; Shuame)");
  31. int code = conn.getResponseCode();
  32. if (code == 200) {
  33. String data = changeInputStreamToString(conn.getInputStream());
  34. return data;
  35. }else{
  36. Log.e("提示信息:", "连接失败");
  37. return null;
  38. }
  39. }catch (Exception e){
  40. e.printStackTrace();
  41. Log.e(e.toString(), "获取失败");
  42. return null;
  43. }
  44. }
  45. }
  46. /**
  47. *
  48. * @param is 输入流
  49. * @return 返回转换后的字符串
  50. */
  51. public static String changeInputStreamToString(InputStream is){
  52. BufferedReader bufr = new BufferedReader(new InputStreamReader(is));
  53. try {
  54. String line = null;
  55. StringBuilder sb = new StringBuilder();
  56. while((line = bufr.readLine())!=null){
  57. sb.append(line);
  58. }
  59. //System.out.println(sb.toString());
  60. return sb.toString();
  61. }catch (Exception e){
  62. e.printStackTrace();
  63. Log.e(e.getMessage(), "转换失败");
  64. return null;
  65. }finally {
  66. try {
  67. is.close();
  68. }catch (Exception e){
  69. e.printStackTrace();
  70. Log.e(e.getMessage(),"关闭失败");
  71. }
  72. }
  73. }
  74. }

接口采用:http://wthrcdn.etouch.cn/weather_mini?citykey=101010100

101010100为城市的代码。

发送http请求,得到json数据


得到json数据后再进行解析得到数据bean

代码如下:

  1. package com.weather.utils;
  2. import android.util.Log;
  3. import com.weather.bean.DayWeatherInfo;
  4. import com.weather.bean.WeatherInfo;
  5. import org.json.JSONArray;
  6. import org.json.JSONObject;
  7. import java.util.ArrayList;
  8. import java.util.List;
  9. /**
  10. * Created by Administrator on 2016/4/19.
  11. */
  12. public class JsonUtils {
  13. private String city;//城市名
  14. private String aqi;//城市id
  15. private String wendu;//温度
  16. private String ganmao;//风向
  17. private String forecast;//各星期数据
  18. private String yesterday;//昨天数据
  19. public static WeatherInfo getWeatherInfo(String key,String jsonData){
  20. try {
  21. JSONObject jsonObject = new JSONObject(jsonData);
  22. JSONObject jsonWeather = jsonObject.getJSONObject(key);
  23. WeatherInfo weatherInfo = new WeatherInfo();
  24. weatherInfo.setCity(jsonWeather.getString("city"));
  25. //weatherInfo.setAqi(jsonWeather.getString("aqi"));//有些没有此项数据
  26. weatherInfo.setGanmao(jsonWeather.getString("ganmao"));
  27. weatherInfo.setWendu(jsonWeather.getString("wendu"));
  28. JSONArray jsonDayWeahers = jsonWeather.getJSONArray("forecast");
  29. List<DayWeatherInfo> dayWeatherInfos = new ArrayList<DayWeatherInfo>();
  30. for(int i=0;i<jsonDayWeahers.length();i++){
  31. JSONObject obj = jsonDayWeahers.getJSONObject(i);
  32. DayWeatherInfo dayWeatherInfo = new DayWeatherInfo();
  33. /* [{"fengxiang":"无持续风向","fengli":"微风级","high":"高温 15℃","type":"阴","low":"低温 9℃","date":"19日星期二"},*/
  34. dayWeatherInfo.setFengxiang(obj.getString("fengxiang"));
  35. dayWeatherInfo.setFengli(obj.getString("fengli"));
  36. dayWeatherInfo.setHigh(obj.getString("high"));
  37. dayWeatherInfo.setLow(obj.getString("low"));
  38. dayWeatherInfo.setType(obj.getString("type"));
  39. dayWeatherInfo.setDate(obj.getString("date"));
  40. dayWeatherInfos.add(dayWeatherInfo);
  41. }
  42. weatherInfo.setForecast(dayWeatherInfos);
  43. JSONObject jsonObject1 = jsonWeather.getJSONObject("yesterday");
  44. /*{"fl":"3-4级","fx":"北风","high":"高温 21℃","type":"晴","low":"低温 8℃","date":"18日星期一"},*/
  45. DayWeatherInfo dayWeatherInfo = new DayWeatherInfo();
  46. dayWeatherInfo.setFengxiang(jsonObject1.getString("fx"));
  47. dayWeatherInfo.setFengli(jsonObject1.getString("fl"));
  48. dayWeatherInfo.setHigh(jsonObject1.getString("high"));
  49. dayWeatherInfo.setLow(jsonObject1.getString("low"));
  50. dayWeatherInfo.setType(jsonObject1.getString("type"));
  51. dayWeatherInfo.setDate(jsonObject1.getString("date"));
  52. weatherInfo.setYesterday(dayWeatherInfo);
  53. return weatherInfo;
  54. }catch (Exception e){
  55. e.printStackTrace();
  56. Log.e(e.toString(),"获取Json数据失败");
  57. return null;
  58. }
  59. }
  60. }

json数据的读取应该也没有什么难点,之前采用那个晚上推荐的天气接口一直读取不到数据,采用上面那个接口问题就解决了,不过读取的数据比较少,不过对于刚接触网络数据来说就可以了,了解的数据的一些基本处理知识,对于json的解读相对来说也是没有什么难点,都是封装好的东西。


现在说说作者在做这个天气预报中所遇到的几个难点:


第一个是,文字大小的变化,这程序中有一个拖动界面改变文字大小的操作,作者采用直接读取getTextSize()的方法,然后在用这个值去设置TextView的高度,结果出现了文字高度变大的问题,卡了一些时间,后来问了下同事,解决了问题

textView.setTextSize(TypedValue.COMPLEX_UNIT_PX,height);

采用TypedValue.COMPLEX_UNIT_PX这个参数后问题就解决


第二个难点就是拖动时的位置吸引问题,但拖动时会自动移到某一位置的操作,主要采用的是OnTouch方法,不过这个方法根ScrollView又有点冲突,所以在移出范围时停止这个监听方法设置为null 在范围内时在设置,这样就解决了冲突的问题。


第三个难点在于城市 名列表,不过作者还没有实现 城市名的查找问题,只是实现了列表的排序问题,实现的方法是 先下载一份城市和id的txt放入Asserts当中,这样才启动的时候 放入List集合但中,当然读取txt的文件比较久,要放入到子线程当中去。然后在往集合当中加入英文大写字母集合,然后进行排序。关于中文转换成拼音的方法,采用网上大神的方法。


主要的布局方式说明:

主要是一个ScrollView嵌套一个Viewpager这样就实现了既可以左右滚动和上下移动的体验,具体实现方法看源码中。



免费下载,献上源码地址:

http://download.csdn.net/detail/wduj123/9508500

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家小花儿/article/detail/590008
推荐阅读
相关标签
  

闽ICP备14008679号