Android Studio打造一个小说阅读App

news2024/11/27 2:38:27

应用目录

  • 一、基本信息
  • 二、功能介绍
      • 1. 主界面
      • 2. 排行榜界面
      • 3. 分类界面
      • 4. 搜索界面
      • 5. 书籍详情界面
      • 6. 阅读界面
      • 7. 相关书籍界面
  • 三、类图/时序图/架构图
  • 四、采用技术及原因
      • 1.ViewPager+Fragment的使用
      • 2.RadioGroup实现导航栏
      • 3.Retrofit的网络加载框架
      • 4.设置同步变量控制线程顺序
      • 5.将多个列表放在一个activity下
      • 6.系统广播获取系统电量和时间
      • 7.非注销生命周期的横竖屏切换
  • 五、应用部署
  • 六、运行截图

一、基本信息

本次用java语言实现的Android小说阅读App功能非常丰富,可以在线阅读网络书籍,也可以加入书架,还可以在线搜索网络小说,有大家都在搜的关键词推荐、关键词刷新功能、搜索历史等。根据男生和女生用户的使用情况,分别显示对应的小说排行榜,包括:最热榜、热搜榜、潜力榜、留存榜和完结榜,点进排行榜,还分为周榜、月榜和总榜。在分类中,有玄幻、武侠、历史、科幻等多种类别,点进某一类别,还有热门、新书、好评和完结顶部导航栏。在阅读小说时,可以切换日夜模式,横竖屏切换,可以设置字体大小,还可以查看目录。

二、功能介绍

1. 主界面

  • 点击下方图标或左右滑动来切换书架、排行榜、分类,点击右上角搜索图标进入搜索界面
  • 从书架点击某本书籍进入阅读界面
  • 在排行榜处点击左上角♂/♀图标切换男生/女生,点击某个排行榜进入排行榜界面
  • 在分类处点击上方按钮切换男生/女生,点击某个分类进入分类界面

2. 排行榜界面

  • 点击上方按钮切换周榜/月榜/总榜
  • 点击某本书籍进入书籍详情界面

3. 分类界面

  • 点击上方按钮切换热门/新书/好评/完结
  • 点击某本书籍进入书籍详情界面

4. 搜索界面

  • 在上方搜索框中输入书名,点击搜索按钮进行搜索
  • 点击搜索结果中的书名跳转到书籍详情界面
  • 点击“大家都在搜”/“搜索历史”中的书名直接跳转到书籍详情界面

5. 书籍详情界面

  • 点击左下角“加入书架”按钮可将当前书籍加入书架
  • 点击右下角“免费阅读”按钮跳转到阅读界面
  • 点击“同类推荐”中的书籍可跳转到该书籍的详情界面
  • 点击“更多”按钮跳转到相关书籍界面

6. 阅读界面

  • 上下滑动进行阅读,左右滑动切换章节
  • 点击屏幕中部,屏幕底部出现菜单:夜间/日间、横屏/竖屏、设置、目录
  • 点击“夜间/日间”切换到夜间/日间模式
  • 点击“横屏/竖屏”切换到横屏/竖屏模式
  • 点击“设置”出现字体大小调整界面,点击“A-”减小字体大小,点击“A+”增大字体大小,点击屏幕其他部分返回
  • 点击“目录”出现书籍目录,点击某个章节可跳转到该章节,点击屏幕其他部分返回

7. 相关书籍界面

  • 点击相关书籍列表中的书籍,跳转到该书籍的详情界面

三、类图/时序图/架构图

项目结构图如下,代码一共分为6个部分,根据包名来分别介绍主要功能。

在这里插入图片描述

  1. Activity:该app中用到的所有activity。
    在这里插入图片描述

2.DataBase:创建、操作数据库和表的函数。
在这里插入图片描述

  1. Fragment:在活动内显示的碎片,小型activity。在这里插入图片描述

  2. Object:包含各种api返回对象类和数据库对象类。
    在这里插入图片描述

  3. RecycleView:包含和recylerview相关的类、适配器和基础的viewholder。
    在这里插入图片描述

  4. Service:包含api服务相关函数。
    在这里插入图片描述

四、采用技术及原因

1.ViewPager+Fragment的使用

原因

