生活助手功能实现

接口地址

http://www.cczn.red:8088/transportservice/swagger-ui.html

夜神模拟器参数设置

  • 点击分辨率设置,选择自定义
  • 设置宽:1200 高:800 dpi:120,然后重启
    效果图如下:


    夜神模拟器设置

一. 创建一个新工程

  1. 分别创建adapter,bean,fragment,utils, View 五个子包,方便管
  2. 添加架包 gson-2.8.0.jar , MPAndroidChart-v3.0.3.jar
  3. 编写网络请求
  • 在utils包下创建HttpUtil类,接口CallBlack
//HttpUtil类代码
public class HttpUtil {
   public static void post(final Context context, final String url, final JSONObject object, final CallBlack black){      
       //在子线程中进行网络请求
       new Thread(new Runnable() {
           @Override
           public void run() {
               String ip = context.getSharedPreferences("ipset", Context.MODE_PRIVATE).getString("ip","www.cczn.red");
               String u = "http://"+ip+":8088/transportservice/action/"+url;
               String user = context.getSharedPreferences("ipset", Context.MODE_PRIVATE).getString("username","user1");
               InputStream in = null;
               OutputStream out = null;
               StringBuffer buffer = null;
               try {
                   buffer = new StringBuffer();
                   URL url1 = new URL(u);
                   HttpURLConnection connection = (HttpURLConnection)url1.openConnection();
                   connection.setDoInput(true);
                   connection.setDoOutput(true);
                   connection.setRequestMethod("POST");
                   connection.setConnectTimeout(6000);
                   connection.setReadTimeout(6000);
                   connection.setRequestProperty("Content-type","application/json;charset=UTF-8");

                   object.put("UserName",user);
                   out = connection.getOutputStream();
                   out.write(object.toString().getBytes());
                   out.flush();

                   int code = connection.getResponseCode();
                   if(code == 200){
                       in = connection.getInputStream();
                       byte b[] = new byte[1024];
                       int a = -1;
                       while ((a = in.read(b))!=-1){
                           String str = new String(b,0,a);
                           buffer.append(str);
                       }
                       black.onSuccess(buffer.toString());
                   }else if(code == 500){
                       in = connection.getErrorStream();
                       byte b[] = new byte[1024];
                       int a = -1;
                       while ((a = in.read(b))!=-1){
                           String str = new String(b,0,a);
                           buffer.append(str);
                       }
                       black.onSuccess(buffer.toString());
                   }

               } catch (MalformedURLException e) {
                   e.printStackTrace();
                   black.onFail(e.toString());
               } catch (IOException e) {
                   e.printStackTrace();
                   black.onFail(e.toString());
               } catch (JSONException e) {
                   e.printStackTrace();
                   black.onFail(e.toString());
               }finally {
                   if(in!=null){
                       try {
                           in.close();
                       } catch (IOException e) {
                           e.printStackTrace();
                       }
                   }
                   if(out!=null){
                       try {
                           out.close();
                       } catch (IOException e) {
                           e.printStackTrace();
                       }
                   }
               }
           }
       }).start();

   }
}
//回调接口
public interface CallBlack {
    void onSuccess(String json);
    void onFail(String e);
}

二.生活助手布局编写

  1. 素材准备, 将以下七张图片拷贝到app\src\main\res\mipmap-hdpi目录下去


    素材
  2. activity_main.xml 整体框架,以及第一部分编写

  • 标题栏编写
<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="60dp"
    android:background="@mipmap/bg_title">
     <TextView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:gravity="center"
        android:textSize="40dp"
        android:text="生活助手"/>
</LinearLayout>
  • 第一部分布局编写
<LinearLayout
   android:layout_width="match_parent"
   android:layout_height="0dp"
   android:orientation="horizontal"
   android:layout_weight="2">
   <LinearLayout
       android:layout_width="0dp"
       android:orientation="vertical"
       android:layout_weight="1"
       android:layout_height="match_parent">
       <TextView
           android:layout_width="match_parent"
           android:gravity="center"
           android:textSize="70sp"
           android:id="@+id/day_tem1"
           android:layout_weight="2"
           android:layout_height="0dp" />
       <TextView
           android:layout_width="match_parent"
           android:layout_height="60dp"
           android:text="xx"
           android:id="@+id/day_tem2"
           android:gravity="center"/>
   </LinearLayout>
   <Button
       android:id="@+id/tem_updata"
       android:layout_width="60dp"
       android:layout_height="60dp"
       android:layout_marginRight="40dp"
       android:background="@mipmap/icon105_1"/>
   <com.github.mikephil.charting.charts.LineChart
       android:layout_width="0dp"
       android:layout_weight="2"
       android:id="@+id/linchar_top"
       android:layout_height="match_parent"></com.github.mikephil.charting.charts.LineChart>
