接口地址
夜神模拟器参数设置
- 点击分辨率设置,选择自定义
-
设置宽:1200 高:800 dpi:120,然后重启
效果图如下:
夜神模拟器设置
一. 创建一个新工程
- 分别创建adapter,bean,fragment,utils, View 五个子包,方便管
- 添加架包 gson-2.8.0.jar , MPAndroidChart-v3.0.3.jar
- 编写网络请求
- 在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);
}
二.生活助手布局编写
-
素材准备, 将以下七张图片拷贝到app\src\main\res\mipmap-hdpi目录下去
素材 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>
- 第二部分布局编写
<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>
- 第三部分布局编写及指示器样式编写
- 指示器样式编写,在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>
三. 第一部功能实现
- 在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;
}
}
- 在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;
}
}
}
- 在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" />
测试效果如下:
第一部分功能效果图
四.第二部分功能实现
- 在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;
}
}
- 声明 在MainActivity中声明定时器
private Timer timer;
- 在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);
}
}
- 在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) {
}
});
}
- 题目要求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();
}
- 测试第二部分功能模块,效果图如下:
第二部分功能模块效果图
五. 第三部分功能实现
- 在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();
}
}
- 编写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();
}
- 编写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();
}
}
- 编写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();
}
}
- 编写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();
}
}
- 在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));
}
- 在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;
}
}
- 在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) {
}
});
}
- 在MainActivity onCreate中调用initDate方法
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
initDate();
}
- 测试第三部分功能模块,效果图如下
效果图一
效果图二