每一个Fragment对应一个界面,使用此技术来显示界面,能够更流畅地在各个界面之间完成切换,比如主界面的书架、排行榜、分类就是利用3个Fragment来显示的,再增加RadioGroup作为导航栏,就能够实现类似于微信主界面一样的效果了,各个界面之间切换流畅,具有美感

方法

使用的方法就是在布局中添加ViewPager:

<android.support.v4.view.ViewPager
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1"
        android:overScrollMode="never"
        android:scrollbars="none"/>

再在Activity中设置Adapter、FragmentList:

private ViewPager viewPager;
private List<Fragment> fragmentList = new ArrayList<>();
private TabFragmentStatePagerAdapter fragmentPagerAdapter;

//初始化Fragment
//...
fragmentList.add(bookShelfFragment);
fragmentList.add(rankingFragment);
fragmentList.add(categoryFragment);

设置ViewPager:

viewPager.setOnPageChangeListener(new MyPagerChangeListener());
fragmentPagerAdapter = new TabFragmentStatePagerAdapter(getSupportFragmentManager(), fragmentList);
viewPager.setAdapter(fragmentPagerAdapter);
viewPager.setCurrentItem(0);
viewPager.setOffscreenPageLimit(2);

2.RadioGroup实现导航栏

原因

只有单纯的滑动切换Fragment给用户的提示信息还不够,界面也不够美观,Fragment的分离也不够明显。实现一个导航栏能够让用户明确每一个Fragment的作用。这也是当前许多主流App的做法。

方法

利用RadioButton的android:button="@null"这个属性来把圆形按钮去掉,再利用android:drawableTop="@mipmap/bookshelf"属性来给RadioButton显示不同的图片:

<RadioButton
            style="@style/BottomRB"
            android:drawableTop="@mipmap/bookshelf"
            />
<style name="BottomRB">
    <item name="android:button">@null</item>
    <item name="android:textColor">@drawable/selector_tab_text_color</item>
</style>

在RadioButton被选中时,还需要设置字体的颜色以及改变图片颜色,以达到被选中的效果。这可以在RadioGroup的监听事件中来实现,注意需要设置图片的大小,否则会不适配,设置的方法为:

RadioButton的选中与ViewPager切换帧需要结合起来,才能达到导航栏的效果。

在切换选中的RadioButton时,要修改ViewPager当前显示的帧;在切换ViewPager显示的帧时,要修改被选中的RadioButton。

3.Retrofit的网络加载框架

其底层使用OKHttp封装,支持rxjava
原因

  • 解耦,减少API接口定义和API接口使用的耦合
  • 包含许多注解,简化代码,方便使用
  • 支持同步、异步、RxJava
  • 可以使用不同工具解析数据,如json、xml
  • 请求速度快

方法

接口类:

@GET("/ranking/gender")
Call<AllRankingObj> getAllRanking();
OkHttpClient build = new OkHttpClient.Builder()
        .connectTimeout(2, TimeUnit.SECONDS)
        .readTimeout(2, TimeUnit.SECONDS)
        .writeTimeout(2, TimeUnit.SECONDS)
        .build();

// 用于API访问
Retrofit retrofitForApi = new Retrofit.Builder()
        .baseUrl(ApiUrl)
        // 设置json数据解析器
        .addConverterFactory(GsonConverterFactory.create())
        // RxJava封装OkHttp的Call函数,本质还是利用OkHttp请求数据
        .addCallAdapterFactory(RxJavaCallAdapterFactory.create())
        .client(build)
        .build();

4.设置同步变量控制线程顺序

原因

当输入速度特别快时,有的线程清空了list,而有的线程正在调用list里的元素,这样会发生访问异常,需要设置同步变量使得同一时刻只有一个线程在运行。

方法