</LinearLayout>
  1. 第二部分布局编写

   <TextView
       android:layout_width="match_parent"
       android:paddingLeft="50dp"
       android:layout_height="60dp"
       android:text="今日生活指数"
       android:gravity="center|left"/>
   <LinearLayout
       android:layout_width="match_parent"
       android:layout_height="0dp"
       android:layout_weight="2">
       <LinearLayout
           android:layout_width="0dp"
           android:layout_weight="1"
           android:layout_margin="20dp"
           android:background="#daedff"
           android:layout_height="match_parent"
           android:orientation="horizontal">
           <LinearLayout
               android:layout_width="0dp"
               android:layout_weight="2"
               android:orientation="vertical"
               android:layout_height="match_parent">
               <ImageView
                   android:layout_marginTop="30dp"
                   android:layout_width="wrap_content"
                   android:layout_gravity="center"
                   android:src="@mipmap/icon101"
                   android:layout_height="60dp" />
               <TextView
                   android:gravity="center"
                   android:layout_width="match_parent"
                   android:layout_height="wrap_content"
                   android:textSize="20dp"
                   android:text="紫外线指数"/>
           </LinearLayout>
           <LinearLayout
               android:layout_width="0dp"
               android:layout_weight="3"
               android:orientation="vertical"
               android:paddingTop="30dp"
               android:layout_height="match_parent">
               <TextView
                   android:layout_width="match_parent"
                   android:layout_height="60dp"
                   android:id="@+id/zi_title"
                   android:gravity="center"
                   android:textSize="20dp"/>
               <TextView
                   android:layout_width="match_parent"
                   android:layout_height="wrap_content"
                   android:id="@+id/zi_content"
                   android:gravity="center"
                   android:textSize="15dp"/>
           </LinearLayout>
       </LinearLayout>
       <LinearLayout
           android:layout_width="0dp"
           android:layout_weight="1"
           android:layout_margin="20dp"
           android:background="#daedff"
           android:layout_height="match_parent"
           android:orientation="horizontal">
           <LinearLayout
               android:layout_width="0dp"
               android:layout_weight="2"
               android:orientation="vertical"
               android:layout_height="match_parent">
               <ImageView
                   android:layout_marginTop="30dp"
                   android:layout_width="wrap_content"
                   android:layout_gravity="center"
                   android:src="@mipmap/icon102"
                   android:layout_height="60dp" />
               <TextView
                   android:gravity="center"
                   android:layout_width="match_parent"
                   android:layout_height="wrap_content"
                   android:textSize="20dp"
                   android:text="感冒线指数"/>
           </LinearLayout>
           <LinearLayout
               android:layout_width="0dp"
               android:layout_weight="3"
               android:orientation="vertical"
               android:paddingTop="30dp"
               android:layout_height="match_parent">
               <TextView
                   android:layout_width="match_parent"
                   android:layout_height="60dp"
                   android:id="@+id/gan_title"
                   android:gravity="center"
                   android:textSize="20dp"/>
               <TextView
                   android:layout_width="match_parent"
                   android:layout_height="wrap_content"
                   android:id="@+id/gan_content"
                   android:gravity="center"
                   android:textSize="15dp"/>
           </LinearLayout>
       </LinearLayout>
       <LinearLayout
           android:layout_width="0dp"
           android:layout_weight="1"
           android:layout_margin="20dp"
           android:background="#daedff"
           android:layout_height="match_parent"
           android:orientation="horizontal">
           <LinearLayout
               android:layout_width="0dp"
               android:layout_weight="2"
               android:orientation="vertical"
               android:layout_height="match_parent">

               <ImageView
                   android:layout_marginTop="30dp"
                   android:layout_width="wrap_content"
                   android:layout_height="60dp"
                   android:layout_gravity="center"
                   android:src="@mipmap/icon103" />
               <TextView
                   android:gravity="center"
                   android:layout_width="match_parent"
                   android:layout_height="wrap_content"
                   android:textSize="20dp"
                   android:text="穿衣线指数"/>
           </LinearLayout>
           <LinearLayout
               android:layout_width="0dp"
               android:layout_weight="3"
               android:orientation="vertical"
               android:paddingTop="30dp"
               android:layout_height="match_parent">
               <TextView
                   android:layout_width="match_parent"
                   android:layout_height="60dp"
                   android:id="@+id/chuan_title"
                   android:gravity="center"
                   android:textSize="20dp"/>
               <TextView
                   android:layout_width="match_parent"
                   android:layout_height="wrap_content"
                   android:id="@+id/chuan_content"
                   android:gravity="center"
                   android:textSize="15dp"/>
           </LinearLayout>
       </LinearLayout>
       <LinearLayout
           android:layout_width="0dp"
           android:layout_weight="1"
           android:layout_margin="20dp"
           android:background="#daedff"
           android:layout_height="match_parent"
           android:orientation="horizontal">
           <LinearLayout
               android:layout_width="0dp"
               android:layout_weight="2"
               android:orientation="vertical"
               android:layout_height="match_parent">
               <ImageView
                   android:layout_marginTop="30dp"
                   android:layout_width="wrap_content"
                   android:layout_gravity="center"
                   android:src="@mipmap/icon104"
                   android:layout_height="60dp" />
               <TextView
                   android:gravity="center"
                   android:layout_width="match_parent"
                   android:layout_height="wrap_content"
                   android:textSize="20dp"
                   android:text="运动指数"/>
           </LinearLayout>
           <LinearLayout
               android:layout_width="0dp"
               android:layout_weight="3"
               android:orientation="vertical"
               android:paddingTop="30dp"
               android:layout_height="match_parent">
               <TextView

                   android:layout_width="match_parent"
                   android:layout_height="60dp"
                   android:id="@+id/yun_title"
                   android:gravity="center"
                   android:textSize="20dp"/>
               <TextView
                   android:layout_width="match_parent"
                   android:layout_height="wrap_content"
                   android:id="@+id/yun_content"
                   android:gravity="center"
                   android:textSize="15dp"/>
           </LinearLayout>
       </LinearLayout>
       <LinearLayout
           android:layout_width="0dp"
           android:layout_weight="1"
           android:layout_margin="20dp"
           android:background="#daedff"
           android:layout_height="match_parent"
           android:orientation="horizontal">
           <LinearLayout
               android:layout_width="0dp"
               android:layout_weight="2"
               android:orientation="vertical"
               android:layout_height="match_parent">
               <ImageView
                   android:layout_marginTop="30dp"
                   android:layout_width="wrap_content"
                   android:layout_gravity="center"
                   android:src="@mipmap/icon105"
                   android:layout_height="60dp" />
               <TextView
                   android:gravity="center"
                   android:layout_width="match_parent"
                   android:layout_height="wrap_content"
                   android:textSize="20dp"
                   android:text="空气污染指数"/>
           </LinearLayout>
           <LinearLayout
               android:layout_width="0dp"
               android:layout_weight="3"
               android:orientation="vertical"
               android:paddingTop="30dp"
               android:layout_height="match_parent">
               <TextView
                   android:layout_width="match_parent"
                   android:layout_height="60dp"
                   android:id="@+id/kong_title"
                   android:gravity="center"
                   android:textSize="20dp"/>
               <TextView
                   android:layout_width="match_parent"
                   android:layout_height="wrap_content"
                   android:id="@+id/kong_content"
                   android:gravity="center"
                   android:textSize="15dp"/>
           </LinearLayout>
       </LinearLayout>
   </LinearLayout>
   
  1. 第三部分布局编写及指示器样式编写
  • 指示器样式编写,在drawable文件夹下创建edit.xml
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<solid android:color="#fff"></solid>
    <stroke android:color="#000" android:width="1dp"></stroke>
