return air_now_city;
}
public void setAir_now_city(AirNowCityBean air_now_city) {
this.air_now_city = air_now_city;
}
public List getAir_now_station() {
return air_now_station;
}
public void setAir_now_station(List air_now_station) {
this.air_now_station = air_now_station;
}
public static class BasicBean {
/**
-
cid : CN101280601
-
location : 深圳
-
parent_city : 深圳
-
admin_area : 广东
-
cnty : 中国
-
lat : 22.54700089
-
lon : 114.08594513
-
tz : +8.00
*/
private String cid;
private String location;
private String parent_city;
private String admin_area;
private String cnty;
private String lat;
private String lon;
private String tz;
public String getCid() {
return cid;
}
public void setCid(String cid) {
this.cid = cid;
}
public String getLocation() {
return location;
}
public void setLocation(String location) {
this.location = location;
}
public String getParent_city() {
return parent_city;
}
public void setParent_city(String parent_city) {
this.parent_city = parent_city;
}
public String getAdmin_area() {
return admin_area;
}
public void setAdmin_area(String admin_area) {
this.admin_area = admin_area;
}
public String getCnty() {
return cnty;
}
public void setCnty(String cnty) {
this.cnty = cnty;
}
public String getLat() {
return lat;
}
public void setLat(String lat) {
this.lat = lat;
}
public String getLon() {
return lon;
}
public void setLon(String lon) {
this.lon = lon;
}
public String getTz() {
return tz;
}
public void setTz(String tz) {
this.tz = tz;
}
}
public static class UpdateBean {
/**
-
loc : 2020-04-30 10:27
-
utc : 2020-04-30 02:27
*/
private String loc;
private String utc;
public String getLoc() {
return loc;
}
public void setLoc(String loc) {
this.loc = loc;
}
public String getUtc() {
return utc;
}
public void setUtc(String utc) {
this.utc = utc;
}
}
public static class AirNowCityBean {
/**
-
aqi : 47
-
qlty : 优
-
main : -
-
pm25 : 23
-
pm10 : 47
-
no2 : 28
-
so2 : 7
-
co : 0.6
-
o3 : 95
-
pub_time : 2020-04-30 09:00
*/
private String aqi;
private String qlty;
private String main;
private String pm25;
private String pm10;
private String no2;
private String so2;
private String co;
private String o3;
private String pub_time;
public String getAqi() {
return aqi;
}
public void setAqi(String aqi) {
this.aqi = aqi;
}
public String getQlty() {
return qlty;
}
public void setQlty(String qlty) {
this.qlty = qlty;
}
public String getMain() {
return main;
}
public void setMain(String main) {
this.main = main;
}
public String getPm25() {
return pm25;
}
public void setPm25(String pm25) {
this.pm25 = pm25;
}
public String getPm10() {
return pm10;
}
public void setPm10(String pm10) {
this.pm10 = pm10;
}
public String getNo2() {
return no2;
}
public void setNo2(String no2) {
this.no2 = no2;
}
public String getSo2() {
return so2;
}
public void setSo2(String so2) {
this.so2 = so2;
}
public String getCo() {
return co;
}
public void setCo(String co) {
this.co = co;
}
public String getO3() {
return o3;
}
public void setO3(String o3) {
this.o3 = o3;
}
public String getPub_time() {
return pub_time;
}
public void setPub_time(String pub_time) {
this.pub_time = pub_time;
}
}
public static class AirNowStationBean {
/**
-
air_sta : 通心岭子站
-
aqi : 43
-
asid : CNA1356
-
co : 0.6
-
lat : 22.5545
-
lon : 114.1063
-
main : -
-
no2 : 10
-
o3 : 104
-
pm10 : 43
-
pm25 : 23
-
pub_time : 2020-04-30 09:00
-
qlty : 优
-
so2 : 7
*/
private String air_sta;
private String aqi;
private String asid;
private String co;
private String lat;
private String lon;
private String main;
private String no2;
private String o3;
private String pm10;
private String pm25;
private String pub_time;
private String qlty;
private String so2;
public String getAir_sta() {
return air_sta;
}
public void setAir_sta(String air_sta) {
this.air_sta = air_sta;
}
public String getAqi() {
return aqi;
}
public void setAqi(String aqi) {
this.aqi = aqi;
}
public String getAsid() {
return asid;
}
public void setAsid(String asid) {
this.asid = asid;
}
public String getCo() {
return co;
}
public void setCo(String co) {
this.co = co;
}
public String getLat() {
return lat;
}
public void setLat(String lat) {
this.lat = lat;
}
public String getLon() {
return lon;
}
public void setLon(String lon) {
this.lon = lon;
}
public String getMain() {
return main;
}
public void setMain(String main) {
this.main = main;
}
public String getNo2() {
return no2;
}
public void setNo2(String no2) {
this.no2 = no2;
}
public String getO3() {
return o3;
}
public void setO3(String o3) {
this.o3 = o3;
}
public String getPm10() {
return pm10;
}
public void setPm10(String pm10) {
this.pm10 = pm10;
}
public String getPm25() {
return pm25;
}
public void setPm25(String pm25) {
this.pm25 = pm25;
}
public String getPub_time() {
return pub_time;
}
public void setPub_time(String pub_time) {
this.pub_time = pub_time;
}
public String getQlty() {
return qlty;
}
public void setQlty(String qlty) {
this.qlty = qlty;
}
public String getSo2() {
return so2;
}
public void setSo2(String so2) {
this.so2 = so2;
}
}
}
}
这个实体Bean的有很多返回值,关键数据在AirNowCityBean,这个里面对应的参数名和描述在下面这张表里,写的时候注意一下就可以了
| 参数 | 描述 | 示例 |
| — | — | — |
| pub_time | 数据发布时间,格式yyyy-MM-dd HH:mm | 2017-03-20 12:30 |
| aqi | 空气质量指数,AQI和PM25的关系 | 74 |
| main | 主要污染物 | pm25 |
| qlty | 空气质量,取值范围:优,良,轻度污染,中度污染,重度污染,严重污染,查看计算方式 | 良 |
| pm10 | pm10 | 78 |
| pm25 | pm25 | 66 |
| no2 | 二氧化氮 | 40 |
| so2 | 二氧化硫 | 30 |
| co | 一氧化碳 | 33 |
| o3 | 臭氧 | 20 |
接下来就是写API接口了,打开ApiService.java,在里面增加
这一步相信你已经很熟悉了吧,我就不过多的解释了,继续往下走。
接下来打开WeatherContract.java,里面增加空气质量数据的订阅
/**
-
空气质量数据
-
@param context
-
@param location
*/
public void airNowCity(final Context context,String location){
ApiService service = ServiceGenerator.createService(ApiService.class,0);
service.getAirNowCity(location).enqueue(new NetCallBack() {
@Override
public void onSuccess(Call call, Response response) {
if(getView() != null){
getView().getAirNowCityResult(response);
}
}
@Override
public void onFailed() {
if(getView() != null){
getView().getDataFailed();
}
}
});
}
//查询空气质量的数据返回
void getAirNowCityResult(Response response);
接下来是MainActivity.java
在定位返回的数据里面新增一个city的变量
然后有两个地方要进行赋值
①定位之后
②切换城市,点击市级列表的时候赋值
请求接口,修改三处地方,定位之后、下拉的时候、点击区/县的时候
修改activity_main.xml布局文件,放在七天天气预报的后面与风车的前面。
在修改布局之前,先自定义一个VIew,这个VIew并不是我自己写的,也是从网络上找的,只不过忘记出处了,因为这种东西网络上一大把,注释都在里面,其实就是一个圆环进度条,增加动画效果了,这种自定义View的代码和样式我都是放在mvplibrary下面的。
首先在style文件中创建样式
样式代码如下
然后创建这个View
代码如下:
package com.llw.mvplibrary.view;
import android.animation.ValueAnimator;
import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Rect;
import android.graphics.RectF;
import android.util.AttributeSet;
import android.view.View;
import androidx.annotation.Nullable;
import com.llw.mvplibrary.R;
public class RoundProgressBar extends View {
private int mStrokeWidth = dp2px(8);//圆弧的宽度
private float mStartAngle = 135;//圆弧开始的角度
private float mAngleSize = 270;//起点角度和终点角度对应的夹角大小
private int mArcBgColor;//圆弧背景颜色
private float mMaxProgress;//最大的进度,用于计算进度与夹角的比例
private float mCurrentAngleSize;//当前进度对应的起点角度到当前进度角度夹角的大小
private float mCurrentProgress = 0;//当前进度
private long mDuration = 2000;//动画的执行时长
private int mProgressColor;//进度圆弧的颜色
private String mFirstText = “0”;//第一行文本
private int mFirstTextColor = Color.WHITE;//第一行文本的颜色
private float mFirstTextSize = 56f;//第一行文本的字体大小
private String mSecondText = " ";//第二行文本
private int mSecondTextColor = Color.WHITE;//第二行文本的颜色
private float mSecondTextSize = 56f;//第二行文本的字体大小
private String mMinText = “0”;//进度最小值
private int mMinTextColor = Color.WHITE;//最小值文本的颜色
private float mMinTextSize = 32f;//最小值字体大小
private String mMaxText = “0”;//进度最大值
private int mMaxTextColor = Color.WHITE;//最大值文本的颜色
private float mMaxTextSize = 32f;//最大值字体大小
public RoundProgressBar(Context context) {
super(context, null);
}
public RoundProgressBar(Context context, @Nullable AttributeSet attrs) {
super(context, attrs, 0);
}
public RoundProgressBar(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
initAttr(context, attrs);
}
/**
-
设置初始化的参数
-
@param context
-
@param attrs
*/
private void initAttr(Context context, AttributeSet attrs) {
TypedArray array = context.obtainStyledAttributes(attrs, R.styleable.RoundProgressBar);
mMaxProgress = array.getFloat(R.styleable.RoundProgressBar_round_max_progress, 500f);
mArcBgColor = array.getColor(R.styleable.RoundProgressBar_round_bg_color, Color.YELLOW);
mStrokeWidth = dp2px(array.getDimension(R.styleable.RoundProgressBar_round_stroke_width, 12f));
mCurrentProgress = array.getFloat(R.styleable.RoundProgressBar_round_progress, 300f);
mProgressColor = array.getColor(R.styleable.RoundProgressBar_round_progress_color, Color.RED);
mFirstText = array.getString(R.styleable.RoundProgressBar_round_first_text);
mFirstTextSize = dp2px(array.getDimension(R.styleable.RoundProgressBar_round_first_text_size, 20f));
mFirstTextColor = array.getColor(R.styleable.RoundProgressBar_round_first_text_color, Color.RED);
mSecondText = array.getString(R.styleable.RoundProgressBar_round_second_text);
mSecondTextSize = dp2px(array.getDimension(R.styleable.RoundProgressBar_round_second_text_size, 20f));
mSecondTextColor = array.getColor(R.styleable.RoundProgressBar_round_second_text_color, Color.RED);
mMinText = array.getString(R.styleable.RoundProgressBar_round_min_text);
mMinTextSize = dp2px(array.getDimension(R.styleable.RoundProgressBar_round_min_text_size, 20f));
mMinTextColor = array.getColor(R.styleable.RoundProgressBar_round_min_text_color, Color.RED);
mMaxText = array.getString(R.styleable.RoundProgressBar_round_max_text);
mMaxTextSize = dp2px(array.getDimension(R.styleable.RoundProgressBar_round_max_text_size, 20f));
mMaxTextColor = array.getColor(R.styleable.RoundProgressBar_round_max_text_color, Color.RED);
mAngleSize = array.getFloat(R.styleable.RoundProgressBar_round_angle_size, 270f);
mStartAngle = array.getFloat(R.styleable.RoundProgressBar_round_start_angle, 135f);
array.recycle();
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
int centerX = getWidth() / 2;
RectF rectF = new RectF();
rectF.left = mStrokeWidth;
rectF.top = mStrokeWidth;
rectF.right = centerX * 2 - mStrokeWidth;
rectF.bottom = centerX * 2 - mStrokeWidth;
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数Android工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新
如果你觉得这些内容对你有帮助,可以添加V获取:vip204888 (备注Android)
最后
其实Android开发的知识点就那么多,面试问来问去还是那么点东西。所以面试没有其他的诀窍,只看你对这些知识点准备的充分程度。so,出去面试时先看看自己复习到了哪个阶段就好。
下图是我进阶学习所积累的历年腾讯、头条、阿里、美团、字节跳动等公司2019-2021年的高频面试题,博主还把这些技术点整理成了视频和PDF(实际上比预期多花了不少精力),包含知识脉络 + 诸多细节
整理不易,望各位看官老爷点个关注转发,谢谢!祝大家都能得到自己心仪工作。
一个人可以走的很快,但一群人才能走的更远。如果你从事以下工作或对以下感兴趣,欢迎戳这里加入程序员的圈子,让我们一起学习成长!
AI人工智能、Android移动开发、AIGC大模型、C C#、Go语言、Java、Linux运维、云计算、MySQL、PMP、网络安全、Python爬虫、UE5、UI设计、Unity3D、Web前端开发、产品经理、车载开发、大数据、鸿蒙、计算机网络、嵌入式物联网、软件测试、数据结构与算法、音视频开发、Flutter、IOS开发、PHP开发、.NET、安卓逆向、云计算
Ttuz-1712383126496)]
[外链图片转存中…(img-F7Squ3Xg-1712383126497)]
[外链图片转存中…(img-VOELRpaS-1712383126497)]
[外链图片转存中…(img-UmIuWQb0-1712383126497)]
[外链图片转存中…(img-2a4XzEMn-1712383126498)]
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新
如果你觉得这些内容对你有帮助,可以添加V获取:vip204888 (备注Android)
[外链图片转存中…(img-bbk7OrMD-1712383126498)]
最后
其实Android开发的知识点就那么多,面试问来问去还是那么点东西。所以面试没有其他的诀窍,只看你对这些知识点准备的充分程度。so,出去面试时先看看自己复习到了哪个阶段就好。
下图是我进阶学习所积累的历年腾讯、头条、阿里、美团、字节跳动等公司2019-2021年的高频面试题,博主还把这些技术点整理成了视频和PDF(实际上比预期多花了不少精力),包含知识脉络 + 诸多细节
[外链图片转存中…(img-xyouwbVz-1712383126499)]
整理不易,望各位看官老爷点个关注转发,谢谢!祝大家都能得到自己心仪工作。
一个人可以走的很快,但一群人才能走的更远。如果你从事以下工作或对以下感兴趣,欢迎戳这里加入程序员的圈子,让我们一起学习成长!
AI人工智能、Android移动开发、AIGC大模型、C C#、Go语言、Java、Linux运维、云计算、MySQL、PMP、网络安全、Python爬虫、UE5、UI设计、Unity3D、Web前端开发、产品经理、车载开发、大数据、鸿蒙、计算机网络、嵌入式物联网、软件测试、数据结构与算法、音视频开发、Flutter、IOS开发、PHP开发、.NET、安卓逆向、云计算