使用viewpager和MVP实现的卡片式问答项目

发布时间:2020-02-28
技术:Android

概述

基于MVP写的一个卡片式回答APP

详细

一、前言

一个使用viewpager实现的卡片式问答项目,下面我们来演示这个课程的demo

这个项目有几个知识点,一个是如何实现一个立体的卡片堆叠效果,我们一般展示很多数据都是采用ListView

和recycleView等列表的形式,可是如何每一条数据要展示比较多的内容,还有一些交互的话,列表就不是很

适合,卡片更容易去做这种场景的展示,所以把卡片做成堆叠式的效果,再加上一些页面引导,用户很容易

知道卡片是可以滑动的,这种样式非常适合做问答式项目的需求。第二个知识点我们要学会如何使用MVP去搭建

项目架构,MVP是很多大公司都会采用的流行架构,在实现卡片式布局我们要学会CardView的

基本用法,CardView额外提供了圆角和阴影效果,看上去有立体的感觉。第三我们学会实现一些页面交互的需求,

我们回答一道题,如何答对的话,我们会在按钮上显示答案选项,并提示用户这道题的答题思路,还会下表情雨,表情雨这种交互在很多场景都可以使用的上,我们这个课程会详细去讲这个表情雨控件怎么实现。在这个项目里我们会去如何使用greendao实现项目数据的持久化,并讲解网络数据和本地数据的同步,这个在实际实现项目中是很实用的。大家在课后可以自己去实现这个效果,对安卓开发的提高是挺有帮助的。 

技术点: 使用MVP模式和使用viewpager搭建项目的基础架构,还有使用答题控件来实现回答逻辑。下半部分我们的重点就在于项目的一些扩展需求,比方说给viewpager加上切换动画,使用greendao来实现项目的持久化,项目的异常处理,项目也集成了一个子module,子module主要是表情雨功能。


功能点:

代码运行android studio中,打开就能运行,采用本地的json提供数据,当然可以把本地的json换成项目中提供的封装的okhttp代码来请求数据,项目采用MVP架构,结构很清晰,数据持久化采用greendao,难点是使用viewpager切换动画,还有如何实现一个表情雨,并且采用全局的异常捕获系统,还有个一个底部动画弹出和隐藏的广告条。


以下是viewpager实现卡片立体堆叠的动画效果:

image.png

二、代码结构

image.png

三、技术实现

实现难点:

    为了实现一个立体堆叠的卡片效果,这个就用到viewpager

的切换效果,平时使用的是ViewPager的默认切换效果,ViewPager自带了一个setPageTransformer的成员函数

用于设置切换动画,下面我们先来用setPageTransformer来实现 

这里说明一下 android:clipChildren 这个属性。这个属性我们不是特别常用,但是它却很实用。它主要的作用是:

 是否让其子View显示在父View之内,默认为ture,它就会显示在父容器里。设为false则会显示到父容器之外。例如,我们给ViewPager设置了margin,这会使它缩进在屏幕内。

ViewPager也有android:clipChildren这个属性。这就说明ViewPager里的子View也能够超出父容器的限制,显示在父容器之外了。

ViewPager有这样一个方法,可以设置每个Page之间的Margin

    mViewPager.setPageMargin(20);//Page之间缩进20,作用是让页面之间空隙更大一点,根据自己需要而定。

如果当前屏幕在0这个位置,那么在当前屏幕的右边,他的postion就是1,2,3

在当前屏幕的左边,他的position是-1,-2,-3

如果屏幕向右滑动,那么这个position就会从0变成1,向左滑动就是从

这里我们设置一个前提,就是position在滑动过程中都是属于[-1,1]之间的,而position != 0的View都缩放了0.9f ;

当我们手指往右滑动屏幕时,position这时从 -1 —> 0 的变化,而 scaleVaule = minVaule + tempScale * 0.1f ;

这里相当于 scaleVaule = 0.9f + [0,1] * 0.1f  ; 它的缩放倍数是从 0.9f —> 1.0f 变化的。 


对全局crashHandler的实现:

为什么要捕获Crash信息:

Throwable是java.lang包中一个专门用来处理异常的类。它有两个子类,即Error 和Exception,它们分别用来处理两组异常。


Error主要是用于表示Java和虚拟机内部的异常信息

Exception是Throwable的一个主要子类。Exception下面还有子类,IOException是一般在读写数据的时候会出现的异常,另外一部分子类分别对应于Java程序运行时常常遇到的各种异常的处理,其中包括隐式异常。

比如,程序中除数为0引起的错误、数组下标越界错误等,这类异常也称为运行时异常,因为它们虽然是由程序本身引起的异常,但不是程序主动抛出的,而是在程序运行中产生的。

开发阶段,我们会使用Monitor查看logcat 信息,但由于很多原因,Android Monitor抓不到logcat信息。 

应用上线后,即使是经过了测试的大量检测,但是到用户手上还是会遇到闪退。这和android设备的碎片化有关,也和使用时的环境有关,比如弱网,比如高铁频繁切换小区等等。然而我们不能让用户帮我们抓取log,那要怎么才能知道为什么闪退了呢?

因此需要一个CrashHandler来将Crash写入到本地或者上传到服务器方便我们分析。

线上应用:

崩溃率是衡量应用稳定性的重要标准,那么应用上线以后 我们无法向用户借手机来分析崩溃原因。为了减低崩溃率,这个时候需要CrashHandler 来帮我们将崩溃信息返回给后台,以便及时修复。

如何捕获捕获Crash分如下三步:

1、实现Thread.UncaughtExceptionHandler接口,并重写uncaughtException方法,在uncaughtException 方法中接收异常信息

2、调用Thread.setDefaultUncaughtExceptionHandler(CrashHandler) ,来使用我们自定义的CrashHandler来取代系统默认的CrashHandler

3、异常信息的获取、本地写入以及异常信息的上传 


四、运行效果

image.png

image.png



image.png

项目也集成了


本实例支付的费用只是购买源码的费用,如有疑问欢迎在文末留言交流,如需作者在线代码指导、定制等,在作者开启付费服务后,可以点击“购买服务”进行实时联系,请知悉,谢谢
手机上随时阅读、收藏该文章 ?请扫下方二维码