</shape>

  • 第三部分布局编写
  <TextView
        android:layout_width="match_parent"
        android:layout_height="60dp"
        android:paddingLeft="50dp"
        android:gravity="center|left"
        android:text="景点天气实况"/>
   <androidx.viewpager.widget.ViewPager
        android:id="@+id/viewpage_sheng"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="4"></androidx.viewpager.widget.ViewPager>
    <LinearLayout
        android:layout_width="wrap_content"
        android:layout_height="60dp"
        android:layout_gravity="center">
        <TextView
            android:layout_width="130dp"
            android:layout_height="60dp"
            android:layout_marginLeft="10dp"
            android:background="@drawable/edit"
            android:text="空气质量"
            android:gravity="center"
            android:id="@+id/pm_t1"
            android:layout_marginRight="10dp"/>
        <TextView
            android:layout_width="130dp"
            android:layout_height="60dp"
            android:layout_marginLeft="10dp"
            android:background="@drawable/edit"
            android:text="温度"
            android:gravity="center"
            android:id="@+id/tem_t1"
            android:layout_marginRight="10dp"/>
        <TextView
            android:layout_width="130dp"
            android:layout_height="60dp"
            android:layout_marginLeft="10dp"
            android:background="@drawable/edit"
            android:text="相对湿度"
            android:gravity="center"
            android:id="@+id/hum_t1"
            android:layout_marginRight="10dp"/>
        <TextView
            android:layout_width="130dp"
            android:layout_height="60dp"
            android:layout_marginLeft="10dp"
            android:background="@drawable/edit"
            android:text="二氧化碳"
            android:gravity="center"
            android:id="@+id/co_t1"
            android:layout_marginRight="10dp"/>
    </LinearLayout>

三. 第一部功能实现

  1. 在bean包下创建Weather类
public class Weather {
    public static List<Weather> getWeatherFromData(String str) {
        Type listType = new TypeToken<ArrayList<Weather>>() {
        }.getType();
        return new Gson().fromJson(str, listType);
    }
        public String temperature;
        public String wdata;
        public String type;

    public String getTemperature() {
        return temperature;
    }

    public void setTemperature(String temperature) {
        this.temperature = temperature;
    }

    public String getWdata() {
        return wdata;
    }

    public void setWdata(String wdata) {
        this.wdata = wdata;
    }

    public String getType() {
        return type;
    }

    public void setType(String type) {
        this.type = type;
    }

    public Weather(String temperature, String wdata, String type) {
        this.temperature = temperature;
        this.wdata = wdata;
        this.type = type;
    }
}

  1. 在MainActivity类中绑定控件
public class MainActivity extends AppCompatActivity implements View.OnClickListener {