flag = true; //用于同步问题的布尔变量
if (!s.equals("") && flag) {
    new Thread(new Runnable() {
        @Override
        public void run() {
            flag = false;
            ...
        }
    }
}

5.将多个列表放在一个activity下

原因

将不同列表放入多个activity里可以使得界面布局简单,但是带来的问题是需要增加许多activity之间的通信,增加了跳转的复杂度,而将列表放入同一个activity里方便跳转时的信息传递。

方法

//设置可见
if (!isSubmit) {
    if (s.equals("")) {
        initialLayout.setVisibility(View.VISIBLE);
        searchLayout.setVisibility(View.GONE);
    }
    else {
        initialLayout.setVisibility(View.GONE);
        searchLayout.setVisibility(View.VISIBLE);
        fuzzyList.setVisibility(View.VISIBLE);
        resultList.setVisibility(View.GONE);
    }
}

6.系统广播获取系统电量和时间

原因

用户进入阅读界面时是全屏阅读,顶部状态栏会消失,那么需要有个信息栏来简要显示系统电量和时间

方法

  1. onCreate 中注册广播,接受电量和时钟变化,并创建自定义的广播接收者MyReceiver类来处理订阅
//注册广播接受者java代码
intentFilter = new IntentFilter(Intent.ACTION_BATTERY_CHANGED);    // 电量变化广播
intentFilter.addAction(ACTION_TIME_TICK);
//创建广播接受者对象
myReceiver = new MyReceiver();
//注册receiver
registerReceiver(myReceiver, intentFilter);
  1. 自定义广播接收者类,处理电量和时钟变化广播
class MyReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        if(Intent.ACTION_BATTERY_CHANGED.equals(intent.getAction())){
            //获取当前电量
            int level = intent.getIntExtra("level", 0);
            //电量的总刻度
            int scale = intent.getIntExtra("scale", 100);
            //把它转成百分比
            int percent = level*100/scale;
            // TODO: Do Something when battery_changed
        }
        else if (Intent.ACTION_TIME_TICK.equals(intent.getAction())) {
            // TODO:Do Something when time_tick
        }
    }
}
  1. onDestroy 中注销广播订阅
unregisterReceiver(myReceiver);

7.非注销生命周期的横竖屏切换

原因

  1. 小说阅读需要适应用户阅读习惯,有时候用户需要横屏阅读,因此需要实现阅读界面横竖屏模式切换
  2. 如果不设置上面第1步的代码,那么横竖屏切换会重新注销Activity,即结束当前活动的生命周期并重新开启一个新的声明周期。这样不仅需要时间重新进行网络访问获取小说章节内容,而且会影响到用户的使用体验。

方法

  1. AndroidManifest.xml 中对Activity 设置属性(关键)
android:configChanges="orientation|keyboardHidden|screenSize"
android:screenOrientation="portrait"
  1. 横竖屏切换后台java代码

切换到横屏

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);

切换到竖屏

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

五、应用部署

下载好源代码之后,通过android studio部署到手机或模拟器即可,或直接安装report目录下的apk文件。对android studio版本没有具体要求。

在这里插入图片描述

注:应用开发测试环境的sdk版本最低为22,最高为28

六、运行截图

1、运行项目,进入主界面,显示的是本地书架,此时我们已经添加了四本书籍。

在这里插入图片描述

2、第三本看完了,我们长按将它删除。
在这里插入图片描述

3、点击右上角图标,进入搜索界面,输入作者或者书名查找,底下是大家都在搜的关键词,可以刷新。还有搜索历史,可以删除。

在这里插入图片描述

4、进入排行榜,可以选择性别,然后查看各排行,比如最热榜、完结榜。

在这里插入图片描述
在这里插入图片描述

5、进入具体的榜单后,顶部导航栏还分为周榜、月榜和总榜。

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

6、点击任意书籍,进入详情界面,有阅读人次、留存率、简介和同类推荐等。

在这里插入图片描述

7、选择加入书架,就将书籍放到了书架中。选择免费阅读,api当前没有该书的版权,推荐我们直接下载软件看小说。

在这里插入图片描述

8、别着急退出,点击屏幕中央,弹出底部功能菜单,可以设置日夜模式、很竖屏切换和字体大小。

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

9、进入分类导航栏,这里有几百万本书籍,真的看不过来了。

在这里插入图片描述

10、点进任意分类,会进入具体分类界面,显示顶部导航栏和书籍列表。

在这里插入图片描述
在这里插入图片描述

11、回到书架导航栏,可以看到刚刚添加进来的所有书籍。

在这里插入图片描述


🚀这有你错过的精彩内容

  • ❤️Android Studio实现一个校园二手交易系统❤️

  • ❤️Android Stduio实现一个天气预报APP❤️

  • ❤️Android Studio实现一个健康饮食搭配APP❤️

  • ❤️Android Studio实现音乐播放器2.0版本❤️

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/4110.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【测试沉思录】12. 可用性保障平台的自动化测试探索与实践

