乌市泽哥 发表于 2024-6-14 21:31:29

Android Studio实现一个小说阅读App

一、根本信息

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

1. 主界面



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



[*]点击上方按钮切换周榜/月榜/总榜
[*]点击某本书籍进入书籍详情界面
3. 分类界面



[*]点击上方按钮切换热门/新书/好评/完结
[*]点击某本书籍进入书籍详情界面
4. 搜索界面



[*]在上方搜索框中输入书名,点击搜索按钮进行搜索
[*]点击搜索结果中的书名跳转到书籍详情界面
[*]点击“各人都在搜”/“搜索历史”中的书名直接跳转到书籍详情界面
5. 书籍详情界面



[*]点击左下角“加入书架”按钮可将当前书籍加入书架
[*]点击右下角“免费阅读”按钮跳转到阅读界面
[*]点击“同类保举”中的书籍可跳转到该书籍的详情界面
[*]点击“更多”按钮跳转到相干书籍界面
6. 阅读界面



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



[*]点击相干书籍列表中的书籍,跳转到该书籍的详情界面
三、类图/时序图/架构图

项目结构图如下,代码一共分为6个部分,根据包名来分别先容重要功能。
https://img-blog.csdnimg.cn/a130c94d86d3446098c6187e853e72c0.png

[*]Activity:该app中用到的所有activity。
https://img-blog.csdnimg.cn/bbae37df1f2444a3b50a61c39207b61c.jpeg
2.DataBase:创建、操作数据库和表的函数。
https://img-blog.csdnimg.cn/c79b8c2843c043a7ae78c5c64027e2ed.jpeg

[*]Fragment:在运动内显示的碎片,小型activity。
https://img-blog.csdnimg.cn/0c1befe4e458426a9ab5bd30bf678ac8.jpeg

[*]Object:包含各种api返回对象类和数据库对象类。
https://img-blog.csdnimg.cn/7aa51f6619c14360a989fec56048f10b.jpeg
5. RecycleView:包含和recylerview相干的类、适配器和基础的viewholder。
https://img-blog.csdnimg.cn/ae70d80d63dc44bfa640c312c09ef149.jpeg

[*]Service:包含api服务相干函数。
https://img-blog.csdnimg.cn/a249ee5b32ac4c4daf639e435fc8cc96.jpeg
四、采用技术及缘故原由

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.体系广播获取体系电量和时间

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

[*]onCreate 中注册广播,继承电量和时钟变化,并创建自界说的广播吸收者MyReceiver类来处理订阅
//注册广播接受者java代码
intentFilter = new IntentFilter(Intent.ACTION_BATTERY_CHANGED);    // 电量变化广播
intentFilter.addAction(ACTION_TIME_TICK);
//创建广播接受者对象
myReceiver = new MyReceiver();
//注册receiver
registerReceiver(myReceiver, intentFilter);

[*]自界说广播吸收者类,处理电量和时钟变化广播
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
      }
    }
}

[*]onDestroy 中注销广播订阅
unregisterReceiver(myReceiver);
7.非注销生命周期的横竖屏切换

缘故原由

[*]小说阅读需要顺应用户阅读风俗,有时间用户需要横屏阅读,因此需要实现阅读界面横竖屏模式切换
[*]假如不设置上面第1步的代码,那么横竖屏切换会重新注销Activity,即竣事当前运动的生命周期并重新开启一个新的声明周期。这样不但需要时间重新进行网络访问获取小说章节内容,而且会影响到用户的使用体验。
方法

[*]在AndroidManifest.xml 中对Activity 设置属性(关键)
android:configChanges="orientation|keyboardHidden|screenSize"
android:screenOrientation="portrait"

[*]横竖屏切换后台java代码
切换到横屏
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
切换到竖屏
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
五、应用摆设

下载好源代码之后,通过android studio摆设到手机或模拟器即可,或直接安装report目录下的apk文件。对android studio版本没有具体要求。
https://img-blog.csdnimg.cn/14cc958b190f4b9fb5e258e736e5d4fc.png
注:应用开发测试环境的sdk版本最低为22,最高为28。
六、运行截图

1、运行项目,进入主界面,显示的是本地书架,此时我们已经添加了四本书籍。
https://img-blog.csdnimg.cn/28f3307d92644fad8709d40e876075bb.png
2、第三本看完了,我们长按将它删除。
https://img-blog.csdnimg.cn/faf48052dc6144a2bcc3c3ce390790ab.png
3、点击右上角图标,进入搜索界面,输入作者或者书名查找,底下是各人都在搜的关键词,可以革新。还有搜索历史,可以删除。
https://img-blog.csdnimg.cn/d651fa666790487db21720e7e4a055e8.png
4、进入排行榜,可以选择性别,然后查看各排行,比如最热榜、完结榜。
https://img-blog.csdnimg.cn/bfde3a7e3b3f464db1dd6908c8829e39.png
https://img-blog.csdnimg.cn/08c587db4203425e8240efccb007be60.png
5、进入具体的榜单后,顶部导航栏还分为周榜、月榜和总榜。
https://img-blog.csdnimg.cn/1e6196adc4964c298fd2aa2b8ba1f1dd.png
https://img-blog.csdnimg.cn/ad257711ae0343df9f67deba5fa6b104.png
https://img-blog.csdnimg.cn/338db5f6eaf6458e8cdc747a9bfad4f1.png
6、点击任意书籍,进入详情界面,有阅读人次、留存率、简介和同类保举等。
https://img-blog.csdnimg.cn/3cfa1174ee924e7aa4ae129b0d1d06d6.png
7、选择加入书架,就将书籍放到了书架中。选择免费阅读,api当前没有该书的版权,保举我们直接下载软件看小说。
https://img-blog.csdnimg.cn/e4b04c29d6a1484ca30b43a65326de5f.png
8、别着急退出,点击屏幕中心,弹出底部功能菜单,可以设置日夜模式、很竖屏切换和字体巨细。
https://img-blog.csdnimg.cn/be373fe428ac42c983b3dcfab1261b14.png
https://img-blog.csdnimg.cn/ab0dd6bc23e54c2ba6252f37e3c31b17.png
https://img-blog.csdnimg.cn/9ccafac023794c3e94e4869a179a5799.png
https://img-blog.csdnimg.cn/bb12cb2745e84c7597ed69be44ccb541.png
9、进入分类导航栏,这里有几百万本书籍,真的看不过来了。
https://img-blog.csdnimg.cn/d18978dbce4641aaa649d2508060d085.png
10、点进任意分类,会进入具体分类界面,显示顶部导航栏和书籍列表。
https://img-blog.csdnimg.cn/516509cabcd24d0486bd1707db9a52ff.png
https://img-blog.csdnimg.cn/1db9ba0cdeb24518b85288fec4561f77.png
11、回到书架导航栏,可以看到刚刚添加进来的所有书籍。
https://img-blog.csdnimg.cn/4a23c2d8543f4cb2a061f9ba79af3c44.png
七、源码获取

♻️下面两种方式都可以获取源代码1️⃣ 点击直接下载 Android Studio 小说阅读App2️⃣关注公众号《 萌新加油站 》,后台回复: 小说
页: [1]
查看完整版本: Android Studio实现一个小说阅读App