    private TextView day_tem1;
    private TextView day_tem2;
    private Button tem_updata;
    private LineChart linchar_top;
    private TextView zi_title;
    private TextView zi_content;
    private TextView gan_title;
    private TextView gan_content;
    private TextView chuan_title;
    private TextView chuan_content;
    private TextView yun_title;
    private TextView yun_content;
    private TextView kong_title;
    private TextView kong_content;
    private ViewPager viewpage_sheng;
    private TextView pm_t1;
    private TextView tem_t1;
    private TextView hum_t1;
    private TextView co_t1;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        initView();
    }

    private void initView() {
        day_tem1 = (TextView) findViewById(R.id.day_tem1);
        day_tem2 = (TextView) findViewById(R.id.day_tem2);
        tem_updata = (Button) findViewById(R.id.tem_updata);
        linchar_top = (LineChart) findViewById(R.id.linchar_top);
        zi_title = (TextView) findViewById(R.id.zi_title);
        zi_content = (TextView) findViewById(R.id.zi_content);
        gan_title = (TextView) findViewById(R.id.gan_title);
        gan_content = (TextView) findViewById(R.id.gan_content);
        chuan_title = (TextView) findViewById(R.id.chuan_title);
        chuan_content = (TextView) findViewById(R.id.chuan_content);
        yun_title = (TextView) findViewById(R.id.yun_title);
        yun_content = (TextView) findViewById(R.id.yun_content);
        kong_title = (TextView) findViewById(R.id.kong_title);
        kong_content = (TextView) findViewById(R.id.kong_content);
        viewpage_sheng = (ViewPager) findViewById(R.id.viewpage_sheng);
        pm_t1 = (TextView) findViewById(R.id.pm_t1);
        tem_t1 = (TextView) findViewById(R.id.tem_t1);
        hum_t1 = (TextView) findViewById(R.id.hum_t1);
        co_t1 = (TextView) findViewById(R.id.co_t1);

        tem_updata.setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.tem_updata:

                break;
        }
    }
}
  1. 在MainActivity类中,声明日期格式化,折线图strings x轴数据, entries, entries1 y轴数据
 
    private List<Entry> entries=new ArrayList<>();
    private List<Entry> entries1=new ArrayList<>();
    private List<String> strings=new ArrayList<>();
    private SimpleDateFormat format=new SimpleDateFormat("EEEE");
    private SimpleDateFormat format1=new SimpleDateFormat("yyyy-MM-dd");

  • 在MainActivity类中编写upweather方法,用于请求天气数据与更新第一部分的布局数据

    //更新天气
    private void upweather(){
        HttpUtil.post(MainActivity.this, "GetWeather.do", new JSONObject(), new CallBlack() {
            @Override
            public void onSuccess(String json) {
                try {
                    final List<Weather> weathers=Weather.getWeatherFromData(new JSONObject(json).getString("ROWS_DETAIL"));
                    if (weathers.size()>1){
                        runOnUiThread(new Runnable() {
                            @Override
                            public void run() {
                                String[] split = weathers.get(0).getTemperature().split("~");
                                int minTem = Integer.parseInt(split[0]);
                                int maxTem=Integer.parseInt(split[1]);
                                day_tem1.setText((minTem+maxTem)/2+"°");
                                day_tem2.setText("今天:"+weathers.get(1).getTemperature()+"℃");
                                strings.clear();
                                entries.clear();
                                entries1.clear();
                                for (int i=0;i<weathers.size();i++){
                                    String str[]=weathers.get(i).getTemperature().split("~");
                                    entries.add(new Entry(i,Integer.valueOf(str[0])));
                                    entries1.add(new Entry(i,Integer.valueOf(str[1])));
                                }
                                strings.add("昨天");
                                strings .add("今天");
                                strings.add("明天");

                                try {
                                    strings.add(format.format(format1.parse(weathers.get(3).getWdata())).replace("星期","周"));
                                    strings.add(format.format(format1.parse(weathers.get(4).getWdata())).replace("星期","周"));
                                    strings.add(format.format(format1.parse(weathers.get(5).getWdata())).replace("星期","周"));
                                    LineDataSet dataSet=new LineDataSet(entries,"");
                                    LineDataSet dataSet1=new LineDataSet(entries1,"");
                                    XAxis xAxis=linchar_top.getXAxis();
                                    xAxis.setLabelCount(6);
                                    xAxis.setGranularity(1f);
                                    xAxis.setValueFormatter(new IAxisValueFormatter() {
                                        @Override
                                        public String getFormattedValue(float v, AxisBase axisBase) {
                                            return strings.get((int)v);
                                        }
                                    });
                                    Legend legend=linchar_top.getLegend();
                                    legend.setEnabled(false);
                                    Description description=linchar_top.getDescription();
                                    description.setEnabled(false);

                                    dataSet.setDrawCircleHole(false);
                                    dataSet1.setDrawCircleHole(false);
                                    dataSet.setColor(Color.parseColor("#2196F3"));
                                    dataSet.setCircleSize(3);
                                    dataSet.setCircleColor(Color.parseColor("#2196F3"));
                                    dataSet1.setColor(Color.parseColor("#FF9800"));
                                    dataSet1.setCircleSize(3);
                                    dataSet1.setCircleColor(Color.parseColor("#FF9800"));
                                    LineData data=new LineData(dataSet,dataSet1);
                                    linchar_top.getXAxis().setTextSize(50);
                                    linchar_top.setExtraTopOffset(10);
                                    linchar_top.getAxisLeft().setDrawAxisLine(false);
                                    linchar_top.getAxisRight().setDrawAxisLine(false);
                                    //不绘制x轴
                                    linchar_top.getXAxis().setDrawAxisLine(false);
                                    //不绘制x轴网格
                                    linchar_top.getXAxis().setDrawGridLines(false);
                                    linchar_top.setData(data);
                                    linchar_top.invalidate();
                                } catch (ParseException e) {
                                    e.printStackTrace();
                                }
                            }
                        });
                    }
                } catch (JSONException e) {
                    e.printStackTrace();
                }
            }

            @Override
            public void onFail(String e) {

            }
        });
    }
  • 重写MainActivity的onResume方法,在onResume里调用upweater()方法,使界面打开时获取天气数据
   @Override
    protected void onResume() {
        upweather();
        super.onResume();
    }

  • 实现点击刷新按钮,更新天气的功能,在onClick方法中,监听id是tem_updata的点击事件,然后调用upweather()方法

    @Override
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.tem_updata:
                upweather();
                break;
        }
    }

  • 测试第一部分功能 修改styles.xml