欢迎订阅我的新专栏《现代命令行工具指南》&#xff0c;精讲目前最流行的开源命令行工具&#xff0c;大大提升你的工作效率。 作者&#xff1a;张雅瑜 编辑&#xff1a;毕小烦 一. 背景 随着业务的发展&#xff0c;应用越来越多&#xff0c;并且承载的业务量越来越大&#xff…

推箱子游戏设计与实现(Java+swing+JAWT)

目 录 摘 要 i Abstract ii 引 言 1 1 系统分析 2 1.1 技术可行性分析 2 1.1.1 可行性目的 2 1.1.2 可行性研究前提 2 1.1.3 算法可行性分析 2 1.1.4 平台选择 6 1.2 需求分析 6 1.2.1 引言 6 1.2.2 游戏需求 6 1.2.3 软硬件需求 9 1.2.4 接口控制 10 1.3 方案论证 10 1.3.1 C语…

JCDY-2A DC220V【直流高低值电压继电器】

系列型号 JCDY-2A/220V直流高低值电压继电器&#xff1b;JCDY-2A/110V直流高低值电压继电器&#xff1b; JCDY-2A/48V直流高低值电压继电器&#xff1b;JCDY-2B/220V直流高低值电压继电器&#xff1b; JCDY-2B/110V直流高低值电压继电器&#xff1b;JCDY-2B/48V直流高低值电压继…

MongoDB工具命令和用户认证

1.MongoDB工具命令 文章目录1.MongoDB工具命令1.1.Mongod命令1.2.Mongos命令1.3.Mongostat命令1.4.Mongotop命令1.5.Mongooplog命令1.6.Mongoperf命令2.MongoDB用户认证2.1.创建一个用户2.2.修改配置文件启用用户认证2.3.重启MongoDB2.4.使用用户口令登录MongoDB3.授权用户并赋…

【数据结构】链表OJ第二篇 —— 链表的中间节点 链表中倒数第k个节点 链表分割 链表的回文结构 相交链表

文章目录0. 前言1. 链表的中间节点2. 链表中倒数第k个结点3. 链表分割4. 链表的回文结构5. 相交链表6. 结语0. 前言 书接上回&#xff0c;我们这次依然是为大家带来链表的OJ题。这一次的题量比之前多一些&#xff0c;内容为链表的中间节点、链表中倒数第k个节点、链表分割、链…

安卓讲课笔记5.2 编辑框

文章目录零、本讲学习目标一、导入新课二、新课讲解&#xff08;一&#xff09;继承关系图&#xff08;二&#xff09;编辑框常用属性&#xff08;三&#xff09;教学案例&#xff1a;用户注册1、创建安卓应用2、准备图片素材3、主界面与主布局资源文件更名4、创建息界面类5、字…

数据获取与预处理

文章目录Requests简介Requests库安装Requests库的基本操作Requests库的7个主要方法Request方法get方法Response对象的属性head方法post方法Requests简介 提示&#xff1a;这里可以添加本文要记录的大概内容&#xff1a; 首先他是个第三方库&#xff0c;应用非常广泛 采用Apac…

《数据结构》(六)八大排序(下)

承接上篇的八大排序&#xff0c;今天本篇文章主要讲归并排序&#xff0c;冒泡排序&#xff0c;快速排序(挖坑&#xff0c;左右指针&#xff0c;前指针)和计数排序 八大排序交换排序冒泡排序冒泡排序思想代码冒泡排序总结快速排序快速排序思想三数取中快速排序之挖坑法挖坑法代码…

量化股票查询代码是什么?

量化股票查询代码是什么&#xff1f;接下来用一些代码来分析一下&#xff0c;如下&#xff1a; 做空95&#xff1a;HHV((HIGHLOWOPEN2*CLOSE)/5H-L,5),COLORBLUE;做空68: HHV((HIGH-LOWOPEN2*CLOSE)/5*2-L,5),COLORRED&#xff1b; 平衡点&#xff1a;LLV((HIGHLOWOPEN2*CLOSE…

狗厂员工来面试本想难为一下,问他内存溢出,结果被虐得连console.log也不敢写了

