基于Android平台开辟,气候预报APP

一给  金牌会员 | 2024-7-11 11:11:18 | 显示全部楼层 | 阅读模式
打印 上一主题 下一主题

主题 542|帖子 542|积分 1626

1.项目功能思维导图


2. 项目涉及到的技能点


  • 数据来源:和风气候API
  • 利用okhttp网络请求框架获取api数据
  • 利用gson库剖析json数据
  • 利用RecyclerView+adapter实现未来7天列表展示和气候指数
  • 利用PopupMenu 实现弹出选项框
  • 利用动画+定时器实现接待页倒计时和logo动画
  • 利用TextToSpeech 实现语音播报
3.项目截图








4.部分代码功能实现


  • 接待页实现
  1. public class WelcomeActivity extends AppCompatActivity {
  2.     private TextView tvCountdown;
  3.     private CardView card_logo;
  4.     private CountDownTimer countDownTimer;
  5.     private long timeLeftInMillis = 1000; // 设置倒计时时长,单位为毫秒
  6.     @Override
  7.     protected void onCreate(Bundle savedInstanceState) {
  8.         super.onCreate(savedInstanceState);
  9.         setContentView(R.layout.activity_welcome);
  10.         //初始化控件
  11.         tvCountdown = findViewById(R.id.tv_countdown);
  12.         card_logo = findViewById(R.id.card_logo);
  13.         // 启动倒计时
  14.         startCountdown();
  15.         //实现logo缩放动画
  16.         startAnim();
  17.     }
  18.     private void startAnim() {
  19.         ViewCompat.animate(card_logo)
  20.                 .scaleX(1.0f)
  21.                 .scaleY(1.0f)
  22.                 .setDuration(1000)
  23.                 .setListener(new ViewPropertyAnimatorListener() {
  24.                     @Override
  25.                     public void onAnimationStart(View view) {
  26.                     }
  27.                     @Override
  28.                     public void onAnimationEnd(View view) {
  29.                     }
  30.                     @Override
  31.                     public void onAnimationCancel(View view) {
  32.                     }
  33.                 })
  34.                 .start();
  35.     }
  36.     private void startCountdown() {
  37.         countDownTimer = new CountDownTimer(timeLeftInMillis, 1000) {
  38.             @Override
  39.             public void onTick(long millisUntilFinished) {
  40.                 timeLeftInMillis = millisUntilFinished;
  41.                 int secondsRemaining = (int) (millisUntilFinished / 1000);
  42.                 tvCountdown.setText(secondsRemaining + "s | 跳转");
  43.             }
  44.             @Override
  45.             public void onFinish() {
  46.                 //跳转到登录页面(看自己逻辑想跳转哪个页面)
  47.                 startActivity(new Intent(WelcomeActivity.this, MainActivity.class));
  48.                 // 倒计时结束后的操作,例如跳转到主页面
  49.                 finish();
  50.             }
  51.         }.start();
  52.     }
  53.     @Override
  54.     protected void onDestroy() {
  55.         super.onDestroy();
  56.         if (countDownTimer != null) {
  57.             countDownTimer.cancel();
  58.         }
  59.     }
  60. }
复制代码

  • 气候指数
  1. public class IndicesActivity extends AppCompatActivity {
  2.     private String city_id;
  3.     private RecyclerView recyclerView;
  4.     private IndicesListAdapter mIndicesListAdapter;
  5.     @Override
  6.     protected void onCreate(Bundle savedInstanceState) {
  7.         super.onCreate(savedInstanceState);
  8.         setContentView(R.layout.activity_indices);
  9.         //获取跳转传值
  10.         city_id = getIntent().getStringExtra("city_id");
  11.         //获取生活指数
  12.         getWeatherIndices(city_id);
  13.         //初始化控件
  14.         initViews();
  15.         //初始化适配器
  16.         mIndicesListAdapter = new IndicesListAdapter();
  17.         //设置适配器
  18.         recyclerView.setAdapter(mIndicesListAdapter);
  19.         //设置监听器
  20.         setListener();
  21.     }
  22.     /**
  23.      * 初始化控件
  24.      */
  25.     private void initViews() {
  26.         recyclerView = findViewById(R.id.recyclerView);
  27.     }
  28.     /**
  29.      * 设置监听器
  30.      */
  31.     private void setListener() {
  32.         findViewById(R.id.toolbar).setOnClickListener(new View.OnClickListener() {
  33.             @Override
  34.             public void onClick(View view) {
  35.                 finish();
  36.             }
  37.         });
  38.     }
  39.     /**
  40.      * 获取生活指数
  41.      */
  42.     private void getWeatherIndices(String city_id) {
  43.         OkGo.<String>get("https://devapi.qweather.com/v7/indices/1d")
  44.                 .params("location", city_id)
  45.                 .params("key", ApiConstants.APP_KEY)
  46.                 .params("type", "0")
  47.                 .execute(new StringCallback() {
  48.                     @Override
  49.                     public void onStart(Request<String, ? extends Request> request) {
  50.                         super.onStart(request);
  51.                         ProgressDialogUtils.showProgressDialog(IndicesActivity.this);
  52.                     }
  53.                     @Override
  54.                     public void onSuccess(Response<String> response) {
  55.                         IndicesInfo indicesInfo = new Gson().fromJson(response.body(), IndicesInfo.class);
  56.                         if (null != indicesInfo && indicesInfo.getCode().equals("200")) {
  57.                             mIndicesListAdapter.setIndicesInfoList(indicesInfo.getDaily());
  58.                         }
  59.                     }
  60.                     @Override
  61.                     public void onFinish() {
  62.                         super.onFinish();
  63.                         ProgressDialogUtils.hideProgressDialog();
  64.                     }
  65.                 });
  66.     }
  67. }