<resources>
    <!-- Base application theme. -->
    <style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
        <!-- Customize your theme here. -->
        <item name="colorPrimary">@color/colorPrimary</item>
        <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
        <item name="colorAccent">@color/colorAccent</item>
    </style>

</resources>

添加网络权限,在 AndroidManifest.xml中添加

    <uses-permission android:name="android.permission.INTERNET" />

测试效果如下:


第一部分功能效果图

四.第二部分功能实现

  1. 在bean包下创建Sens类
public class Sens {
  @SerializedName("pm2.5")
  public int _$Pm25115; // FIXME check this code
  public int co2;
  public int LightIntensity;
  public int humidity;
  public int temperature;

  public Sens(int _$Pm25115, int co2, int lightIntensity, int humidity, int temperature) {
      this._$Pm25115 = _$Pm25115;
      this.co2 = co2;
      LightIntensity = lightIntensity;
      this.humidity = humidity;
      this.temperature = temperature;
  }

  public int get_$Pm25115() {
      return _$Pm25115;
  }

  public void set_$Pm25115(int _$Pm25115) {
      this._$Pm25115 = _$Pm25115;
  }

  public int getCo2() {
      return co2;
  }

  public void setCo2(int co2) {
      this.co2 = co2;
  }

  public int getLightIntensity() {
      return LightIntensity;
  }

  public void setLightIntensity(int lightIntensity) {
      LightIntensity = lightIntensity;
  }

  public int getHumidity() {
      return humidity;
  }

  public void setHumidity(int humidity) {
      this.humidity = humidity;
  }

  public int getTemperature() {
      return temperature;
  }

  public void setTemperature(int temperature) {
      this.temperature = temperature;
  }
}

  1. 声明 在MainActivity中声明定时器
    private Timer timer;

  1. 在MainActivity中编写upview方法 更新生活指数模块
   public  void  upview(Sens sens){
        int zi1=sens.getLightIntensity();
        int gan=sens.getTemperature();
        int chuan=sens.getTemperature();
        int yun=sens.getCo2();
        int kong=sens.get_$Pm25115();
        if (zi1<1000){
            zi_title.setText("弱("+zi1+")");
            zi_content.setText("辐射较弱,涂擦SPF12~15、PA+护肤品");
        }
        if (zi1>=1000&&zi1<=3000){
            zi_title.setText("中等("+zi1+")");
            zi_content.setText("涂擦 SPF 大于 15,PA+防晒护肤品");
        }
        if (zi1>3000){
            zi_title.setText("强("+zi1+")");
            zi_content.setText("尽量减少外出,需要涂抹高倍数防晒霜");
        }
        if (gan<8){
            gan_title.setText("较易发("+gan+")");
           gan_content.setText("温度低,风较大,较易发生感冒,注意防护");
        }
        if (gan>=8){
            gan_title.setText("少发("+gan+")");
            gan_content.setText("无明显降温,感冒机率较低");
        }
        if (chuan<12){
            chuan_title.setText("冷("+chuan+")");
            chuan_content.setText("建议穿长袖衬衫、单裤等服装\n");
        }
        if (chuan>=12&&chuan<=21){
            chuan_title.setText("舒适("+chuan+")");
            chuan_content.setText("建议穿短袖衬衫、单裤等服装");
        }
        if (chuan>21){
            chuan_title.setText("热("+chuan+")");
            chuan_content.setText("适合穿 T 恤、短薄外套等夏季服装");
        }
        if (yun<3000){
            yun_title.setText("适宜("+yun+")");
            yun_content.setText("气候适宜,推荐您进行户外运动");
        }
        if (yun>=3000&&yun<=6000){
            yun_title.setText("中("+yun+")");
            yun_content.setText("易感人群应适当减少室外活动");
        }
        if (yun>6000){
            yun_title.setText("较不宜("+yun+")");
            yun_content.setText("空气氧气含量低,请在室内进行休闲运动");
        }
        if (kong<30){
            kong_title.setText("优("+kong+")");
            kong_content.setText("空气质量非常好,非常适合户外活动,趁机出去多呼吸新鲜空气");
        }
        if (kong>=30&&kong<=100){
            kong_title.setText("良("+kong+")");
            kong_content.setText("易感人群应适当减少室外活动");
        }
        if (kong>100){
            kong_title.setText("差("+kong+")");
            kong_content.setText("空气质量差,不适合户外活动");
        }
    }

4.在utils包下创建Query类,用于保存最近一分钟的环境数据