这次说到的面试题是关于node服务端内存溢出的问题&#xff0c;狗厂员工来面试本想难为一下&#xff0c;现在我连console.log也不敢写了 关于这道node内存溢出的问题&#xff0c;大哥从以下几个方面讲的&#xff0c;讲完我觉得自己得到了升华&#xff0c;现在搞得连代码也快不敢…

AI人脸检测/安全帽检测智能分析网关告警消息配置——微信告警消息配置

AI智能分析网关内置多种深度学习算法&#xff0c;可支持对接入的多路视频流进行智能检测、智能识别等&#xff0c;包括人脸检测与识别、车辆检测与识别、车牌识别、烟火识别、安全帽识别、区域入侵检测等。将智能分析网关与EasyCVR视频融合平台联合使用&#xff0c;可实现智能告…

Linux命令从入门到实战 ---- 用户管理命令

文章目录useradd添加新用户passwd设置用户密码id查看用户是否存在查看创建了哪些用户su切换用户userdel删除用户who查看登录用户信息sudo设置普通用户具有root权限用户组groupadd 新增用户组usermod修改用户groupdel删除用户组groupmod修改用户组总结useradd添加新用户 将usera…

安卓学习笔记5.3 按钮、图像视图与图像按钮

文章目录零、本讲学习目标一、导入新课二、新课讲解&#xff08;一&#xff09;按钮控件1、继承关系图2、常用属性&#xff08;二&#xff09;图像视图1、继承关系图2、常用属性&#xff08;三&#xff09;图像按钮1、继承关系图2、常用属性&#xff08;四&#xff09;教学案例…

vue无需改动代码的SEO【百度爬取】优化--puppeteer(详细流程)

vue无需改动代码的SEO优化–puppeteer&#xff08;详细流程&#xff09; 目录vue无需改动代码的SEO优化--puppeteer&#xff08;详细流程&#xff09;一级目录二级目录三级目录一、安装puppeteer&#xff1a;npm install puppeteer --save安装依赖二、编写puppeteer服务js文件p…

DDD领域驱动设计基础

什么领域驱动模型 领域驱动模型一种设计思想&#xff0c;我们又称为DDD设计思想。是一种为了解决传统设计思想带来的维护困难&#xff0c;沟通困难和交互困难而产生的一种新的思想。 架构模式的演进 单体架构 采用面向对象的设计方法&#xff0c;系统包括业务接入层、业务逻…

Eclipse切JRE环境后如何恢复- Unrecognized option: --enable-preview

场景 使用switch 新特性 配合 lambda 练习小案例 // 需求&#xff1a; 1 2 3 -> 一、二、 三 int num 1; switch ( num) {// jdk13 可以缺省 break 并且 单语句可以省略 花括号 case 1 -> { System.out.println("一"); }case 2 -> System.out.p…

[附源码]计算机毕业设计JAVAjsp宠物店管理系统

[附源码]计算机毕业设计JAVAjsp宠物店管理系统 项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybat…

Mybatis-Plus知识点[MyBatis+MyBatis-Plus的基础运用]

目录 前言 一、了解Mybatis-Plus 1.简介 2.Mybatis-Plus具有的特性 3.支持数据库 4.框架结构 5.官网链接 二、快速开始 2.1.创建数据库以及表 2.2.创建工程 2.3 MybatisMybatis-Plus的使用 2.3.1创建一个itcast-mybatis-plus-simple的maven项目 2.3.2写UserMapper接口 2.3.3写U…

北京化工大学数据结构2022/11/3作业 题解

目录 问题 A: 二叉树非递归前序遍历-附加代码模式 问题 B: 二叉树非递归中序遍历-附加代码模式 问题 C: 二叉树非递归后序遍历-附加代码模式 问题 D: 求二叉树中序遍历序根节点的下标 问题 E: 根据前序中序还原二叉树 问题 F: 算法6-12&#xff1a;自底向上的赫夫曼编码 …

ServletConfig和ServletContext接口

一、ServletConfig接口详解 1、简介 Servlet 容器初始化 Servlet 时&#xff0c;会为这个 Servlet 创建一个 ServletConfig 对象&#xff0c;并将 ServletConfig 对象作为参数传递给 Servlet 。通过 ServletConfig 对象即可获得当前 Servlet 的初始化参数信息。一个 Web 应用中…