复制代码

  • 城市搜索
  1. public class SearchActivity extends AppCompatActivity {
  2.     private EditText et_search_city;
  3.     private RecyclerView recyclerView;
  4.     private LinearLayoutCompat ll_empty;
  5.     private SearchListAdapter mSearchListAdapter;
  6.     @Override
  7.     protected void onCreate(Bundle savedInstanceState) {
  8.         super.onCreate(savedInstanceState);
  9.         setContentView(R.layout.activity_search);
  10.         // 1. 初始化控件
  11.         initViews();
  12.         //创建适配器
  13.         mSearchListAdapter = new SearchListAdapter();
  14.         //设置适配器
  15.         recyclerView.setAdapter(mSearchListAdapter);
  16.         // 2. 点击事件
  17.         setListener();
  18.     }
  19.     /**
  20.      * 初始化控件
  21.      */
  22.     private void initViews() {
  23.         et_search_city = findViewById(R.id.et_search_city);
  24.         recyclerView = findViewById(R.id.recyclerView);
  25.         ll_empty = findViewById(R.id.ll_empty);
  26.     }
  27.     /**
  28.      * 点击事件
  29.      */
  30.     private void setListener() {
  31.         findViewById(R.id.btn_search).setOnClickListener(new View.OnClickListener() {
  32.             @Override
  33.             public void onClick(View view) {
  34.                 // 1. 获取输入框的值
  35.                 String cityName = et_search_city.getText().toString().trim();
  36.                 // 2. 判断是否为空
  37.                 if (cityName.isEmpty()) {
  38.                     // 提示用户
  39.                     Toast.makeText(SearchActivity.this, "城市名不能为空", Toast.LENGTH_SHORT).show();
  40.                 } else {
  41.                     searchCity(cityName);
  42.                 }
  43.             }
  44.         });
  45.         //返回
  46.         findViewById(R.id.toolbar).setOnClickListener(new View.OnClickListener() {
  47.             @Override
  48.             public void onClick(View view) {
  49.                 finish();
  50.             }
  51.         });
  52.         //recyclerView点击事件
  53.         mSearchListAdapter.setOnItemClickListener(new SearchListAdapter.OnItemClickListener() {
  54.             @Override
  55.             public void onItemClick(CityLocationInfo.LocationDTO locationDTO) {
  56.                 // 1. 获取城市名
  57.                 String cityName = locationDTO.getName();
  58.                 Intent intent = new Intent();
  59.                 intent.putExtra("cityName", cityName);
  60.                 intent.putExtra("id", locationDTO.getId());
  61.                 //设置跳转回传的值
  62.                 setResult(1000, intent);
  63.                 // 3. 关闭当前界面
  64.                 finish();
  65.             }
  66.         });
  67.     }
  68.     /**
  69.      * 城市搜索
  70.      */
  71.     private void searchCity(String cityName) {
  72.         OkGo.<String>get("https://geoapi.qweather.com/v2/city/lookup").params("location", cityName).params("key", ApiConstants.APP_KEY).execute(new StringCallback() {
  73.             @Override
  74.             public void onStart(Request<String, ? extends Request> request) {
  75.                 super.onStart(request);
  76.                 ProgressDialogUtils.showProgressDialog(SearchActivity.this);
  77.             }
  78.             @Override
  79.             public void onSuccess(Response<String> response) {
  80.                 CityLocationInfo cityLocationInfo = new Gson().fromJson(response.body(), CityLocationInfo.class);
  81.                 if (null != cityLocationInfo && cityLocationInfo.getCode().equals("200")) {
  82.                     if (null != mSearchListAdapter) {
  83.                         mSearchListAdapter.setCityLocationInfoList(cityLocationInfo.getLocation());
  84.                     }
  85.                     //判断是否显示空布局
  86.                     if (mSearchListAdapter.getItemCount() > 0) {
  87.                         ll_empty.setVisibility(View.GONE);
  88.                     } else {
  89.                         ll_empty.setVisibility(View.VISIBLE);
  90.                     }
  91.                 } else {
  92.                     Toast.makeText(SearchActivity.this, "未查询到该城市", Toast.LENGTH_SHORT).show();
  93.                 }
  94.             }
  95.             @Override
  96.             public void onError(Response<String> response) {
  97.                 super.onError(response);
  98.             }
  99.             @Override
  100.             public void onFinish() {
  101.                 super.onFinish();
  102.                 ProgressDialogUtils.hideProgressDialog();
  103.             }
  104.         });
  105.     }
  106. }
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

一给

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表