public class Query {
    private static  List<Sens>  sensList=new ArrayList<>();
    public  static List<Integer> getdata(String fixd) throws NoSuchFieldException, IllegalAccessException {
        List<Integer> integers=new ArrayList<>();
        for (Sens sens:sensList){
            integers.add(
                    Integer.parseInt(
                            String.valueOf(sens.getClass().getField(fixd).get(sens))
                    )
            );
        }
        return integers;
    }

    public  static  void addSens(Sens sens){
        if (sensList.size()>=20){
            sensList.remove(0);
        }
        sensList.add(sens);
    }

}

  1. 在MainActivity中updata方法 ,用于获取环境数据,以及调用Query.addSens()方法保存数据,以及调用upview()方法更新生活指数模块数据

      //保存一分钟内环境数据
    private void updata(){
        HttpUtil.post(MainActivity.this, "GetAllSense.do ", new JSONObject(), new CallBlack() {
            @Override
            public void onSuccess(String json) {
                final Sens sens = new Gson().fromJson(json, Sens.class);
                Query.addSens(sens);
                runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        upview(sens);
                    }
                });
            }

            @Override
            public void onFail(String e) {

            }
        });
    }

  1. 题目要求3秒更新一次,在MainActivity onResume方法中初始化定时器,然后定时器调用updata方法请求数据
    @Override
    protected void onResume() {
        upweater();
        timer=new Timer();
        timer.schedule(new TimerTask() {
            @Override
            public void run() {
                updata();
            }
        },0,3000);
        super.onResume();
    }

为了避免因为界面退出,定时器还在运行导致程序崩溃,需要重写onPause方法,然后清除定时器

    @Override
    protected void onPause() {
        timer.purge();
        timer.cancel();
        super.onPause();
    }
  1. 测试第二部分功能模块,效果图如下:
第二部分功能模块效果图

五. 第三部分功能实现

  1. 在adapter包下编写ViewPageAdpater
public class ViewPageAdpater extends FragmentPagerAdapter {
    List<Fragment> fragments;

    public ViewPageAdpater(FragmentManager fm, List<Fragment> fragments) {
        super(fm);
        this.fragments = fragments;
    }

    @Override
    public Fragment getItem(int position) {
        return fragments.get(position);
    }

    @Override
    public int getCount() {
        return fragments.size();
    }
}

  1. 编写fragment1.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical" android:layout_width="match_parent"
    android:layout_height="match_parent">
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:gravity="center"
        android:id="@+id/title_f"
        android:background="#8ACCCCCC"
        android:layout_gravity="right"
        android:text="11"/>
<com.github.mikephil.charting.charts.BarChart
    android:id="@+id/barchart1"
    android:layout_width="match_parent"
    android:layout_height="match_parent"></com.github.mikephil.charting.charts.BarChart>
</LinearLayout>

在fragment包下编写Fragment1类

public class Fragment1 extends Fragment {

    private TextView titleF;
    private BarChart barchart1;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        return inflater.inflate(R.layout.fragment1, null);
    }

    @Override
    public void onViewCreated(View view, Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);

        titleF = (TextView) view.findViewById(R.id.title_f);
        barchart1 = (BarChart) view.findViewById(R.id.barchart1);
    }
    
}

在Fragment1中声明定时器,entries y轴数据,strings x轴数据

    List<BarEntry> entries=new ArrayList<>();
    List<String> strings=new ArrayList<>();
    private Timer timer;

在layout中创建markerlayout.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="wrap_content"
    android:layout_height="wrap_content">
<TextView
    android:id="@+id/tvContent"
    android:layout_width="100dp"
    android:layout_height="40dp"
    android:gravity="center"
    android:background="#3C535050"/>
</LinearLayout>

在view包下创建MyMarkerView

public class MyMarkerView extends MarkerView {
    private TextView tvContent;
    public MyMarkerView(Context context, int layoutResource) {
        super(context, layoutResource);
        tvContent = (TextView) findViewById(R.id.tvContent);
        setOffset(30f,-40f);
    }

    @Override
    public void refreshContent(Entry e, Highlight highlight) {
        tvContent.setText("" + e.getY());
    }
}

在Fragment1 类中创建initview方法 绘制柱状图

  private void initview() throws NoSuchFieldException, IllegalAccessException {
        int num=0;
        entries.clear();
        strings.clear();
        List<Integer> integers=new ArrayList<>();
        integers.addAll(Query.getdata("_$Pm25115"));
        if (integers.size()>0){
          for (int i=0;i<integers.size();i++){
              if (num<integers.get(i)){
                  num=integers.get(i);
              }
              strings.add(String.valueOf((i+1)*3));
              entries.add(new BarEntry(i,integers.get(i)));
          }

          titleF.setText("过去一分钟空气质量最差值为:"+num);
            BarDataSet dataSet=new BarDataSet(entries,"");
            BarData data=new BarData(dataSet);
            XAxis xAxis=barchart1.getXAxis();
            xAxis.setLabelCount(20);
            xAxis.setGranularity(1f);
            xAxis.setValueFormatter(new IAxisValueFormatter() {
                @Override
                public String getFormattedValue(float v, AxisBase axisBase) {
                    if ((int)v==-1){
                        return strings.get(0);
                    }
                    if ((int)v==strings.size()){return strings.get((int)v-1);}
                    return strings.get((int)v);
                }
            });
            xAxis.setPosition(XAxis.XAxisPosition.BOTTOM);
            Legend legend=barchart1.getLegend();
            legend.setEnabled(false);
            Description description=barchart1.getDescription();

            barchart1.getAxisLeft().setDrawAxisLine(false);
            barchart1.getAxisRight().setDrawAxisLine(false);
            barchart1.getXAxis().setDrawAxisLine(false);
            barchart1.getXAxis().setDrawGridLines(false);
            MyMarkerView myMarkerView = new MyMarkerView(getContext(), R.layout.markerlayout);
            myMarkerView.setChartView(barchart1);
            barchart1.setMarker(myMarkerView);
            description.setEnabled(false);
            barchart1.setData(data);
            barchart1.invalidate();
        }
    }

在Fragment1 类中重写onResume onPause方法, 在onResume中初始化定时器,在onPause中清除定时器

    @Override
    public void onResume() {
        timer=new Timer();
        timer.schedule(new TimerTask() {
            @Override
            public void run() {
                getActivity().runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        try {
                            initview();
                        } catch (NoSuchFieldException e) {
                            e.printStackTrace();
                        } catch (IllegalAccessException e) {
                            e.printStackTrace();
                        }
                    }
                });
            }
        },0,3000);
        super.onResume();
    }
    
    @Override
    public void onPause() {
        timer.purge();
        timer.cancel();
        super.onPause();
    }

  1. 编写fragment2.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical" android:layout_width="match_parent"
    android:layout_height="match_parent">
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:gravity="center"
        android:id="@+id/title_f2"
        android:background="#8ACCCCCC"
        android:layout_gravity="right"
        android:text="11"/>
    <com.github.mikephil.charting.charts.LineChart
        android:layout_width="match_parent"
        android:id="@+id/linchar_1"
        android:layout_height="match_parent"></com.github.mikephil.charting.charts.LineChart>
</LinearLayout>

在fragment包下编写Fragment2类

public class Frament2 extends Fragment  {

    private TextView titleF2;
    private LineChart linchar1;
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        return inflater.inflate(R.layout.fragment2, null);
    }

    @Override
    public void onViewCreated(View view, Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);

        titleF2 = (TextView) view.findViewById(R.id.title_f2);
        linchar1 = (LineChart) view.findViewById(R.id.linchar_1);
    }
   
}

在Fragment2中声明定时器,entries y轴数据,strings x轴数据

    List<Entry> entries=new ArrayList<>();
    List<String> strings=new ArrayList<>();
    private Timer timer;

在Fragment2 类中创建initview方法 绘制折线图

   private void initview() throws NoSuchFieldException, IllegalAccessException {
        int max=0;
        int min=100;
        entries.clear();
        strings.clear();
        List<Integer> integers=new ArrayList<>();
        integers.addAll(Query.getdata("temperature"));
        if (integers.size()>0){
            for (int i=0;i<integers.size();i++){
                if (max<integers.get(i)){
                    max=integers.get(i);
                }if (min>integers.get(i)){
                    min=integers.get(i);
                }
                strings.add(String.valueOf((i+1)*3));
                entries.add(new BarEntry(i,integers.get(i)));
            }
            titleF2.setText("过去一分钟最高气温:"+max+"℃"+"  最低温度"+min+"℃");
            LineDataSet dataSet=new LineDataSet(entries,"");
            LineData data=new LineData(dataSet);
            XAxis xAxis=linchar1.getXAxis();
            xAxis.setPosition(XAxis.XAxisPosition.BOTTOM);
            xAxis.setLabelCount(20);
            xAxis.setGranularity(1f);

                xAxis.setValueFormatter(new IAxisValueFormatter() {
                    @Override
                    public String getFormattedValue(float v, AxisBase axisBase) {
                        if ((int)v==-1){
                            return strings.get(0);
                        }
                        if ((int)v==strings.size()){return strings.get((int)v-1);}
                        return strings.get((int)v);
                    }
                });

            Legend legend=linchar1.getLegend();
            legend.setEnabled(false);
            Description description=linchar1.getDescription();
            description.setEnabled(false);
            linchar1.getAxisLeft().setDrawAxisLine(false);
            linchar1.getAxisRight().setDrawAxisLine(false);
            linchar1.getXAxis().setDrawAxisLine(false);
            linchar1.getXAxis().setDrawGridLines(false);
            linchar1.setData(data);
            linchar1.invalidate();
        }
    }
  1. 编写fragment3
  • 复制fragment2 ,然后修改initview方法
 private void initview() throws NoSuchFieldException, IllegalAccessException {
        int max=0;
        int min=100;
        entries.clear();
        strings.clear();
        List<Integer> integers=new ArrayList<>();
        integers.addAll(Query.getdata("humidity"));
        if (integers.size()>0){
            for (int i=0;i<integers.size();i++){
                if (max<integers.get(i)){
                    max=integers.get(i);
                }if (min>integers.get(i)){
                    min=integers.get(i);
                }
                strings.add(String.valueOf((i+1)*3));
                entries.add(new BarEntry(i,integers.get(i)));
            }
            titleF2.setText("过去一分钟最大相对湿度:"+max+"%");
            LineDataSet dataSet=new LineDataSet(entries,"");
            LineData data=new LineData(dataSet);
            XAxis xAxis=linchar1.getXAxis();
            xAxis.setPosition(XAxis.XAxisPosition.BOTTOM);
            xAxis.setLabelCount(20);
            xAxis.setGranularity(1f);

                xAxis.setValueFormatter(new IAxisValueFormatter() {
                    @Override
                    public String getFormattedValue(float v, AxisBase axisBase) {
                        if ((int)v==-1){
                            return strings.get(0);
                        }
                        if ((int)v==strings.size()){return strings.get((int)v-1);}
                        return strings.get((int)v);
                    }
                });

            Legend legend=linchar1.getLegend();
            legend.setEnabled(false);
            Description description=linchar1.getDescription();
            description.setEnabled(false);
            linchar1.getAxisLeft().setDrawAxisLine(false);
            linchar1.getAxisRight().setDrawAxisLine(false);
            linchar1.getXAxis().setDrawAxisLine(false);
            linchar1.getXAxis().setDrawGridLines(false);
            linchar1.setData(data);
            linchar1.invalidate();
        }
    }

  1. 编写fragment4
  • 复制fragment3 ,然后修改initview方法
  private void initview() throws NoSuchFieldException, IllegalAccessException {
        int max=0;
        int min=100;
        entries.clear();
        strings.clear();
        List<Integer> integers=new ArrayList<>();
        integers.addAll(Query.getdata("co2"));
        if (integers.size()>0){
            for (int i=0;i<integers.size();i++){
                if (max<integers.get(i)){
                    max=integers.get(i);
                }if (min>integers.get(i)){
                    min=integers.get(i);
                }
                strings.add(String.valueOf((i+1)*3));
                entries.add(new BarEntry(i,integers.get(i)));
            }
            titleF2.setText("过去一分钟最大相对浓度:"+max+"");
            LineDataSet dataSet=new LineDataSet(entries,"");
            LineData data=new LineData(dataSet);
            XAxis xAxis=linchar1.getXAxis();
            xAxis.setPosition(XAxis.XAxisPosition.BOTTOM);
            xAxis.setLabelCount(20);
            xAxis.setGranularity(1f);

                xAxis.setValueFormatter(new IAxisValueFormatter() {
                    @Override
                    public String getFormattedValue(float v, AxisBase axisBase) {
                        if ((int)v==-1){
                            return strings.get(0);
                        }
                        if ((int)v==strings.size()){return strings.get((int)v-1);}
                        return strings.get((int)v);
                    }
                });

            Legend legend=linchar1.getLegend();
            legend.setEnabled(false);
            Description description=linchar1.getDescription();
            description.setEnabled(false);
            linchar1.getAxisLeft().setDrawAxisLine(false);
            linchar1.getAxisRight().setDrawAxisLine(false);
            linchar1.getXAxis().setDrawAxisLine(false);
            linchar1.getXAxis().setDrawGridLines(false);
            linchar1.setData(data);
            linchar1.invalidate();
        }
    }
  1. 在MainActivity中创建initDate()方法,给ViewPager添加数据,
    private void initDate() {
        List<Fragment>  fragments=new ArrayList<>();
        fragments.add(new Fragment1());
        fragments.add(new Fragment2());
        fragments.add(new Fragment3());
        fragments.add(new Fragment4());
        viewpage_sheng.setAdapter(new ViewPageAdpater(getSupportFragmentManager(),fragments));
    }

  1. 在MainActivity中创建setview方法
    //切换ViewPage 指示器
    public void  setview(int id){
        hum_t1.setBackgroundColor(Color.WHITE);
        tem_t1.setBackgroundColor(Color.WHITE);
        pm_t1.setBackgroundColor(Color.WHITE);
        co_t1.setBackgroundColor(Color.WHITE);
        switch (id){
            case 0:pm_t1.setBackgroundResource(R.drawable.edit);break;
            case 1:tem_t1.setBackgroundResource(R.drawable.edit);break;
            case 2:hum_t1.setBackgroundResource(R.drawable.edit);break;
            case 3:co_t1.setBackgroundResource(R.drawable.edit);break;
        }
    }

  1. 在initDate方法中初始化ViewPage 指示器, 以及给ViewPager设置addOnPageChangeListener,然后在onPageSelected方法中调用setview方法
    private void initDate() {
        List<Fragment>  fragments=new ArrayList<>();
        fragments.add(new Fragment1());
        fragments.add(new Fragment2());
        fragments.add(new Fragment3());
        fragments.add(new Fragment4());
        viewpage_sheng.setAdapter(new ViewPageAdpater(getSupportFragmentManager(),fragments));

        viewpage_sheng.setCurrentItem(0);//初始化当前位置为第一个
        setview(0);
        viewpage_sheng.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
            @Override
            public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {

            }

            @Override
            public void onPageSelected(int position) {
                setview(position);
            }

            @Override
            public void onPageScrollStateChanged(int state) {

            }
        });
    }

  1. 在MainActivity onCreate中调用initDate方法
   @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        initView();
        initDate();
    }
  1. 测试第三部分功能模块,效果图如下
效果图一

效果图二
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 220,367评论 6 512
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,959评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 166,750评论 0 357
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,226评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,252评论 6 397
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,975评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,592评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,497评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 46,027评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,147评论 3 340
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,274评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,953评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,623评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,143评论 0 23
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,260评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,607评论 3 375
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,271评论 2 358