lmw
2024-06-17 f571288a24fcf10143dcc8015ffbbf38dbc0c614
save
1 文件已重命名
23个文件已修改
20个文件已添加
3894 ■■■■■ 已修改文件
.idea/.name 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/AndroidManifest.xml 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/dollearn/student/MainActivity.kt 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/dollearn/student/network/ApiService.kt 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/dollearn/student/network/Apis.kt 11 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/dollearn/student/network/HttpManager.kt 39 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/dollearn/student/network/entity/Banner.kt 5 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/dollearn/student/network/entity/ProgressBean.kt 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/dollearn/student/network/entity/ReqFinishStudy.kt 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/dollearn/student/network/entity/ReqSaveProgress.kt 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/dollearn/student/network/entity/SubjectBean.kt 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/dollearn/student/ui/course/CourseActivity.kt 4 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/dollearn/student/ui/course/CourseDetailActivity.kt 4 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/dollearn/student/ui/course/JoinCourseActivity.kt 4 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/dollearn/student/ui/course/UnPayCourseDetailActivity.kt 4 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/dollearn/student/ui/course/adapter/MedalAdapter.kt 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/dollearn/student/ui/home/ChooseVoiceActivity.kt 152 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/dollearn/student/ui/home/ChooseVoiceFragment.kt 384 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/dollearn/student/ui/home/DailyFragment.kt 44 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/dollearn/student/ui/home/IncludeActivity.kt 151 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/dollearn/student/ui/home/IncludeFragment.kt 391 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/dollearn/student/ui/home/ListenActivity.kt 67 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/dollearn/student/ui/home/ListenFragment.kt 11 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/dollearn/student/ui/home/MatchActivity.kt 293 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/dollearn/student/ui/home/MatchFragment.kt 391 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/dollearn/student/ui/home/ResultActivity.kt 58 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/dollearn/student/ui/home/ScheduleActivity.kt 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/dollearn/student/ui/login/LoginActivity.kt 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/dollearn/student/utils/Const.kt 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/dollearn/student/utils/event/IntEvent.kt 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/dollearn/student/utils/extention/WeparkEx.kt 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/res/drawable/bg_blue_line_8dp.xml 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/res/drawable/bg_grey_8dp.xml 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/res/drawable/selector_bg_voice.xml 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/res/layout/activity_result.xml 135 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/res/layout/fragment_choose_voice.xml 569 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/res/layout/fragment_include.xml 498 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/res/layout/fragment_listen.xml 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/res/layout/fragment_match.xml 203 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/res/mipmap-xxhdpi/quanping.png 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/res/xml/fragment_include_scene.xml 169 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/res/xml/scene_fragment_choose_voice.xml 187 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/res/xml/scene_fragment_listen_voice.xml 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xldutils-kotlin/src/main/res/values/colors.xml 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
.idea/.name
New file
@@ -0,0 +1 @@
DophinEnglish
app/src/main/AndroidManifest.xml
@@ -94,7 +94,7 @@
            android:label="添加运动营成员" android:windowSoftInputMode="adjustPan" />
        <activity
            android:name=".ui.home.MatchActivity"
            android:label="活动列表" />
            android:label="自主学习5-音图相配" />
        <activity
            android:name=".ui.home.MatchDetailActivity"
            android:label="活动详情" />
@@ -247,7 +247,9 @@
        <activity android:name=".ui.mine.AddressManageActivity" android:label="地址管理"/>
        <activity android:name=".ui.mine.ScoreRecordActivity" android:label="积分明细"/>
        <activity android:name=".ui.home.ListenActivity" android:label="自主学习1-听音选图" android:launchMode="singleTask"/>
        <activity android:name=".ui.home.ChooseVoiceActivity" android:label="自主学习2-看图选音" android:launchMode="singleTask"/>
        <activity android:name=".ui.home.IncludeActivity" android:label="自主学习3-归纳排除" android:launchMode="singleTask"/>
        <activity android:name=".ui.home.ResultActivity" />
        <meta-data
            android:name="com.amap.api.v2.apikey"
app/src/main/java/com/dollearn/student/MainActivity.kt
@@ -99,9 +99,6 @@
    fun onSwitch(e:EmptyEvent){
        if (e.code == Const.EventCode.SWITCH_HOME){
            switchHome()
        }else if(e.code == Const.EventCode.CHANGE_STARTCLASS){
            tab_bar.currentTab = 1
            onTabSelect(1)
        }else if(e.code == Const.EventCode.CHANGE_WELFARE){
            tab_bar.currentTab = 2
            onTabSelect(2)
app/src/main/java/com/dollearn/student/network/ApiService.kt
@@ -651,6 +651,12 @@
    @POST(Apis.exitLearning)
    fun exitLearning(@Body body: String): Flowable<ResultData<Any>>
    @POST(Apis.completeLearning)
    fun completeLearning(@Body body: String): Flowable<ResultData<Any>>
    @GET(Apis.teamSchedule)
    fun teamSchedule(@Query("day") day:Int,@Query("type") type:Int,@Query("week") week:Int): Flowable<ResultData<ProgressBean>>
    @FormUrlEncoded
    @POST
    fun listOfStu(@Url url: String,@Field("isPre") isPre: Int?): Flowable<ResultData<List<Student>>>
@@ -681,6 +687,18 @@
    @GET(Apis.listenSelectPicture)
    fun listenSelectPicture(@Query("day")day:Int,@Query("quarter")quarter:Int,@Query("week")week:Int): Flowable<ResultData<SubjectBean>>
    @GET(Apis.pictureSelectVoice)
    fun pictureSelectVoice(@Query("day")day:Int,@Query("quarter")quarter:Int,@Query("week")week:Int): Flowable<ResultData<SubjectBean>>
    @GET(Apis.induceExclude)
    fun induceExclude(@Query("day")day:Int,@Query("quarter")quarter:Int,@Query("week")week:Int): Flowable<ResultData<SubjectBean>>
    @GET(Apis.questionsAndAnswers)
    fun questionsAndAnswers(@Query("day")day:Int,@Query("quarter")quarter:Int,@Query("week")week:Int): Flowable<ResultData<SubjectBean>>
    @GET(Apis.pictureMateVoice)
    fun pictureMateVoice(@Query("day")day:Int,@Query("quarter")quarter:Int,@Query("week")week:Int): Flowable<ResultData<SubjectBean>>
    @GET(Apis.redeemNow)
    fun redeemNow(@Query("goodId")goodId:String): Flowable<ResultData<GoodsOrder>>
app/src/main/java/com/dollearn/student/network/Apis.kt
@@ -3,9 +3,8 @@
object Apis {
    private var isTest = true
    private const val TEST_URL = "http://192.168.110.237:9000/" //周帅内网
//    private const val TEST_URL = "http://221.182.45.100:56666/" //内网穿透
//    private const val TEST_URL = "http://8.137.22.229:56666/" //外网
//    private const val TEST_URL = "http://192.168.110.237:9000/" //周帅内网
    private const val TEST_URL = "http://1.95.15.237:9000/" //外网
    private const val LINE_URL = "http://8.137.22.229:56666/" //正式服
    val BASE_URL = if (isTest) TEST_URL else LINE_URL
@@ -61,7 +60,13 @@
     * 学习
     */
    const val listenSelectPicture = "study/base/study/listenSelectPicture"
    const val pictureSelectVoice = "study/base/study/pictureSelectVoice"
    const val induceExclude = "study/base/study/induceExclude"
    const val questionsAndAnswers = "study/base/study/questionsAndAnswers"
    const val pictureMateVoice = "study/base/study/pictureMateVoice"
    const val exitLearning = "study/base/study/exitLearning"
    const val teamSchedule = "study/base/study/teamSchedule"
    const val completeLearning = "study/base/study/completeLearning"
    /**
app/src/main/java/com/dollearn/student/network/HttpManager.kt
@@ -781,8 +781,22 @@
    /**
     * 保存进度
     */
    fun exitLearning(day: Int,week: Int,type: Int,teamIds:String,topicIds:String): Flowable<ResultData<Any>> {
        return request().exitLearning(Gson().toJson(ReqSaveProgress(day, week, type, teamIds, topicIds)))
    fun exitLearning(answerNumber: Int,correctNumber: Int,day: Int,week: Int,type: Int,teamIds:String,topicIds:String): Flowable<ResultData<Any>> {
        return request().exitLearning(Gson().toJson(ReqSaveProgress(answerNumber,correctNumber,day, week, type, teamIds, topicIds)))
    }
    /**
     * 完成学习
     */
    fun completeLearning(rate: Int,time: Int,day: Int,week: Int,season: Int,type: Int,teamIds:String): Flowable<ResultData<Any>> {
        return request().completeLearning(Gson().toJson(ReqFinishStudy(rate,day,season,teamIds,time,type,week)))
    }
    /**
     * 回复进度
     */
    fun teamSchedule(day: Int,week: Int,type: Int): Flowable<ResultData<ProgressBean>> {
        return request().teamSchedule(day, type, week)
    }
    /**
@@ -950,6 +964,27 @@
    }
    /**
     * 看图选音题
     */
    fun pictureSelectVoice(season: Int,week: Int,day: Int): Flowable<ResultData<SubjectBean>> {
        return request().pictureSelectVoice(day,season,week)
    }
    /**
     * 归纳排除
     */
    fun induceExclude(season: Int,week: Int,day: Int): Flowable<ResultData<SubjectBean>> {
        return request().induceExclude(day,season,week)
    }
    /**
     * 音图配
     */
    fun pictureMateVoice(season: Int,week: Int,day: Int): Flowable<ResultData<SubjectBean>> {
        return request().pictureMateVoice(day,season,week)
    }
    /**
     * 立即兑换
     */
    fun redeemNow(id:String): Flowable<ResultData<GoodsOrder>> {
app/src/main/java/com/dollearn/student/network/entity/Banner.kt
@@ -94,10 +94,7 @@
                    }
                }
            }
            "开始课程"-> {
                EventBus.getDefault().post(EmptyEvent(Const.EventCode.CHANGE_STARTCLASS))
                context.startActivity<MainActivity>()
            }
            "使用福利"-> {
                when(page) {
                    "主页"->{
app/src/main/java/com/dollearn/student/network/entity/ProgressBean.kt
New file
@@ -0,0 +1,7 @@
package com.dollearn.student.network.entity
data class ProgressBean(
    val topicIds: List<String>,
    val answerNumber: Int,
    val correctNumber: Int
)
app/src/main/java/com/dollearn/student/network/entity/ReqFinishStudy.kt
New file
@@ -0,0 +1,11 @@
package com.dollearn.student.network.entity
data class ReqFinishStudy(
    val accuracy: Int,
    val day: Int,
    val quarter: Int,
    val studyIds: String,
    val studyTime: Int,
    val type: Int,
    val week: Int
)
app/src/main/java/com/dollearn/student/network/entity/ReqSaveProgress.kt
@@ -1,6 +1,8 @@
package com.dollearn.student.network.entity
data class ReqSaveProgress(
    val answerNumber:Int,
    val correctNumber:Int,
    val day:Int,
    val week:Int,
    val type:Int,
app/src/main/java/com/dollearn/student/network/entity/SubjectBean.kt
@@ -20,9 +20,11 @@
    val correct: String,
    val english: String,
    val error: String?,
    val id: Int,
    val id: String,
    val img: String,
    val name: String,
    val state: Int,
    val type: String
    val type: String,
    var completed:Boolean = false, //已作答
    var listend:Boolean = false //已听音 归纳排除题需要
):Parcelable
app/src/main/java/com/dollearn/student/ui/course/CourseActivity.kt
@@ -166,9 +166,7 @@
    @Subscribe
    fun onSwitch(e: EmptyEvent) {
        if (e.code == Const.EventCode.CHANGE_STARTCLASS) {
            finish()
        }
    }
    override fun onDestroy() {
app/src/main/java/com/dollearn/student/ui/course/CourseDetailActivity.kt
@@ -75,9 +75,7 @@
    @Subscribe
    fun onSwitch(e: EmptyEvent) {
        if (e.code == Const.EventCode.CHANGE_STARTCLASS) {
            finish()
        }
    }
    override fun onDestroy() {
app/src/main/java/com/dollearn/student/ui/course/JoinCourseActivity.kt
@@ -197,9 +197,7 @@
    @Subscribe
    fun onSwitch(e: EmptyEvent) {
        if (e.code == Const.EventCode.CHANGE_STARTCLASS) {
            finish()
        }
    }
    private fun refreshPrice(data: Lesson?,changeByCoupon:Boolean = false) {
app/src/main/java/com/dollearn/student/ui/course/UnPayCourseDetailActivity.kt
@@ -166,9 +166,7 @@
    @Subscribe
    fun onSwitch(e: EmptyEvent) {
        if (e.code == Const.EventCode.CHANGE_STARTCLASS) {
            finish()
        }
    }
    override fun onPaySuccess() {
app/src/main/java/com/dollearn/student/ui/course/adapter/MedalAdapter.kt
@@ -9,9 +9,7 @@
import com.dollearn.student.network.entity.Medal
import com.dollearn.student.ui.course.PracticeListActivity
import com.dollearn.student.ui.home.FieldActivity
import com.dollearn.student.ui.home.MatchActivity
import com.dollearn.student.ui.worldcup.MyWorldActivity
import com.dollearn.student.ui.worldcup.MyWorldInfoActivity
import org.jetbrains.anko.imageResource
import org.jetbrains.anko.startActivity
import java.util.ArrayList
@@ -29,7 +27,6 @@
            setOnClickListener {
                when(data.medalType){
                    1->(context as BaseActivity).finish()
                    2->context.startActivity<MatchActivity>()
                    3->context.startActivity<FieldActivity>()
                    4->context.startActivity<PracticeListActivity>("stuId" to stuId)
                    5->context.startActivity<MyWorldActivity>()
app/src/main/java/com/dollearn/student/ui/home/ChooseVoiceActivity.kt
New file
@@ -0,0 +1,152 @@
package com.dollearn.student.ui.home
import android.annotation.SuppressLint
import android.os.Handler
import android.os.Looper
import android.os.Message
import android.view.ViewGroup
import androidx.core.os.bundleOf
import androidx.fragment.app.Fragment
import androidx.fragment.app.FragmentPagerAdapter
import androidx.viewpager.widget.ViewPager
import cn.sinata.xldutils.gone
import cn.sinata.xldutils.visible
import com.dollearn.student.R
import com.dollearn.student.dialog.TipDialog
import com.dollearn.student.network.HttpManager
import com.dollearn.student.network.entity.SubjectBean
import com.dollearn.student.network.request
import com.dollearn.student.ui.TransparentStatusBarActivity
import kotlinx.android.synthetic.main.activity_listen.*
import org.jetbrains.anko.startActivity
class ChooseVoiceActivity:TransparentStatusBarActivity() {
    override fun setContentView() = R.layout.activity_listen
    private val day by lazy {
        intent.getIntExtra("day",0)
    }
    private val week by lazy {
        intent.getIntExtra("week",0)
    }
    private val season by lazy {
        intent.getIntExtra("season",0)
    }
    val data by lazy { intent.getParcelableExtra<SubjectBean>("data") }
    private val fragments    = arrayListOf<Fragment>()
    var totalCount = 0 //总答题次数
    var rightCount = 0 //正确答题次数
    var time = 0 //学习秒数
    private var handler: Handler? = null
    override fun initClick() {
        tv_last.setOnClickListener {
            (fragments[view_pager.currentItem-1] as ChooseVoiceFragment).recover()
            view_pager.setCurrentItem(view_pager.currentItem-1,true)
            if (view_pager.currentItem == 0)
                tv_last.gone()
        }
        tv_exit.setOnClickListener {
            onBackPressed()
        }
    }
    fun next(){
        if (view_pager.currentItem == fragments.lastIndex){
            handler?.removeMessages(0)
            ResultActivity.startResult(this,day,week,season,1,totalCount,rightCount,data!!.data.integral,time,data!!.data.id)
            finish()
        }else{
            (fragments[view_pager.currentItem+1] as ChooseVoiceFragment).recover()
            view_pager.setCurrentItem(view_pager.currentItem+1,true)
            tv_last.visible()
        }
    }
    override fun initView() {
        data?.apply {
            tv_progress.text = "已完成:1/${subjectList.size}"
            subjectList.forEachIndexed { index, subject ->
                fragments.add(ChooseVoiceFragment.getInstance(index))
            }
            view_pager.adapter = @SuppressLint("WrongConstant")
            object : FragmentPagerAdapter(supportFragmentManager,0) {
                override fun getItem(p0: Int): Fragment {
                    return fragments[p0]
                }
                override fun getCount(): Int {
                    return fragments.size
                }
                override fun destroyItem(container: ViewGroup, position: Int, `object`: Any) {
                }
            }
            view_pager.offscreenPageLimit = fragments.size
            view_pager.addOnPageChangeListener(object :ViewPager.OnPageChangeListener{
                override fun onPageScrolled(
                    position: Int,
                    positionOffset: Float,
                    positionOffsetPixels: Int
                ) {
                }
                override fun onPageSelected(position: Int) {
                    tv_progress.text = "已完成:${position+1}/${fragments.size}"
                }
                override fun onPageScrollStateChanged(state: Int) {
                }
            })
        }
        handler= object :Handler(Looper.myLooper()!!){
            override fun handleMessage(msg: Message) {
                super.handleMessage(msg)
                if (msg.what == 0){
                    time++
                    handler?.sendEmptyMessageDelayed(0,1000L)
                }
            }
        }
        handler?.sendEmptyMessageDelayed(0,1000L)
        recover()
    }
    private fun recover(){
        HttpManager.teamSchedule(day,week,2).request(this){_,data->
//            view_pager.setCurrentItem(data?.topicIds?.size?:1,false)
            totalCount = data?.answerNumber?:0
            rightCount = data?.correctNumber?:0
        }
    }
    override fun onBackPressed() {
        val tipDialog = TipDialog()
        tipDialog.arguments = bundleOf("msg" to "未完成全部答题,确认退出吗?")
        tipDialog.setCallback(object :TipDialog.OnClickCallback{
            override fun onOk() {
                if (view_pager.currentItem == 0)
                    finish()
                else{
                    val list = (data?.subjectList?: arrayListOf()).subList(0,view_pager.currentItem).flatMap { it }
                    HttpManager.exitLearning(totalCount,rightCount,day,week,2,data?.data?.id?:"", list.joinToString(",") { it.id }).request(this@ChooseVoiceActivity){ _, _->
                        finish()
                    }
                }
            }
            override fun onCancel() {
            }
        })
        tipDialog.show(supportFragmentManager,"exit")
    }
    override fun onDestroy() {
        super.onDestroy()
        handler?.removeMessages(0)
        handler = null
    }
}
app/src/main/java/com/dollearn/student/ui/home/ChooseVoiceFragment.kt
New file
@@ -0,0 +1,384 @@
package com.dollearn.student.ui.home
import android.os.Handler
import android.os.Looper
import android.os.Message
import android.util.Log
import android.view.View
import androidx.constraintlayout.motion.widget.MotionLayout
import androidx.core.os.bundleOf
import cn.sinata.xldutils.fragment.BaseFragment
import cn.sinata.xldutils.gone
import cn.sinata.xldutils.utils.myToast
import cn.sinata.xldutils.visible
import com.dollearn.student.R
import com.dollearn.student.utils.AudioUtils
import com.dollearn.student.utils.extention.clickDelay
import kotlinx.android.synthetic.main.fragment_choose_voice.*
import org.jetbrains.anko.backgroundResource
import org.jetbrains.anko.support.v4.toast
class ChooseVoiceFragment : BaseFragment(), AudioUtils.OnAudioStatusUpdateListener {
    override fun contentViewId() = R.layout.fragment_choose_voice
    private val TAG = "Choose=======》"
    private var handler:Handler? = null
    private val list = 1
    private val PLAY_VOICE = 1
    private val TO_NEXT = 10
    private var voiceList = arrayListOf<String>() //本题音频,每题有3个音频
    private val player by lazy { AudioUtils() }
    private val group by lazy { arguments?.getInt("group")?:0 }
    private val data by lazy {
        (requireActivity() as ChooseVoiceActivity).data
    }
    private var currentIndex = 0 //本题组的图片序号,0-3取值
    private var voiceIndex = -1 //点击播放的声音序号 0-2取值 3-6代表下面图片上的语音
    private var playing = false //播放中,不能有任何操作
    private val nameViews by lazy { arrayListOf(tv_1,tv_2,tv_3,tv_4) }
    private val endViews by lazy { arrayListOf(cl_voice_end_1,cl_voice_end_2,cl_voice_end_3,cl_voice_end_4) }
    private val act by lazy { (requireActivity() as ChooseVoiceActivity) }
    override fun onFirstVisibleToUser() {
        player.setOnAudioStatusUpdateListener(this)
        player.stopPlayMusic()
        handler = object : Handler(Looper.getMainLooper()){
            override fun handleMessage(msg: Message) {
                super.handleMessage(msg)
                when(msg.what){
                    PLAY_VOICE->{
                        player.startPlayMusic(requireContext(),voiceList[voiceIndex])
                    }
                    TO_NEXT->{
                        if (isAdded&&!playing)
                            (requireActivity() as ChooseVoiceActivity).next()
                    }
                }
            }
        }
        data?.apply {
            val originList = subjectList[group]
            iv_1.setImageURI(originList[0].img)
            iv_2.setImageURI(originList[1].img)
            iv_3.setImageURI(originList[2].img)
            iv_4.setImageURI(originList[3].img)
        }
        showSubImage()
        initClick()
    }
    private fun initClick() {
        cl_voice1.clickDelay {
            if (playing)
                return@clickDelay
            voiceIndex = 0
            handler?.sendEmptyMessage(PLAY_VOICE)
        }
        cl_voice2.clickDelay {
            if (playing)
                return@clickDelay
            voiceIndex = 1
            handler?.sendEmptyMessage(PLAY_VOICE)
        }
        cl_voice3.clickDelay {
            if (playing)
                return@clickDelay
            voiceIndex = 2
            handler?.sendEmptyMessage(PLAY_VOICE)
        }
        rl_check_1.clickDelay {
            if (playing)
                return@clickDelay
            dot_1.visible()
            act.totalCount++
            if (voiceList[0] == data!!.subjectList[group][currentIndex].correct){
                act.rightCount++
                data!!.subjectList[group][currentIndex].completed = true
                motion.transitionToEnd()
                cl_voice1.callOnClick()
            }else{
                iv_error_1.visible()
                dot_1.postDelayed({
                    iv_error_1.gone()
                    dot_1.gone()
                },2000)
            }
        }
        rl_check_2.clickDelay {
            if (playing)
                return@clickDelay
            dot_2.visible()
            act.totalCount++
            if (voiceList[1] == data!!.subjectList[group][currentIndex].correct){
                act.rightCount++
                data!!.subjectList[group][currentIndex].completed = true
                motion.transitionToEnd()
                cl_voice2.callOnClick()
            }else{
                iv_error_2.visible()
                dot_1.postDelayed({
                    dot_2.gone()
                    iv_error_2.gone()
                },2000)
            }
        }
        rl_check_3.clickDelay {
            if (playing)
                return@clickDelay
            dot_3.visible()
            act.totalCount++
            if (voiceList[2] == data!!.subjectList[group][currentIndex].correct){
                data!!.subjectList[group][currentIndex].completed = true
                act.rightCount++
                motion.transitionToEnd()
                cl_voice3.callOnClick()
            }else{
                iv_error_3.visible()
                dot_1.postDelayed({
                    iv_error_3.gone()
                    dot_3.gone()
                },2000)
            }
        }
        cl_voice_end_1.clickDelay {
            if (!playing){
                voiceIndex = 3
                player.startPlayMusic(requireContext(),data!!.subjectList[group][0].correct)
            }
        }
        cl_voice_end_2.clickDelay {
            if (!playing){
                voiceIndex = 4
                player.startPlayMusic(requireContext(),data!!.subjectList[group][1].correct)
            }
        }
        cl_voice_end_3.clickDelay {
            if (!playing){
                voiceIndex = 5
                player.startPlayMusic(requireContext(),data!!.subjectList[group][2].correct)
            }
        }
        cl_voice_end_4.clickDelay {
            if (!playing){
                voiceIndex = 6
                player.startPlayMusic(requireContext(),data!!.subjectList[group][3].correct)
            }
        }
    }
    /**
     * 展示题组内的小题
     */
    private fun showSubImage(){
        rl_check_1.gone()
        rl_check_2.gone()
        rl_check_3.gone()
        dot_1.gone()
        dot_2.gone()
        dot_3.gone()
        val originList = data?.subjectList!![group]
        val imageNow = originList[currentIndex]
        val list = arrayListOf<String>()
        list.add(imageNow.correct)
        list.addAll((imageNow.error?:"").split(","))
        val shuffledList = list.shuffled()
        voiceList.clear()
        voiceList.addAll(shuffledList)
        nameViews.forEachIndexed { index, textView ->
            if (index == currentIndex){
                textView.text = originList[index].name
                textView.backgroundResource = R.color.textColor99
            }else{
                textView.text = ""
                textView.backgroundResource = R.color.page_bg
            }
        }
        //设置动画飞行路径 3对4
        val rightVoiceIndex = voiceList.indexOf(imageNow.correct)
        var start = 0
        var end = 0
        when(rightVoiceIndex){
            0->{
                start = R.id.start_1
                when(currentIndex){
                    0-> end = R.id.end_1_1
                    1-> end = R.id.end_1_2
                    2-> end = R.id.end_1_3
                    3-> end = R.id.end_1_4
                }
            }
            1->{
                start = R.id.start_2
                when(currentIndex){
                    0-> end = R.id.end_2_1
                    1-> end = R.id.end_2_2
                    2-> end = R.id.end_2_3
                    3-> end = R.id.end_2_4
                }
            }
            2->{
                start = R.id.start_3
                when(currentIndex){
                    0-> end = R.id.end_3_1
                    1-> end = R.id.end_3_2
                    2-> end = R.id.end_3_3
                    3-> end = R.id.end_3_4
                }
            }
        }
        motion.progress = 0f
        motion.setTransition(start,end)
        motion.setTransitionListener(object :MotionLayout.TransitionListener{
            override fun onTransitionStarted(p0: MotionLayout?, p1: Int, p2: Int) {
            }
            override fun onTransitionChange(p0: MotionLayout?, p1: Int, p2: Int, p3: Float) {
            }
            override fun onTransitionCompleted(p0: MotionLayout?, p1: Int) {
                endViews[currentIndex].visible()
            }
            override fun onTransitionTrigger(p0: MotionLayout?, p1: Int, p2: Boolean, p3: Float) {
            }
        })
    }
    /**
     * 回到上一题,恢复状态
     */
    fun recover(){
        Log.e(TAG,"回到上一题,恢复答题前的状态")
        motion.progress = 0f
        currentIndex = 0
        endViews.forEach { it.gone() }
        data!!.subjectList[group].forEach { it.completed = false }
        showSubImage()
    }
    companion object{
        /**
         * @param group 题组号
         * @param index 组内序号
         */
        fun getInstance(group:Int):ChooseVoiceFragment{
            val listenFragment = ChooseVoiceFragment()
            listenFragment.arguments = bundleOf("group" to group)
            return listenFragment
        }
    }
    override fun onUpdate(db: Double, time: Long) {
    }
    override fun onStop(filePath: String?) {
    }
    override fun onStartPlay() {
        playing = true
        if (voiceIndex == 0){
            iv1_1.gone()
            iv2_1.gone()
            iv_playing_1.visible()
        }
        if (voiceIndex == 1){
            iv1_2.gone()
            iv2_2.gone()
            iv_playing_2.visible()
        }
        if (voiceIndex == 2){
            iv1_3.gone()
            iv2_3.gone()
            iv_playing_3.visible()
        }
        if (voiceIndex == 3){
            iv1_1_end.gone()
            iv2_1_end.gone()
            iv_playing_1_end.visible()
        }
        if (voiceIndex == 4){
            iv1_2_end.gone()
            iv2_2_end.gone()
            iv_playing_2_end.visible()
        }
        if (voiceIndex == 5){
            iv1_3_end.gone()
            iv2_3_end.gone()
            iv_playing_3_end.visible()
        }
        if (voiceIndex == 6){
            iv1_4_end.gone()
            iv2_4_end.gone()
            iv_playing_4_end.visible()
        }
    }
    override fun onFinishPlay() {
        playing = false
        if (voiceIndex == 0){
            rl_check_1.visible()
            iv1_1.visible()
            iv2_1.visible()
            iv_playing_1.gone()
        }
        if (voiceIndex == 1){
            rl_check_2.visible()
            iv1_2.visible()
            iv2_2.visible()
            iv_playing_2.gone()
        }
        if (voiceIndex == 2){
            rl_check_3.visible()
            iv1_3.visible()
            iv2_3.visible()
            iv_playing_3.gone()
        }
        if (voiceIndex == 3){
            iv1_1_end.visible()
            iv2_1_end.visible()
            iv_playing_1_end.gone()
        }
        if (voiceIndex == 4){
            iv1_2_end.visible()
            iv2_2_end.visible()
            iv_playing_2_end.gone()
        }
        if (voiceIndex == 5){
            iv1_3_end.visible()
            iv2_3_end.visible()
            iv_playing_3_end.gone()
        }
        if (voiceIndex == 6){
            iv1_4_end.visible()
            iv2_4_end.visible()
            iv_playing_4_end.gone()
        }
        if (data!!.subjectList[group][currentIndex].completed){ //本题已答对
            Log.e(TAG,"选对答案后的播放结束3秒后进入下一图")
            if (currentIndex == 3){
                handler?.sendEmptyMessageDelayed(TO_NEXT,3000)
            }else{
                currentIndex++
                showSubImage()
            }
        }
    }
}
app/src/main/java/com/dollearn/student/ui/home/DailyFragment.kt
@@ -12,6 +12,7 @@
import kotlinx.android.synthetic.main.fragment_daily.*
import org.jetbrains.anko.backgroundResource
import org.jetbrains.anko.support.v4.startActivityForResult
import org.jetbrains.anko.support.v4.toast
class DailyFragment : BaseFragment() {
    override fun contentViewId() = R.layout.fragment_daily
@@ -34,7 +35,31 @@
        cl_1.clickDelay {
            showDialog("加载题目...")
            HttpManager.listenSelectPicture(season, week, day).requestByF(this){_,data->
                startActivityForResult<ListenActivity>(1,"data" to data)
                startActivityForResult<ListenActivity>(1,"data" to data,"day" to day,"week" to week,"season" to season)
            }
        }
        cl_2.clickDelay {
            showDialog("加载题目...")
            HttpManager.pictureSelectVoice(season, week, day).requestByF(this){_,data->
                startActivityForResult<ChooseVoiceActivity>(1,"data" to data,"day" to day,"week" to week,"season" to season)
            }
        }
        cl_3.clickDelay {
            showDialog("加载题目...")
            HttpManager.induceExclude(season, week, day).requestByF(this){_,data->
                startActivityForResult<IncludeActivity>(1,"data" to data,"day" to day,"week" to week,"season" to season)
            }
        }
        cl_4.clickDelay {
            showDialog("加载题目...")
            HttpManager.induceExclude(season, week, day).requestByF(this){_,data->
//                startActivityForResult<IncludeActivity>(1,"data" to data,"day" to day,"week" to week,"season" to season)
            }
        }
        cl_5.clickDelay {
            showDialog("加载题目...")
            HttpManager.pictureMateVoice(season, week, day).requestByF(this){_,data->
//                startActivityForResult<IncludeActivity>(1,"data" to data,"day" to day,"week" to week,"season" to season)
            }
        }
    }
@@ -85,6 +110,23 @@
        }
    }
    fun nextSubject(type:Int){
        when(type){
            2->{
                cl_2.callOnClick()
            }
            3->{
                cl_3.callOnClick()
            }
            4->{
                cl_4.callOnClick()
            }
            5->{
                cl_5.callOnClick()
            }
        }
    }
    companion object{
        fun newInstance(day:Int):DailyFragment{
            val dailyFragment = DailyFragment()
app/src/main/java/com/dollearn/student/ui/home/IncludeActivity.kt
New file
@@ -0,0 +1,151 @@
package com.dollearn.student.ui.home
import android.annotation.SuppressLint
import android.os.Handler
import android.os.Looper
import android.os.Message
import android.view.ViewGroup
import androidx.core.os.bundleOf
import androidx.fragment.app.Fragment
import androidx.fragment.app.FragmentPagerAdapter
import androidx.viewpager.widget.ViewPager
import cn.sinata.xldutils.gone
import cn.sinata.xldutils.visible
import com.dollearn.student.R
import com.dollearn.student.dialog.TipDialog
import com.dollearn.student.network.HttpManager
import com.dollearn.student.network.entity.SubjectBean
import com.dollearn.student.network.request
import com.dollearn.student.ui.TransparentStatusBarActivity
import kotlinx.android.synthetic.main.activity_listen.*
class IncludeActivity:TransparentStatusBarActivity() {
    override fun setContentView() = R.layout.activity_listen
    private val day by lazy {
        intent.getIntExtra("day",0)
    }
    private val week by lazy {
        intent.getIntExtra("week",0)
    }
    private val season by lazy {
        intent.getIntExtra("season",0)
    }
    val data by lazy { intent.getParcelableExtra<SubjectBean>("data") }
    val fragments    = arrayListOf<Fragment>()
    var totalCount = 0 //总答题次数
    var rightCount = 0 //正确答题次数
    var time = 0 //学习秒数
    private var handler:Handler? = null
    override fun initClick() {
        tv_last.setOnClickListener {
            (fragments[view_pager.currentItem-1] as IncludeFragment).recover()
            view_pager.setCurrentItem(view_pager.currentItem-1,true)
            if (view_pager.currentItem == 0)
                tv_last.gone()
        }
        tv_exit.setOnClickListener {
            onBackPressed()
        }
    }
    fun next(){
        if (view_pager.currentItem == fragments.lastIndex){
            handler?.removeMessages(0)
            ResultActivity.startResult(this,day,week,season,3,totalCount,rightCount,data!!.data.integral,time,data!!.data.id)
            finish()
        }else{
            (fragments[view_pager.currentItem+1] as IncludeFragment).recover()
            view_pager.setCurrentItem(view_pager.currentItem+1,true)
            tv_last.visible()
        }
    }
    override fun initView() {
        data?.apply {
            tv_progress.text = "已完成:1/${subjectList.size}"
            subjectList.forEachIndexed { index, subject ->
                fragments.add(IncludeFragment.getInstance(index))
            }
            view_pager.adapter = @SuppressLint("WrongConstant")
            object : FragmentPagerAdapter(supportFragmentManager,0) {
                override fun getItem(p0: Int): Fragment {
                    return fragments[p0]
                }
                override fun getCount(): Int {
                    return fragments.size
                }
                override fun destroyItem(container: ViewGroup, position: Int, `object`: Any) {
                }
            }
            view_pager.offscreenPageLimit = fragments.size
            view_pager.addOnPageChangeListener(object :ViewPager.OnPageChangeListener{
                override fun onPageScrolled(
                    position: Int,
                    positionOffset: Float,
                    positionOffsetPixels: Int
                ) {
                }
                override fun onPageSelected(position: Int) {
                    tv_progress.text = "已完成:${position+1}/${subjectList.size}"
                }
                override fun onPageScrollStateChanged(state: Int) {
                }
            })
        }
        recover()
        handler= object :Handler(Looper.myLooper()!!){
            override fun handleMessage(msg: Message) {
                super.handleMessage(msg)
                if (msg.what == 0){
                    time++
                    handler?.sendEmptyMessageDelayed(0,1000L)
                }
            }
        }
        handler?.sendEmptyMessageDelayed(0,1000L)
    }
    private fun recover(){
        HttpManager.teamSchedule(day,week,3).request(this){_,data->
            view_pager.setCurrentItem(data?.topicIds?.size?:0,false)
            totalCount = data?.answerNumber?:0
            rightCount = data?.correctNumber?:0
        }
    }
    override fun onBackPressed() {
        val tipDialog = TipDialog()
        tipDialog.arguments = bundleOf("msg" to "未完成全部答题,确认退出吗?")
        tipDialog.setCallback(object :TipDialog.OnClickCallback{
            override fun onOk() {
                if (view_pager.currentItem == 0)
                    finish()
                else{
                    val list = (data?.subjectList?: arrayListOf()).flatMap { it }.subList(0,view_pager.currentItem)
                    HttpManager.exitLearning(totalCount,rightCount,day,week,3,data?.data?.id?:"", list.joinToString(",") { it.id }).request(this@IncludeActivity){ _, _->
                        finish()
                    }
                }
            }
            override fun onCancel() {
            }
        })
        tipDialog.show(supportFragmentManager,"exit")
    }
    override fun onDestroy() {
        super.onDestroy()
        handler?.removeMessages(0)
        handler = null
    }
}
app/src/main/java/com/dollearn/student/ui/home/IncludeFragment.kt
New file
@@ -0,0 +1,391 @@
package com.dollearn.student.ui.home
import android.os.Handler
import android.os.Looper
import android.os.Message
import android.util.Log
import androidx.constraintlayout.motion.widget.MotionLayout
import androidx.core.os.bundleOf
import cn.sinata.xldutils.fragment.BaseFragment
import cn.sinata.xldutils.gone
import cn.sinata.xldutils.utils.myToast
import cn.sinata.xldutils.visible
import com.dollearn.student.R
import com.dollearn.student.utils.AudioUtils
import com.dollearn.student.utils.extention.clickDelay
import kotlinx.android.synthetic.main.fragment_include.*
class IncludeFragment : BaseFragment(), AudioUtils.OnAudioStatusUpdateListener {
    override fun contentViewId() = R.layout.fragment_include
    private val TAG = "Include=======》"
    private var handler:Handler? = null
    private val PLAY_VOICE = 1
    private val TO_NEXT = 2
    private val player by lazy { AudioUtils() }
    private val group by lazy { arguments?.getInt("group")?:0 }
    private val data by lazy {
        (requireActivity() as IncludeActivity).data
    }
    private val act by lazy { requireActivity() as IncludeActivity }
    private var voiceIndex = -1 //点击播放的声音序号 0-5取值
    private val voiceViews by lazy { arrayListOf(cl_voice1,cl_voice2,cl_voice3,cl_voice4,cl_voice5,cl_voice6) }
    private var playing = false
    private val answerImg = arrayListOf<String>() //随机答案图片
    private var currentImage = 0 //当前作答的题号:2,4,5
    override fun onFirstVisibleToUser() {
        player.setOnAudioStatusUpdateListener(this)
        player.stopPlayMusic()
        handler = object : Handler(Looper.getMainLooper()){
            override fun handleMessage(msg: Message) {
                super.handleMessage(msg)
                when(msg.what){
                    PLAY_VOICE->{
                        player.startPlayMusic(requireContext(),data!!.subjectList[group][voiceIndex].correct)
                    }
                    TO_NEXT->{
                        if (isAdded&&!playing){
                            (requireActivity() as IncludeActivity).next()
                        }
                    }
                }
            }
        }
        data?.apply {
            val originList = subjectList[group]
            iv_1.setImageURI(originList[0].img)
            iv_2.setImageURI(originList[1].img)
            iv_4.setImageURI(originList[3].img)
            answerImg.clear()
            answerImg.add(originList[2].img)
            answerImg.add(originList[4].img)
            answerImg.add(originList[5].img)
        }
        voiceViews.forEachIndexed { index, constraintLayout ->
            if (index == 0)
                constraintLayout.isEnabled = true
            else{
                if (index == 3||index == 5)
                    constraintLayout.isEnabled = data!!.subjectList[group][index-1].completed
                else
                    constraintLayout.isEnabled = data!!.subjectList[group][index].listend
            }
        }
        showVoiceEnable()
        initClick()
    }
    private fun initClick() {
        voiceViews.forEachIndexed { index, constraintLayout ->
            constraintLayout.clickDelay {
                if (!playing){
                    if (index!=0&&!data!!.subjectList[group][index-1].listend){
                        myToast("请按顺序听语音")
                        return@clickDelay
                    }
                    voiceIndex = index
                    handler?.sendEmptyMessage(PLAY_VOICE)
                }
            }
        }
        cl_answer_1.clickDelay {
            if (currentImage == 0)
                return@clickDelay
            val subject = data!!.subjectList[group][currentImage]
            if (!subject.listend||subject.completed){
                return@clickDelay
            }
            act.totalCount++
            if (answerImg[0] == subject.img){
                act.rightCount++
                data!!.subjectList[group][currentImage].completed = true
                voiceViews[currentImage].callOnClick()
                motion.transitionToEnd()
            }else{
                iv_error_1.visible()
                iv_error_1.postDelayed({
                    clearAnswerImg()
                },3000)
            }
        }
        cl_answer_2.clickDelay {
            if (currentImage == 0)
                return@clickDelay
            val subject = data!!.subjectList[group][currentImage]
            if (!subject.listend||subject.completed){
                return@clickDelay
            }
            if (answerImg[1] == subject.img){
                data!!.subjectList[group][currentImage].completed = true
                voiceViews[currentImage].callOnClick()
                motion.transitionToEnd()
            }else{
                iv_error_2.visible()
                iv_error_2.postDelayed({
                    clearAnswerImg()
                },3000)
            }
        }
        cl_answer_3.clickDelay {
            if (currentImage == 0)
                return@clickDelay
            val subject = data!!.subjectList[group][currentImage]
            if (!subject.listend||subject.completed){
                return@clickDelay
            }
            if (answerImg[2] == subject.img){
                data!!.subjectList[group][currentImage].completed = true
                voiceViews[currentImage].callOnClick()
                motion.transitionToEnd()
            }else{
                iv_error_3.visible()
                iv_error_3.postDelayed({
                    clearAnswerImg()
                },3000)
            }
        }
    }
    private fun showVoiceEnable(){
        voiceViews.forEachIndexed { index, constraintLayout ->
            if (index == 0)
                constraintLayout.isEnabled = true
            else{
                if (index == 3||index == 5)
                    constraintLayout.isEnabled = data!!.subjectList[group][index-1].completed
                else
                    constraintLayout.isEnabled = data!!.subjectList[group][index-1].listend
            }
        }
    }
    private fun clearAnswerImg(){
        iv_answer_1.setImageURI("")
        iv_answer_2.setImageURI("")
        iv_answer_3.setImageURI("")
        iv_3.setImageURI("")
        iv_5.setImageURI("")
        iv_6.setImageURI("")
        iv_full_1.gone()
        iv_full_2.gone()
        iv_full_3.gone()
        iv_error_1.gone()
        iv_error_2.gone()
        iv_error_3.gone()
        data!!.subjectList[group][currentImage].listend = false
    }
    private fun showAnswerImg(){
        answerImg.shuffle()
        iv_answer_1.setImageURI(answerImg[0])
        iv_answer_2.setImageURI(answerImg[1])
        iv_answer_3.setImageURI(answerImg[2])
        iv_full_1.visible()
        iv_full_2.visible()
        iv_full_3.visible()
        val voiceNow = data!!.subjectList[group][currentImage]
        //设置动画飞行路径 3对3
        val rightImageIndex = answerImg.indexOf(voiceNow.img)
        var start = 0
        var end = 0
        when(rightImageIndex){
            0->{
                start = R.id.start_1
                when(currentImage){
                    2-> end = R.id.end_1_1
                    4-> end = R.id.end_1_2
                    5-> end = R.id.end_1_3
                }
            }
            1->{
                start = R.id.start_2
                when(currentImage){
                    2-> end = R.id.end_2_1
                    4-> end = R.id.end_2_2
                    5-> end = R.id.end_2_3
                }
            }
            2->{
                start = R.id.start_3
                when(currentImage){
                    2-> end = R.id.end_3_1
                    4-> end = R.id.end_3_2
                    5-> end = R.id.end_3_3
                }
            }
        }
        motion.progress = 0f
        motion.setTransition(start,end)
        motion.setTransitionListener(object : MotionLayout.TransitionListener{
            override fun onTransitionStarted(p0: MotionLayout?, p1: Int, p2: Int) {
                when(rightImageIndex){
                    0->{
                        iv_full_1.gone()
                    }
                    1->{
                        iv_full_2.gone()
                    }
                    2->{
                        iv_full_3.gone()
                    }
                }
            }
            override fun onTransitionChange(p0: MotionLayout?, p1: Int, p2: Int, p3: Float) {
            }
            override fun onTransitionCompleted(p0: MotionLayout?, p1: Int) {
                when(currentImage){
                    2->{
                        iv_3.setImageURI(data!!.subjectList[group][2].img)
                    }
                    4->{
                        iv_5.setImageURI(data!!.subjectList[group][4].img)
                    }
                    5->{
                        iv_6.setImageURI(data!!.subjectList[group][5].img)
                    }
                }
            }
            override fun onTransitionTrigger(p0: MotionLayout?, p1: Int, p2: Boolean, p3: Float) {
            }
        })
    }
    /**
     * 回到上一题,恢复状态
     */
    fun recover(){
        Log.e(TAG,"回到上一题,恢复答题前的状态")
        motion.progress = 0f
        clearAnswerImg()
        currentImage = 0
        data!!.subjectList[group].forEach {
            it.completed = false
            it.listend = false
        }
        showVoiceEnable()
    }
    companion object{
        /**
         * @param group 题组号
         * @param index 组内序号
         */
        fun getInstance(group:Int):IncludeFragment{
            val listenFragment = IncludeFragment()
            listenFragment.arguments = bundleOf("group" to group)
            return listenFragment
        }
    }
    override fun onUpdate(db: Double, time: Long) {
    }
    override fun onStop(filePath: String?) {
    }
    override fun onStartPlay() {
        playing = true
        when(voiceIndex){
            0->{
                iv1_1.gone()
                iv2_1.gone()
                iv_playing_1.visible()
            }
            1->{
                iv1_2.gone()
                iv2_2.gone()
                iv_playing_2.visible()
            }
            2->{
                iv1_3.gone()
                iv2_3.gone()
                iv_playing_3.visible()
            }
            3->{
                iv1_4.gone()
                iv2_4.gone()
                iv_playing_4.visible()
            }
            4->{
                iv1_5.gone()
                iv2_5.gone()
                iv_playing_5.visible()
            }
            5->{
                iv1_6.gone()
                iv2_6.gone()
                iv_playing_6.visible()
            }
        }
    }
    override fun onFinishPlay() {
        playing = false
        val subject = data!!.subjectList[group][voiceIndex]
        subject.listend = true
        when(voiceIndex){
            0->{
                iv1_1.visible()
                iv2_1.visible()
                iv_playing_1.gone()
            }
            1->{
                iv1_2.visible()
                iv2_2.visible()
                iv_playing_2.gone()
            }
            2->{
                iv1_3.visible()
                iv2_3.visible()
                iv_playing_3.gone()
                if (!subject.completed){
                    currentImage = 2
                    showAnswerImg()
                }
            }
            3->{
                iv1_4.visible()
                iv2_4.visible()
                iv_playing_4.gone()
            }
            4->{
                iv1_5.visible()
                iv2_5.visible()
                iv_playing_5.gone()
                if (!subject.completed){
                    currentImage = 4
                    showAnswerImg()
                }
            }
            5->{
                iv1_6.visible()
                iv2_6.visible()
                iv_playing_6.gone()
                if (!subject.completed){
                    currentImage = 5
                    showAnswerImg()
                }else{
                    Log.e(TAG,"本题全部答对,3秒后进入下一图")
                    handler?.sendEmptyMessageDelayed(TO_NEXT,3000)
                }
            }
        }
        showVoiceEnable()
    }
}
app/src/main/java/com/dollearn/student/ui/home/ListenActivity.kt
@@ -2,6 +2,7 @@
import android.annotation.SuppressLint
import android.os.Handler
import android.os.Looper
import android.os.Message
import android.view.ViewGroup
import androidx.core.os.bundleOf
@@ -14,15 +15,31 @@
import com.dollearn.student.dialog.TipDialog
import com.dollearn.student.network.HttpManager
import com.dollearn.student.network.entity.SubjectBean
import com.dollearn.student.network.request
import com.dollearn.student.ui.TransparentStatusBarActivity
import com.dollearn.student.utils.AudioUtils
import kotlinx.android.synthetic.main.activity_listen.*
import org.jetbrains.anko.startActivity
class ListenActivity:TransparentStatusBarActivity() {
    override fun setContentView() = R.layout.activity_listen
    private val day by lazy {
        intent.getIntExtra("day",0)
    }
    private val week by lazy {
        intent.getIntExtra("week",0)
    }
    private val season by lazy {
        intent.getIntExtra("season",0)
    }
    val data by lazy { intent.getParcelableExtra<SubjectBean>("data") }
    private val fragments    = arrayListOf<Fragment>()
    val fragments    = arrayListOf<Fragment>()
    val viewPager by lazy { view_pager }
    var totalCount = 0 //总答题次数
    var rightCount = 0 //正确答题次数
    var time = 0 //学习秒数
    private var handler:Handler? = null
    override fun initClick() {
        tv_last.setOnClickListener {
@@ -38,9 +55,15 @@
    }
    fun next(){
        (fragments[view_pager.currentItem+1] as ListenFragment).recover()
        view_pager.setCurrentItem(view_pager.currentItem+1,true)
        tv_last.visible()
        if (view_pager.currentItem == fragments.lastIndex){
            handler?.removeMessages(0)
            ResultActivity.startResult(this,day,week,season,1,totalCount,rightCount,data!!.data.integral,time,data!!.data.id)
            finish()
        }else{
            (fragments[view_pager.currentItem+1] as ListenFragment).recover()
            view_pager.setCurrentItem(view_pager.currentItem+1,true)
            tv_last.visible()
        }
    }
    override fun initView() {
@@ -81,6 +104,25 @@
                }
            })
        }
        recover()
        handler= object :Handler(Looper.myLooper()!!){
            override fun handleMessage(msg: Message) {
                super.handleMessage(msg)
                if (msg.what == 0){
                    time++
                    handler?.sendEmptyMessageDelayed(0,1000L)
                }
            }
        }
        handler?.sendEmptyMessageDelayed(0,1000L)
    }
    private fun recover(){
        HttpManager.teamSchedule(day,week,1).request(this){_,data->
            view_pager.setCurrentItem(data?.topicIds?.size?:0,false)
            totalCount = data?.answerNumber?:0
            rightCount = data?.correctNumber?:0
        }
    }
    override fun onBackPressed() {
@@ -88,7 +130,14 @@
        tipDialog.arguments = bundleOf("msg" to "未完成全部答题,确认退出吗?")
        tipDialog.setCallback(object :TipDialog.OnClickCallback{
            override fun onOk() {
//                HttpManager.exitLearning()
                if (view_pager.currentItem == 0)
                    finish()
                else{
                    val list = (data?.subjectList?: arrayListOf()).flatMap { it }.subList(0,view_pager.currentItem)
                    HttpManager.exitLearning(totalCount,rightCount,day,week,1,data?.data?.id?:"", list.joinToString(",") { it.id }).request(this@ListenActivity){_,_->
                        finish()
                    }
                }
            }
            override fun onCancel() {
@@ -96,4 +145,10 @@
        })
        tipDialog.show(supportFragmentManager,"exit")
    }
    override fun onDestroy() {
        super.onDestroy()
        handler?.removeMessages(0)
        handler = null
    }
}
app/src/main/java/com/dollearn/student/ui/home/ListenFragment.kt
@@ -49,11 +49,16 @@
                super.handleMessage(msg)
                when(msg.what){
                    PLAY_VOICE->{
                        if (iv_playing.visibility != View.VISIBLE)
                        val listenActivity = activity as ListenActivity
                        val indexOf = listenActivity.fragments.indexOf(this@ListenFragment) //当前题目序号
                        if (iv_playing.visibility != View.VISIBLE&&indexOf == listenActivity.viewPager.currentItem){ //没有播放并且是当前题号
                            player.startPlayMusic(requireContext(),correctVoice)
                            Log.e(TAG,"播放声音:$indexOf,${correctVoice}")
                        }
                    }
                    TO_NEXT->{
                        (requireActivity() as ListenActivity).next()
                        if (isAdded)
                            (requireActivity() as ListenActivity).next()
                    }
                }
            }
@@ -127,6 +132,7 @@
                myToast("请先听题")
                return@clickDelay
            }
            (activity as ListenActivity).totalCount ++
            if (!hasRight){
                v.progress = 0f
                v.transitionToEnd()
@@ -147,6 +153,7 @@
                    })
                }else{
                    hasRight = true
                    (activity as ListenActivity).rightCount ++
                    motion.transitionToEnd()
                    handler?.sendEmptyMessage(PLAY_VOICE)
                }
app/src/main/java/com/dollearn/student/ui/home/MatchActivity.kt
@@ -1,212 +1,151 @@
package com.dollearn.student.ui.home
import android.Manifest
import android.view.animation.AnimationUtils
import androidx.recyclerview.widget.LinearLayoutManager
import android.annotation.SuppressLint
import android.os.Handler
import android.os.Looper
import android.os.Message
import android.view.ViewGroup
import androidx.core.os.bundleOf
import androidx.fragment.app.Fragment
import androidx.fragment.app.FragmentPagerAdapter
import androidx.viewpager.widget.ViewPager
import cn.sinata.xldutils.gone
import cn.sinata.xldutils.utils.SpanBuilder
import cn.sinata.xldutils.utils.myToast
import cn.sinata.xldutils.visible
import com.amap.api.location.AMapLocationListener
import com.dollearn.student.R
import com.dollearn.student.WeparkApplication
import com.dollearn.student.dialog.TipDialog
import com.dollearn.student.network.HttpManager
import com.dollearn.student.network.entity.CommonData
import com.dollearn.student.network.entity.Match
import com.dollearn.student.network.entity.SubjectBean
import com.dollearn.student.network.request
import com.dollearn.student.ui.TransparentStatusBarActivity
import com.dollearn.student.ui.home.adapter.FilterAdapter
import com.dollearn.student.ui.home.adapter.MatchAdapter
import com.dollearn.student.ui.home.adapter.OpenCityAdapter
import com.dollearn.student.utils.AMapKit
import com.dollearn.student.utils.extention.clickDelay
import com.dollearn.student.utils.extention.getInitial
import com.tbruyelle.rxpermissions2.RxPermissions
import kotlinx.android.synthetic.main.activity_match.*
import org.jetbrains.anko.startActivity
import org.jetbrains.anko.textColorResource
import kotlinx.android.synthetic.main.activity_listen.*
class MatchActivity : TransparentStatusBarActivity() {
    override fun setContentView() = R.layout.activity_match
class MatchActivity:TransparentStatusBarActivity() {
    override fun setContentView() = R.layout.activity_listen
    private val datas = arrayListOf<Match>()
    private val adapter = MatchAdapter(datas)
    private val day by lazy {
        intent.getIntExtra("day",0)
    }
    private val week by lazy {
        intent.getIntExtra("week",0)
    }
    private val season by lazy {
        intent.getIntExtra("season",0)
    }
    val data by lazy { intent.getParcelableExtra<SubjectBean>("data") }
    val fragments    = arrayListOf<Fragment>()
    private val index = arrayListOf(
        "A", "B", "C", "D", "E", "F", "G", "H", "I",
        "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z"
    )
    //筛选条件
    private val cityList = arrayListOf<CommonData>() //展示数据源(搜索后过滤)
    private val cityAdapter = OpenCityAdapter(cityList)
    var cityCode:String? = null //城市
    var condition:Int? = null //1=全部用户,2=仅限年度会员参与,3=仅限运动营成员参与
    var heatSort:String? = null //销量排序(asc=正序,desc=降序)
    var search:String? = null //搜索
    private val filters = arrayListOf("全部用户参与","仅限年度会员参与","仅限运动营成员参与") //筛选选项
    private val filterAdapter = FilterAdapter(filters)
    var totalCount = 0 //总答题次数
    var rightCount = 0 //正确答题次数
    var time = 0 //学习秒数
    private var handler:Handler? = null
    override fun initClick() {
        tv_search.clickDelay {
            val s = et_search.text.toString()
            search = if (s.isNullOrEmpty()) null else s
            refreshLayout.autoRefresh()
        tv_last.setOnClickListener {
            (fragments[view_pager.currentItem-1] as IncludeFragment).recover()
            view_pager.setCurrentItem(view_pager.currentItem-1,true)
            if (view_pager.currentItem == 0)
                tv_last.gone()
        }
        filterAdapter.setOnItemClickListener { view, position ->
            filterAdapter.checkedIndex = position
            filterAdapter.notifyDataSetChanged()
            cb_condition.isChecked = false
            condition = position+1
            cb_condition.text = if (position == 0) "全部用户" else if (position == 1) "仅限会员" else "仅限运动营成员"
            refreshLayout.autoRefresh()
        tv_exit.setOnClickListener {
            onBackPressed()
        }
        cityAdapter.setOnItemClickListener { view, position ->
            cb_city.isChecked = false
            cityCode = cityList[position].code
            cb_city.text = cityList[position].name
            refreshLayout.autoRefresh()
        }
        tv_current.setOnClickListener {
            if (WeparkApplication.cityCode.isNotEmpty()){
                cb_city.isChecked = false
                cityCode = WeparkApplication.cityCode
                cb_city.text = WeparkApplication.cityName
                refreshLayout.autoRefresh()
            }
        }
        tv_refresh.setOnClickListener {
            val subscribe =
                RxPermissions(this).request(Manifest.permission.ACCESS_FINE_LOCATION)
                    .subscribe {
                        if (it){
                            AMapKit.initLocation(this, AMapLocationListener {
                                WeparkApplication.lat = it.latitude
                                WeparkApplication.lon = it.longitude
                                WeparkApplication.province = it.province
                                WeparkApplication.provinceCode = "${it.adCode.substring(0,3)}000"
                                WeparkApplication.cityName = it.city
                                WeparkApplication.cityCode = "${it.adCode.substring(0,4)}00"
                                tv_current.text = it.city
                            })
                        }else
                            myToast("没有定位权限")
                    }
        }
        adapter.setOnItemClickListener { _, position ->
            startActivity<MatchDetailActivity>("id" to datas[position].id)
        }
        cb_city.setOnCheckedChangeListener { _, isChecked ->
            if (!isChecked)
                closeFilter()
            else{
                if (cb_condition.isChecked)
                    cb_condition.isChecked = false
                bg_filter.visible()
                cl_city.visible()
                val loadAnimation = AnimationUtils.loadAnimation(this, R.anim.popup_in_from_top)
                cl_city.startAnimation(loadAnimation)
            }
        }
        cb_condition.setOnCheckedChangeListener { _, isChecked ->
            if (!isChecked)
                closeFilter()
            else{
                if (cb_city.isChecked)
                    cb_city.isChecked = false
                bg_filter.visible()
                rv_condition.visible()
                val loadAnimation = AnimationUtils.loadAnimation(this, R.anim.popup_in_from_top)
                rv_condition.startAnimation(loadAnimation)
            }
        }
        tv_heat.clickDelay {
            if (cb_city.isChecked)
                cb_city.isChecked = false
            if (cb_condition.isChecked)
                cb_condition.isChecked = false
            tv_heat.textColorResource = R.color.colorPrimary
            if (heatSort == null||heatSort == "asc")
                heatSort = "desc"
            else
                heatSort = "asc"
            tv_heat.setCompoundDrawablesRelativeWithIntrinsicBounds(0,0,if (heatSort == "asc")R.mipmap.sort_asc else R.mipmap.sort_desc,0)
            refreshLayout.autoRefresh()
        }
        bg_filter.setOnClickListener {
            if (cb_condition.isChecked)
                cb_condition.isChecked = false
            else if (cb_city.isChecked)
                cb_city.isChecked = false
        }
        tv_record.setOnClickListener {
            startActivity<MyMatchActivity>()
    }
    fun next(){
        if (view_pager.currentItem == fragments.lastIndex){
            handler?.removeMessages(0)
            ResultActivity.startResult(this,day,week,season,3,totalCount,rightCount,data!!.data.integral,time,data!!.data.id)
            finish()
        }else{
            (fragments[view_pager.currentItem+1] as IncludeFragment).recover()
            view_pager.setCurrentItem(view_pager.currentItem+1,true)
            tv_last.visible()
        }
    }
    override fun initView() {
        if (WeparkApplication.cityName.isNotEmpty()){
            cb_city.text = WeparkApplication.cityName
            cityCode = WeparkApplication.cityCode
        data?.apply {
            tv_progress.text = "已完成:1/${subjectList.size}"
            subjectList.forEachIndexed { index, subject ->
                fragments.add(IncludeFragment.getInstance(index))
            }
            view_pager.adapter = @SuppressLint("WrongConstant")
            object : FragmentPagerAdapter(supportFragmentManager,0) {
                override fun getItem(p0: Int): Fragment {
                    return fragments[p0]
                }
                override fun getCount(): Int {
                    return fragments.size
                }
                override fun destroyItem(container: ViewGroup, position: Int, `object`: Any) {
                }
            }
            view_pager.offscreenPageLimit = fragments.size
            view_pager.addOnPageChangeListener(object :ViewPager.OnPageChangeListener{
                override fun onPageScrolled(
                    position: Int,
                    positionOffset: Float,
                    positionOffsetPixels: Int
                ) {
                }
                override fun onPageSelected(position: Int) {
                    tv_progress.text = "已完成:${position+1}/${subjectList.size}"
                }
                override fun onPageScrollStateChanged(state: Int) {
                }
            })
        }
        rv_course.layoutManager = LinearLayoutManager(this)
        rv_course.adapter = adapter
        refreshLayout.setOnRefreshListener {
            getData()
        }
        getData()
        //筛选
        rv_city.layoutManager = LinearLayoutManager(this)
        rv_city.adapter = cityAdapter
        side_bar.setOnSelectIndexItemListener { index ->
            (0 until cityList.size).forEach {
                if (index == cityList[it].name?.getInitial()) {
                    val manager = rv_city.layoutManager as LinearLayoutManager
                    manager.scrollToPositionWithOffset(it, 0)
                    return@setOnSelectIndexItemListener
        recover()
        handler= object :Handler(Looper.myLooper()!!){
            override fun handleMessage(msg: Message) {
                super.handleMessage(msg)
                if (msg.what == 0){
                    time++
                    handler?.sendEmptyMessageDelayed(0,1000L)
                }
            }
        }
        rv_condition.layoutManager = LinearLayoutManager(this)
        rv_condition.adapter = filterAdapter
        filterAdapter.checkedIndex = -1
        tv_current.text = SpanBuilder("当前城市:${WeparkApplication.cityName}").color(this,0,5,R.color.textColor).build()
        //获取城市筛选项数据
        getCity()
        handler?.sendEmptyMessageDelayed(0,1000L)
    }
    private fun getData(){
        HttpManager.queryCompetitionList(cityCode,condition,heatSort, search).request(this,success = {_,data->
            refreshLayout.finishRefresh()
            datas.clear()
            datas.addAll(data?: arrayListOf())
            adapter.notifyDataSetChanged()
        }){_,_->
            refreshLayout.finishRefresh(false)
    private fun recover(){
        HttpManager.teamSchedule(day,week,3).request(this){_,data->
            view_pager.setCurrentItem(data?.topicIds?.size?:0,false)
            totalCount = data?.answerNumber?:0
            rightCount = data?.correctNumber?:0
        }
    }
    private fun getCity(){
        HttpManager.queryAllCity().request(this){_,data->
            data?.let {
                cityList.clear()
                index.forEach { index->
                    it.filter { it.name.isNotEmpty() }.forEach {
                        if (index == it.name.getInitial()){
                            cityList.add(it)
                        }
    override fun onBackPressed() {
        val tipDialog = TipDialog()
        tipDialog.arguments = bundleOf("msg" to "未完成全部答题,确认退出吗?")
        tipDialog.setCallback(object :TipDialog.OnClickCallback{
            override fun onOk() {
                if (view_pager.currentItem == 0)
                    finish()
                else{
                    val list = (data?.subjectList?: arrayListOf()).flatMap { it }.subList(0,view_pager.currentItem)
                    HttpManager.exitLearning(totalCount,rightCount,day,week,3,data?.data?.id?:"", list.joinToString(",") { it.id }).request(this@MatchActivity){ _, _->
                        finish()
                    }
                }
                adapter.notifyDataSetChanged()
            }
        }
            override fun onCancel() {
            }
        })
        tipDialog.show(supportFragmentManager,"exit")
    }
    private fun closeFilter(){
        bg_filter.gone()
        rv_condition.gone()
        cl_city.gone()
    override fun onDestroy() {
        super.onDestroy()
        handler?.removeMessages(0)
        handler = null
    }
}
app/src/main/java/com/dollearn/student/ui/home/MatchFragment.kt
New file
@@ -0,0 +1,391 @@
package com.dollearn.student.ui.home
import android.os.Handler
import android.os.Looper
import android.os.Message
import android.util.Log
import androidx.constraintlayout.motion.widget.MotionLayout
import androidx.core.os.bundleOf
import cn.sinata.xldutils.fragment.BaseFragment
import cn.sinata.xldutils.gone
import cn.sinata.xldutils.utils.myToast
import cn.sinata.xldutils.visible
import com.dollearn.student.R
import com.dollearn.student.utils.AudioUtils
import com.dollearn.student.utils.extention.clickDelay
import kotlinx.android.synthetic.main.fragment_include.*
class MatchFragment : BaseFragment(), AudioUtils.OnAudioStatusUpdateListener {
    override fun contentViewId() = R.layout.fragment_include
    private val TAG = "Match=======》"
    private var handler:Handler? = null
    private val PLAY_VOICE = 1
    private val TO_NEXT = 2
    private val player by lazy { AudioUtils() }
    private val group by lazy { arguments?.getInt("group")?:0 }
    private val data by lazy {
        (requireActivity() as IncludeActivity).data
    }
    private val act by lazy { requireActivity() as IncludeActivity }
    private var voiceIndex = -1 //点击播放的声音序号 0-5取值
    private val voiceViews by lazy { arrayListOf(cl_voice1,cl_voice2,cl_voice3,cl_voice4,cl_voice5,cl_voice6) }
    private var playing = false
    private val answerImg = arrayListOf<String>() //随机答案图片
    private var currentImage = 0 //当前作答的题号:2,4,5
    override fun onFirstVisibleToUser() {
        player.setOnAudioStatusUpdateListener(this)
        player.stopPlayMusic()
        handler = object : Handler(Looper.getMainLooper()){
            override fun handleMessage(msg: Message) {
                super.handleMessage(msg)
                when(msg.what){
                    PLAY_VOICE->{
                        player.startPlayMusic(requireContext(),data!!.subjectList[group][voiceIndex].correct)
                    }
                    TO_NEXT->{
                        if (isAdded&&!playing){
                            (requireActivity() as IncludeActivity).next()
                        }
                    }
                }
            }
        }
        data?.apply {
            val originList = subjectList[group]
            iv_1.setImageURI(originList[0].img)
            iv_2.setImageURI(originList[1].img)
            iv_4.setImageURI(originList[3].img)
            answerImg.clear()
            answerImg.add(originList[2].img)
            answerImg.add(originList[4].img)
            answerImg.add(originList[5].img)
        }
        voiceViews.forEachIndexed { index, constraintLayout ->
            if (index == 0)
                constraintLayout.isEnabled = true
            else{
                if (index == 3||index == 5)
                    constraintLayout.isEnabled = data!!.subjectList[group][index-1].completed
                else
                    constraintLayout.isEnabled = data!!.subjectList[group][index].listend
            }
        }
        showVoiceEnable()
        initClick()
    }
    private fun initClick() {
        voiceViews.forEachIndexed { index, constraintLayout ->
            constraintLayout.clickDelay {
                if (!playing){
                    if (index!=0&&!data!!.subjectList[group][index-1].listend){
                        myToast("请按顺序听语音")
                        return@clickDelay
                    }
                    voiceIndex = index
                    handler?.sendEmptyMessage(PLAY_VOICE)
                }
            }
        }
        cl_answer_1.clickDelay {
            if (currentImage == 0)
                return@clickDelay
            val subject = data!!.subjectList[group][currentImage]
            if (!subject.listend||subject.completed){
                return@clickDelay
            }
            act.totalCount++
            if (answerImg[0] == subject.img){
                act.rightCount++
                data!!.subjectList[group][currentImage].completed = true
                voiceViews[currentImage].callOnClick()
                motion.transitionToEnd()
            }else{
                iv_error_1.visible()
                iv_error_1.postDelayed({
                    clearAnswerImg()
                },3000)
            }
        }
        cl_answer_2.clickDelay {
            if (currentImage == 0)
                return@clickDelay
            val subject = data!!.subjectList[group][currentImage]
            if (!subject.listend||subject.completed){
                return@clickDelay
            }
            if (answerImg[1] == subject.img){
                data!!.subjectList[group][currentImage].completed = true
                voiceViews[currentImage].callOnClick()
                motion.transitionToEnd()
            }else{
                iv_error_2.visible()
                iv_error_2.postDelayed({
                    clearAnswerImg()
                },3000)
            }
        }
        cl_answer_3.clickDelay {
            if (currentImage == 0)
                return@clickDelay
            val subject = data!!.subjectList[group][currentImage]
            if (!subject.listend||subject.completed){
                return@clickDelay
            }
            if (answerImg[2] == subject.img){
                data!!.subjectList[group][currentImage].completed = true
                voiceViews[currentImage].callOnClick()
                motion.transitionToEnd()
            }else{
                iv_error_3.visible()
                iv_error_3.postDelayed({
                    clearAnswerImg()
                },3000)
            }
        }
    }
    private fun showVoiceEnable(){
        voiceViews.forEachIndexed { index, constraintLayout ->
            if (index == 0)
                constraintLayout.isEnabled = true
            else{
                if (index == 3||index == 5)
                    constraintLayout.isEnabled = data!!.subjectList[group][index-1].completed
                else
                    constraintLayout.isEnabled = data!!.subjectList[group][index-1].listend
            }
        }
    }
    private fun clearAnswerImg(){
        iv_answer_1.setImageURI("")
        iv_answer_2.setImageURI("")
        iv_answer_3.setImageURI("")
        iv_3.setImageURI("")
        iv_5.setImageURI("")
        iv_6.setImageURI("")
        iv_full_1.gone()
        iv_full_2.gone()
        iv_full_3.gone()
        iv_error_1.gone()
        iv_error_2.gone()
        iv_error_3.gone()
        data!!.subjectList[group][currentImage].listend = false
    }
    private fun showAnswerImg(){
        answerImg.shuffle()
        iv_answer_1.setImageURI(answerImg[0])
        iv_answer_2.setImageURI(answerImg[1])
        iv_answer_3.setImageURI(answerImg[2])
        iv_full_1.visible()
        iv_full_2.visible()
        iv_full_3.visible()
        val voiceNow = data!!.subjectList[group][currentImage]
        //设置动画飞行路径 3对3
        val rightImageIndex = answerImg.indexOf(voiceNow.img)
        var start = 0
        var end = 0
        when(rightImageIndex){
            0->{
                start = R.id.start_1
                when(currentImage){
                    2-> end = R.id.end_1_1
                    4-> end = R.id.end_1_2
                    5-> end = R.id.end_1_3
                }
            }
            1->{
                start = R.id.start_2
                when(currentImage){
                    2-> end = R.id.end_2_1
                    4-> end = R.id.end_2_2
                    5-> end = R.id.end_2_3
                }
            }
            2->{
                start = R.id.start_3
                when(currentImage){
                    2-> end = R.id.end_3_1
                    4-> end = R.id.end_3_2
                    5-> end = R.id.end_3_3
                }
            }
        }
        motion.progress = 0f
        motion.setTransition(start,end)
        motion.setTransitionListener(object : MotionLayout.TransitionListener{
            override fun onTransitionStarted(p0: MotionLayout?, p1: Int, p2: Int) {
                when(rightImageIndex){
                    0->{
                        iv_full_1.gone()
                    }
                    1->{
                        iv_full_2.gone()
                    }
                    2->{
                        iv_full_3.gone()
                    }
                }
            }
            override fun onTransitionChange(p0: MotionLayout?, p1: Int, p2: Int, p3: Float) {
            }
            override fun onTransitionCompleted(p0: MotionLayout?, p1: Int) {
                when(currentImage){
                    2->{
                        iv_3.setImageURI(data!!.subjectList[group][2].img)
                    }
                    4->{
                        iv_5.setImageURI(data!!.subjectList[group][4].img)
                    }
                    5->{
                        iv_6.setImageURI(data!!.subjectList[group][5].img)
                    }
                }
            }
            override fun onTransitionTrigger(p0: MotionLayout?, p1: Int, p2: Boolean, p3: Float) {
            }
        })
    }
    /**
     * 回到上一题,恢复状态
     */
    fun recover(){
        Log.e(TAG,"回到上一题,恢复答题前的状态")
        motion.progress = 0f
        clearAnswerImg()
        currentImage = 0
        data!!.subjectList[group].forEach {
            it.completed = false
            it.listend = false
        }
        showVoiceEnable()
    }
    companion object{
        /**
         * @param group 题组号
         * @param index 组内序号
         */
        fun getInstance(group:Int):MatchFragment{
            val listenFragment = MatchFragment()
            listenFragment.arguments = bundleOf("group" to group)
            return listenFragment
        }
    }
    override fun onUpdate(db: Double, time: Long) {
    }
    override fun onStop(filePath: String?) {
    }
    override fun onStartPlay() {
        playing = true
        when(voiceIndex){
            0->{
                iv1_1.gone()
                iv2_1.gone()
                iv_playing_1.visible()
            }
            1->{
                iv1_2.gone()
                iv2_2.gone()
                iv_playing_2.visible()
            }
            2->{
                iv1_3.gone()
                iv2_3.gone()
                iv_playing_3.visible()
            }
            3->{
                iv1_4.gone()
                iv2_4.gone()
                iv_playing_4.visible()
            }
            4->{
                iv1_5.gone()
                iv2_5.gone()
                iv_playing_5.visible()
            }
            5->{
                iv1_6.gone()
                iv2_6.gone()
                iv_playing_6.visible()
            }
        }
    }
    override fun onFinishPlay() {
        playing = false
        val subject = data!!.subjectList[group][voiceIndex]
        subject.listend = true
        when(voiceIndex){
            0->{
                iv1_1.visible()
                iv2_1.visible()
                iv_playing_1.gone()
            }
            1->{
                iv1_2.visible()
                iv2_2.visible()
                iv_playing_2.gone()
            }
            2->{
                iv1_3.visible()
                iv2_3.visible()
                iv_playing_3.gone()
                if (!subject.completed){
                    currentImage = 2
                    showAnswerImg()
                }
            }
            3->{
                iv1_4.visible()
                iv2_4.visible()
                iv_playing_4.gone()
            }
            4->{
                iv1_5.visible()
                iv2_5.visible()
                iv_playing_5.gone()
                if (!subject.completed){
                    currentImage = 4
                    showAnswerImg()
                }
            }
            5->{
                iv1_6.visible()
                iv2_6.visible()
                iv_playing_6.gone()
                if (!subject.completed){
                    currentImage = 5
                    showAnswerImg()
                }else{
                    Log.e(TAG,"本题全部答对,3秒后进入下一图")
                    handler?.sendEmptyMessageDelayed(TO_NEXT,3000)
                }
            }
        }
        showVoiceEnable()
    }
}
app/src/main/java/com/dollearn/student/ui/home/ResultActivity.kt
New file
@@ -0,0 +1,58 @@
package com.dollearn.student.ui.home
import android.content.Context
import com.dollearn.student.MainActivity
import com.dollearn.student.R
import com.dollearn.student.network.HttpManager
import com.dollearn.student.network.request
import com.dollearn.student.ui.TransparentStatusBarActivity
import com.dollearn.student.utils.Const
import com.dollearn.student.utils.event.IntEvent
import com.dollearn.student.utils.extention.clickDelay
import kotlinx.android.synthetic.main.activity_result.*
import org.greenrobot.eventbus.EventBus
import org.jetbrains.anko.startActivity
class ResultActivity:TransparentStatusBarActivity() {
    override fun setContentView() = R.layout.activity_result
    private val id by lazy { intent.getStringExtra("id") }
    private val type by lazy { intent.getIntExtra("type",0) }
    private val day by lazy { intent.getIntExtra("day",0) }
    private val week by lazy { intent.getIntExtra("week",0) }
    private val season by lazy { intent.getIntExtra("season",0) }
    private val total by lazy { intent.getIntExtra("total",0) }
    private val right by lazy { intent.getIntExtra("right",0) }
    private val score by lazy { intent.getIntExtra("score",0) }
    private val time by lazy { intent.getIntExtra("time",0) }
    override fun initClick() {
        tv_last.setOnClickListener {
            startActivity<MainActivity>()
        }
        tv_exit.clickDelay {
            EventBus.getDefault().post(IntEvent(Const.EventCode.NEXT_SUBJECT,type+1))
            finish()
        }
    }
    override fun initView() {
        tv_score.text = "恭喜你,已完成全部答题!获得${score}积分!"
        tv_count.text = "${total}次"
        tv_right.text = "${right}次"
        tv_fault.text = "${total-right}次"
        val rate = (right * 100) / total
        tv_rate.text = "正确率:$rate%"
        HttpManager.completeLearning(rate,time,day,week,season,type,id?:"").request(this){_,data->
        }
    }
    companion object{
        fun startResult(context:Context,day:Int,week:Int,season:Int,type:Int,total:Int,right:Int,score:Int,time:Int,id:String){
            context.startActivity<ResultActivity>("day" to day,"week" to week,"season" to season,"type" to type,"total" to total,"right" to right,"score" to score,"time" to time,"id" to id)
        }
    }
}
app/src/main/java/com/dollearn/student/ui/home/ScheduleActivity.kt
@@ -6,7 +6,12 @@
import com.dollearn.student.network.HttpManager
import com.dollearn.student.network.request
import com.dollearn.student.ui.TransparentStatusBarActivity
import com.dollearn.student.utils.Const
import com.dollearn.student.utils.event.EmptyEvent
import com.dollearn.student.utils.event.IntEvent
import kotlinx.android.synthetic.main.activity_schedul.*
import org.greenrobot.eventbus.EventBus
import org.greenrobot.eventbus.Subscribe
class ScheduleActivity :TransparentStatusBarActivity(){
    override fun setContentView() = R.layout.activity_schedul
@@ -25,6 +30,7 @@
    override fun initView() {
        title = ""
        getSchedule()
        EventBus.getDefault().register(this)
    }
    private fun getSchedule(){
@@ -54,4 +60,16 @@
        tab_bar.currentTab = currentDay-1
        view_pager.offscreenPageLimit = day
    }
    @Subscribe
    fun nextSubject(e: IntEvent){
        if (e.code == Const.EventCode.NEXT_SUBJECT){
            (frags[view_pager.currentItem] as DailyFragment).nextSubject(e.i)
        }
    }
    override fun onDestroy() {
        super.onDestroy()
        EventBus.getDefault().unregister(this)
    }
}
app/src/main/java/com/dollearn/student/ui/login/LoginActivity.kt
@@ -1,23 +1,13 @@
package com.dollearn.student.ui.login
import android.annotation.SuppressLint
import android.app.Activity
import android.content.Intent
import android.os.CountDownTimer
import android.text.method.HideReturnsTransformationMethod
import android.text.method.LinkMovementMethod
import android.text.method.PasswordTransformationMethod
import android.text.style.ClickableSpan
import android.view.View
import androidx.core.os.bundleOf
import cn.sinata.xldutils.gone
import cn.sinata.xldutils.utils.*
import cn.sinata.xldutils.visible
import com.flyco.tablayout.listener.CustomTabEntity
import com.flyco.tablayout.listener.OnTabSelectListener
import com.dollearn.student.MainActivity
import com.dollearn.student.R
import com.dollearn.student.WeparkApplication
import com.dollearn.student.dialog.LoginRuleDialog
import com.dollearn.student.dialog.TipDialog
import com.dollearn.student.network.HttpManager
@@ -26,10 +16,6 @@
import com.dollearn.student.ui.TransparentStatusBarActivity
import com.dollearn.student.utils.Const
import com.dollearn.student.utils.extention.clickDelay
import com.umeng.socialize.UMAuthListener
import com.umeng.socialize.UMShareAPI
import com.umeng.socialize.UMShareConfig
import com.umeng.socialize.bean.SHARE_MEDIA
import kotlinx.android.synthetic.main.activity_field.*
import kotlinx.android.synthetic.main.activity_login.*
import org.jetbrains.anko.sdk27.coroutines.onClick
app/src/main/java/com/dollearn/student/utils/Const.kt
@@ -68,7 +68,7 @@
        const val SWITCH_HOME = 0x04 //切换到首页
        const val CHANGE_STARTCLASS = 0x05 //首页跳转到开始上课
        const val NEXT_SUBJECT = 0x05 //下一大题
        const val CHANGE_PAY_SUCCESS = 0x06 //预约场地支付成功
app/src/main/java/com/dollearn/student/utils/event/IntEvent.kt
New file
@@ -0,0 +1,5 @@
package com.dollearn.student.utils.event
data class IntEvent(val code:Int, val i:Int) {
}
app/src/main/java/com/dollearn/student/utils/extention/WeparkEx.kt
@@ -71,7 +71,7 @@
object ViewClickDelay {
    var hash: Int = 0
    var lastClickTime: Long = 0
    var SPACE_TIME: Long = 2000
    var SPACE_TIME: Long = 1000
}
infix fun View.clickDelay(clickAction: () -> Unit) {
app/src/main/res/drawable/bg_blue_line_8dp.xml
New file
@@ -0,0 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
    <corners android:radius="8dp"/>
    <solid android:color="@color/white"/>
    <stroke android:color="@color/colorPrimary" android:width="1dp"/>
</shape>
app/src/main/res/drawable/bg_grey_8dp.xml
New file
@@ -0,0 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
    <corners android:radius="8dp"/>
    <solid android:color="@color/textColor99"/>
</shape>
app/src/main/res/drawable/selector_bg_voice.xml
New file
@@ -0,0 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:drawable="@drawable/bg_blue_8dp" android:state_enabled="true"/>
    <item android:drawable="@drawable/bg_grey_8dp" android:state_enabled="false"/>
</selector>
app/src/main/res/layout/activity_result.xml
New file
@@ -0,0 +1,135 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    xmlns:app="http://schemas.android.com/apk/res-auto">
    <TextView
        android:layout_width="155dp"
        android:layout_height="wrap_content"
        android:id="@+id/tv_progress"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintBaseline_toBaselineOf="@id/tv_exit"
        android:gravity="center"
        android:textStyle="bold"
        android:textSize="14sp"
        android:textColor="@color/textColor"
        android:text=""/>
    <TextView
        android:id="@+id/tv_exit"
        android:layout_width="124dp"
        android:layout_height="wrap_content"
        android:textSize="14sp"
        android:textColor="@color/white"
        android:background="@drawable/bg_blue_4dp"
        android:text="下一大题"
        android:paddingVertical="10dp"
        android:gravity="center"
        app:layout_constraintStart_toEndOf="@id/tv_progress"
        app:layout_constraintBottom_toBottomOf="parent"
        android:layout_marginBottom="12dp"
        android:textStyle="bold" />
    <TextView
        android:id="@+id/tv_last"
        android:layout_width="124dp"
        android:layout_height="wrap_content"
        android:textSize="14sp"
        android:textColor="@color/colorPrimary"
        android:background="@drawable/bg_blue_line_4dp"
        android:text="返回主页"
        android:paddingVertical="10dp"
        android:gravity="center"
        app:layout_constraintEnd_toStartOf="@id/tv_progress"
        app:layout_constraintBottom_toBottomOf="parent"
        android:layout_marginBottom="12dp"
        android:textStyle="bold" />
    <androidx.constraintlayout.widget.ConstraintLayout
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_marginHorizontal="230dp"
        android:layout_marginVertical="26dp"
        android:background="@drawable/bg_white_8dp"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintBottom_toTopOf="@id/tv_last">
        <TextView
            android:id="@+id/tv_score"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            app:layout_constraintTop_toTopOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintEnd_toEndOf="parent"
            android:textSize="18sp"
            android:textStyle="bold"
            android:textColor="@color/textColor"
            android:drawableTop="@mipmap/successs"
            android:drawablePadding="25dp"
            android:layout_marginTop="25dp"
            android:text="恭喜你,已完成全部答题!获得0积分!"/>
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:id="@+id/tv_count"
            app:layout_constraintTop_toBottomOf="@id/tv_score"
            app:layout_constraintEnd_toEndOf="@id/tv_score"
            android:text="0次"
            android:layout_marginTop="24dp"
            android:textColor="@color/textColor"
            android:textSize="16sp"/>
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            app:layout_constraintBaseline_toBaselineOf="@id/tv_count"
            app:layout_constraintStart_toStartOf="@id/tv_score"
            android:textColor="@color/textColor"
            android:textSize="16sp"
            android:text="答题次数:"/>
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:id="@+id/tv_right"
            app:layout_constraintTop_toBottomOf="@id/tv_count"
            app:layout_constraintEnd_toEndOf="@id/tv_score"
            android:text="0次"
            android:layout_marginTop="12dp"
            android:textColor="@color/textColor"
            android:textSize="16sp"/>
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            app:layout_constraintBaseline_toBaselineOf="@id/tv_right"
            app:layout_constraintStart_toStartOf="@id/tv_score"
            android:textColor="@color/textColor"
            android:textSize="16sp"
            android:text="正确次数:"/>
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:id="@+id/tv_fault"
            app:layout_constraintTop_toBottomOf="@id/tv_right"
            app:layout_constraintEnd_toEndOf="@id/tv_score"
            android:text="0次"
            android:layout_marginTop="12dp"
            android:textColor="@color/textColor"
            android:textSize="16sp"/>
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            app:layout_constraintBaseline_toBaselineOf="@id/tv_fault"
            app:layout_constraintStart_toStartOf="@id/tv_score"
            android:textColor="@color/textColor"
            android:textSize="16sp"
            android:text="错误次数:"/>
        <TextView
            android:id="@+id/tv_rate"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintTop_toBottomOf="@id/tv_fault"
            android:textSize="24sp"
            android:textStyle="bold"
            android:textColor="@color/color_text_price"
            android:layout_marginTop="50dp"
            android:text="正确率:0%"/>
    </androidx.constraintlayout.widget.ConstraintLayout>
</androidx.constraintlayout.widget.ConstraintLayout>
app/src/main/res/layout/fragment_choose_voice.xml
New file
@@ -0,0 +1,569 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.motion.widget.MotionLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:id="@+id/motion"
    app:layoutDescription="@xml/scene_fragment_choose_voice">
    <androidx.constraintlayout.widget.Guideline
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/center"
        app:layout_constraintGuide_percent="0.5"
        android:orientation="vertical"/>
    <androidx.constraintlayout.widget.ConstraintLayout
        android:id="@+id/cl_1"
        android:layout_width="0dp"
        android:layout_height="0dp"
        android:padding="4dp"
        android:elevation="2dp"
        app:layout_constraintDimensionRatio="333:259"
        android:layout_marginTop="96dp"
        app:layout_constraintHorizontal_chainStyle="packed"
        android:background="@drawable/bg_white_8dp"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintEnd_toStartOf="@id/center"
        android:layout_marginEnd="11dp"
        android:layout_marginBottom="8dp"
        app:layout_constraintBottom_toTopOf="@id/cl_3">
        <TextView
            android:layout_width="match_parent"
            android:layout_height="40dp"
            android:background="@color/page_bg"
            android:id="@+id/tv_1"
            android:gravity="center"
            android:textColor="@color/white"
            android:textSize="15sp"
            app:layout_constraintTop_toTopOf="parent"/>
        <com.facebook.drawee.view.SimpleDraweeView
            android:layout_width="match_parent"
            android:id="@+id/iv_1"
            android:layout_height="0dp"
            app:layout_constraintTop_toTopOf="parent"
            android:layout_marginTop="40dp"
            app:layout_constraintBottom_toBottomOf="parent"/>
        <androidx.constraintlayout.widget.ConstraintLayout
            android:layout_width="match_parent"
            android:layout_height="40dp"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintTop_toTopOf="parent"
            android:elevation="2dp"
            android:visibility="gone"
            android:id="@+id/cl_voice_end_1"
            android:background="@drawable/bg_blue_8dp">
            <ImageView
                android:id="@+id/iv1_1_end"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:src="@mipmap/yuyin"
                app:layout_constraintTop_toTopOf="parent"
                app:layout_constraintBottom_toBottomOf="parent"
                app:layout_constraintStart_toStartOf="parent"
                android:layout_marginStart="25dp"/>
            <ImageView
                android:id="@+id/iv2_1_end"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:src="@mipmap/play"
                app:layout_constraintTop_toTopOf="parent"
                app:layout_constraintBottom_toBottomOf="parent"
                app:layout_constraintEnd_toEndOf="parent"
                android:layout_marginEnd="23dp"/>
            <ImageView
                android:id="@+id/iv_playing_1_end"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:visibility="gone"
                android:src="@mipmap/bofangzhong"
                app:layout_constraintTop_toTopOf="parent"
                app:layout_constraintBottom_toBottomOf="parent"
                app:layout_constraintEnd_toEndOf="parent"
                app:layout_constraintStart_toStartOf="parent" />
        </androidx.constraintlayout.widget.ConstraintLayout>
    </androidx.constraintlayout.widget.ConstraintLayout>
    <androidx.constraintlayout.widget.ConstraintLayout
        android:id="@+id/cl_2"
        android:layout_width="0dp"
        android:layout_height="0dp"
        android:elevation="2dp"
        app:layout_constraintDimensionRatio="333:259"
        android:padding="4dp"
        app:layout_constraintStart_toEndOf="@id/center"
        android:layout_marginStart="8dp"
        android:background="@drawable/bg_white_8dp"
        app:layout_constraintTop_toTopOf="@id/cl_1"
        app:layout_constraintBottom_toBottomOf="@id/cl_1">
        <TextView
            android:layout_width="match_parent"
            android:layout_height="40dp"
            android:background="@color/page_bg"
            android:id="@+id/tv_2"
            android:gravity="center"
            android:textColor="@color/white"
            android:textSize="15sp"
            app:layout_constraintTop_toTopOf="parent"/>
        <com.facebook.drawee.view.SimpleDraweeView
            android:layout_width="match_parent"
            android:id="@+id/iv_2"
            android:layout_height="0dp"
            app:layout_constraintTop_toTopOf="parent"
            android:layout_marginTop="40dp"
            app:layout_constraintBottom_toBottomOf="parent"/>
        <androidx.constraintlayout.widget.ConstraintLayout
            android:layout_width="match_parent"
            android:layout_height="40dp"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintTop_toTopOf="parent"
            android:elevation="2dp"
            android:visibility="gone"
            android:id="@+id/cl_voice_end_2"
            android:background="@drawable/bg_blue_8dp">
            <ImageView
                android:id="@+id/iv1_2_end"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:src="@mipmap/yuyin"
                app:layout_constraintTop_toTopOf="parent"
                app:layout_constraintBottom_toBottomOf="parent"
                app:layout_constraintStart_toStartOf="parent"
                android:layout_marginStart="25dp"/>
            <ImageView
                android:id="@+id/iv2_2_end"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:src="@mipmap/play"
                app:layout_constraintTop_toTopOf="parent"
                app:layout_constraintBottom_toBottomOf="parent"
                app:layout_constraintEnd_toEndOf="parent"
                android:layout_marginEnd="23dp"/>
            <ImageView
                android:id="@+id/iv_playing_2_end"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:visibility="gone"
                android:src="@mipmap/bofangzhong"
                app:layout_constraintTop_toTopOf="parent"
                app:layout_constraintBottom_toBottomOf="parent"
                app:layout_constraintEnd_toEndOf="parent"
                app:layout_constraintStart_toStartOf="parent" />
        </androidx.constraintlayout.widget.ConstraintLayout>
    </androidx.constraintlayout.widget.ConstraintLayout>
    <androidx.constraintlayout.widget.ConstraintLayout
        android:id="@+id/cl_3"
        android:layout_width="0dp"
        android:layout_height="0dp"
        android:padding="4dp"
        android:elevation="2dp"
        android:layout_marginBottom="10dp"
        app:layout_constraintStart_toStartOf="@id/cl_1"
        app:layout_constraintEnd_toEndOf="@id/cl_1"
        android:background="@drawable/bg_white_8dp"
        app:layout_constraintTop_toBottomOf="@id/cl_1"
        app:layout_constraintBottom_toBottomOf="parent">
        <TextView
            android:layout_width="match_parent"
            android:layout_height="40dp"
            android:background="@color/page_bg"
            android:id="@+id/tv_3"
            android:gravity="center"
            android:textColor="@color/white"
            android:textSize="15sp"
            app:layout_constraintTop_toTopOf="parent"/>
        <com.facebook.drawee.view.SimpleDraweeView
            android:layout_width="match_parent"
            android:id="@+id/iv_3"
            android:layout_height="0dp"
            app:layout_constraintTop_toTopOf="parent"
            android:layout_marginTop="40dp"
            app:layout_constraintBottom_toBottomOf="parent"/>
        <androidx.constraintlayout.widget.ConstraintLayout
            android:layout_width="match_parent"
            android:layout_height="40dp"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintTop_toTopOf="parent"
            android:elevation="2dp"
            android:visibility="gone"
            android:id="@+id/cl_voice_end_3"
            android:background="@drawable/bg_blue_8dp">
            <ImageView
                android:id="@+id/iv1_3_end"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:src="@mipmap/yuyin"
                app:layout_constraintTop_toTopOf="parent"
                app:layout_constraintBottom_toBottomOf="parent"
                app:layout_constraintStart_toStartOf="parent"
                android:layout_marginStart="25dp"/>
            <ImageView
                android:id="@+id/iv2_3_end"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:src="@mipmap/play"
                app:layout_constraintTop_toTopOf="parent"
                app:layout_constraintBottom_toBottomOf="parent"
                app:layout_constraintEnd_toEndOf="parent"
                android:layout_marginEnd="23dp"/>
            <ImageView
                android:id="@+id/iv_playing_3_end"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:visibility="gone"
                android:src="@mipmap/bofangzhong"
                app:layout_constraintTop_toTopOf="parent"
                app:layout_constraintBottom_toBottomOf="parent"
                app:layout_constraintEnd_toEndOf="parent"
                app:layout_constraintStart_toStartOf="parent" />
        </androidx.constraintlayout.widget.ConstraintLayout>
    </androidx.constraintlayout.widget.ConstraintLayout>
    <androidx.constraintlayout.widget.ConstraintLayout
        android:id="@+id/cl_4"
        android:layout_width="0dp"
        android:layout_height="0dp"
        android:elevation="2dp"
        android:padding="4dp"
        app:layout_constraintStart_toStartOf="@id/cl_2"
        app:layout_constraintEnd_toEndOf="@id/cl_2"
        android:background="@drawable/bg_white_8dp"
        app:layout_constraintTop_toTopOf="@id/cl_3"
        app:layout_constraintBottom_toBottomOf="@id/cl_3">
        <TextView
            android:layout_width="match_parent"
            android:layout_height="40dp"
            android:background="@color/page_bg"
            android:id="@+id/tv_4"
            android:gravity="center"
            android:textColor="@color/white"
            android:textSize="15sp"
            app:layout_constraintTop_toTopOf="parent"/>
        <com.facebook.drawee.view.SimpleDraweeView
            android:layout_width="match_parent"
            android:id="@+id/iv_4"
            android:layout_height="0dp"
            app:layout_constraintTop_toTopOf="parent"
            android:layout_marginTop="40dp"
            app:layout_constraintBottom_toBottomOf="parent"/>
        <androidx.constraintlayout.widget.ConstraintLayout
            android:layout_width="match_parent"
            android:layout_height="40dp"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintTop_toTopOf="parent"
            android:elevation="2dp"
            android:visibility="gone"
            android:id="@+id/cl_voice_end_4"
            android:background="@drawable/bg_blue_8dp">
            <ImageView
                android:id="@+id/iv1_4_end"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:src="@mipmap/yuyin"
                app:layout_constraintTop_toTopOf="parent"
                app:layout_constraintBottom_toBottomOf="parent"
                app:layout_constraintStart_toStartOf="parent"
                android:layout_marginStart="25dp"/>
            <ImageView
                android:id="@+id/iv2_4_end"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:src="@mipmap/play"
                app:layout_constraintTop_toTopOf="parent"
                app:layout_constraintBottom_toBottomOf="parent"
                app:layout_constraintEnd_toEndOf="parent"
                android:layout_marginEnd="23dp"/>
            <ImageView
                android:id="@+id/iv_playing_4_end"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:visibility="gone"
                android:src="@mipmap/bofangzhong"
                app:layout_constraintTop_toTopOf="parent"
                app:layout_constraintBottom_toBottomOf="parent"
                app:layout_constraintEnd_toEndOf="parent"
                app:layout_constraintStart_toStartOf="parent" />
        </androidx.constraintlayout.widget.ConstraintLayout>
    </androidx.constraintlayout.widget.ConstraintLayout>
    <RelativeLayout
        android:id="@+id/rl_2"
        android:layout_width="159dp"
        android:layout_height="52dp"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        android:layout_marginTop="24dp"
        android:background="@drawable/bg_blue_8dp">
        <ImageView
            android:id="@+id/iv_s_2"
            android:layout_width="32dp"
            android:layout_height="32dp"
            android:src="@mipmap/successs"
            android:layout_centerInParent="true"/>
    </RelativeLayout>
    <androidx.constraintlayout.widget.ConstraintLayout
        android:layout_width="159dp"
        android:layout_height="52dp"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        android:layout_marginTop="24dp"
        android:elevation="2dp"
        android:id="@+id/cl_voice2"
        android:background="@drawable/bg_blue_8dp">
        <ImageView
            android:id="@+id/iv1_2"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:src="@mipmap/yuyin"
            app:layout_constraintTop_toTopOf="parent"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            android:layout_marginStart="25dp"/>
        <ImageView
            android:id="@+id/iv2_2"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:src="@mipmap/play"
            app:layout_constraintTop_toTopOf="parent"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintEnd_toEndOf="parent"
            android:layout_marginEnd="23dp"/>
        <ImageView
            android:id="@+id/iv_playing_2"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:visibility="gone"
            android:src="@mipmap/bofangzhong"
            app:layout_constraintTop_toTopOf="parent"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent" />
        <ImageView
            android:layout_width="32dp"
            android:layout_height="32dp"
            android:src="@mipmap/zhifushibai"
            app:layout_constraintTop_toTopOf="parent"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintEnd_toEndOf="parent"
            android:visibility="gone"
            android:id="@+id/iv_error_2"/>
    </androidx.constraintlayout.widget.ConstraintLayout>
    <RelativeLayout
        android:id="@+id/rl_1"
        android:layout_width="159dp"
        android:layout_height="52dp"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintEnd_toStartOf="@id/rl_2"
        app:layout_constraintTop_toTopOf="parent"
        android:layout_marginTop="24dp"
        android:background="@drawable/bg_blue_8dp">
        <ImageView
            android:id="@+id/iv_s_1"
            android:layout_width="32dp"
            android:layout_height="32dp"
            android:src="@mipmap/successs"
            android:layout_centerInParent="true"/>
    </RelativeLayout>
    <androidx.constraintlayout.widget.ConstraintLayout
        android:layout_width="159dp"
        android:layout_height="52dp"
        app:layout_constraintStart_toStartOf="@id/rl_1"
        app:layout_constraintTop_toTopOf="parent"
        android:layout_marginTop="24dp"
        android:elevation="2dp"
        android:id="@+id/cl_voice1"
        android:background="@drawable/bg_blue_8dp">
        <ImageView
            android:id="@+id/iv1_1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:src="@mipmap/yuyin"
            app:layout_constraintTop_toTopOf="parent"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            android:layout_marginStart="25dp"/>
        <ImageView
            android:id="@+id/iv2_1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:src="@mipmap/play"
            app:layout_constraintTop_toTopOf="parent"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintEnd_toEndOf="parent"
            android:layout_marginEnd="23dp"/>
        <ImageView
            android:id="@+id/iv_playing_1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:visibility="gone"
            android:src="@mipmap/bofangzhong"
            app:layout_constraintTop_toTopOf="parent"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent" />
        <ImageView
            android:layout_width="32dp"
            android:layout_height="32dp"
            android:src="@mipmap/zhifushibai"
            app:layout_constraintTop_toTopOf="parent"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintEnd_toEndOf="parent"
            android:visibility="gone"
            android:id="@+id/iv_error_1"/>
    </androidx.constraintlayout.widget.ConstraintLayout>
    <RelativeLayout
        android:id="@+id/rl_3"
        android:layout_width="159dp"
        android:layout_height="52dp"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toEndOf="@id/rl_2"
        app:layout_constraintTop_toTopOf="parent"
        android:layout_marginTop="24dp"
        android:background="@drawable/bg_blue_8dp">
        <ImageView
            android:id="@+id/iv_s_3"
            android:layout_width="32dp"
            android:layout_height="32dp"
            android:src="@mipmap/successs"
            android:layout_centerInParent="true"/>
    </RelativeLayout>
    <androidx.constraintlayout.widget.ConstraintLayout
        android:layout_width="159dp"
        android:layout_height="52dp"
        app:layout_constraintTop_toTopOf="parent"
        android:layout_marginTop="24dp"
        app:layout_constraintStart_toStartOf="@id/rl_3"
        android:elevation="2dp"
        android:id="@+id/cl_voice3"
        android:background="@drawable/bg_blue_8dp">
        <ImageView
            android:id="@+id/iv1_3"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:src="@mipmap/yuyin"
            app:layout_constraintTop_toTopOf="parent"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            android:layout_marginStart="25dp"/>
        <ImageView
            android:id="@+id/iv2_3"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:src="@mipmap/play"
            app:layout_constraintTop_toTopOf="parent"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintEnd_toEndOf="parent"
            android:layout_marginEnd="23dp"/>
        <ImageView
            android:id="@+id/iv_playing_3"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:visibility="gone"
            android:src="@mipmap/bofangzhong"
            app:layout_constraintTop_toTopOf="parent"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent" />
        <ImageView
            android:layout_width="32dp"
            android:layout_height="32dp"
            android:src="@mipmap/zhifushibai"
            app:layout_constraintTop_toTopOf="parent"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintEnd_toEndOf="parent"
            android:visibility="gone"
            android:id="@+id/iv_error_3"/>
    </androidx.constraintlayout.widget.ConstraintLayout>
    <RelativeLayout
        android:id="@+id/rl_p_1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        app:layout_constraintTop_toTopOf="@id/rl_1"
        android:layout_marginStart="10dp"
        app:layout_constraintStart_toEndOf="@id/rl_1">
        <RelativeLayout
            android:layout_width="52dp"
            android:layout_height="52dp"
            android:background="@drawable/bg_blue_line_8dp"
            android:visibility="gone"
            android:id="@+id/rl_check_1">
            <View
                android:layout_width="18dp"
                android:layout_height="18dp"
                android:id="@+id/dot_1"
                android:visibility="gone"
                android:layout_centerInParent="true"
                android:background="@drawable/bg_blue_20dp"/>
        </RelativeLayout>
    </RelativeLayout>
    <RelativeLayout
        android:id="@+id/rl_p_2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        app:layout_constraintTop_toTopOf="@id/rl_2"
        android:layout_marginStart="10dp"
        app:layout_constraintStart_toEndOf="@id/rl_2">
        <RelativeLayout
            android:layout_width="52dp"
            android:layout_height="52dp"
            android:background="@drawable/bg_blue_line_8dp"
            android:visibility="gone"
            android:id="@+id/rl_check_2">
            <View
                android:layout_width="18dp"
                android:layout_height="18dp"
                android:id="@+id/dot_2"
                android:visibility="gone"
                android:layout_centerInParent="true"
                android:background="@drawable/bg_blue_20dp"/>
        </RelativeLayout>
    </RelativeLayout>
    <RelativeLayout
        android:id="@+id/rl_p_3"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        app:layout_constraintTop_toTopOf="@id/rl_3"
        android:layout_marginStart="10dp"
        app:layout_constraintStart_toEndOf="@id/rl_3">
        <RelativeLayout
            android:layout_width="52dp"
            android:layout_height="52dp"
            android:background="@drawable/bg_blue_line_8dp"
            android:visibility="gone"
            android:id="@+id/rl_check_3">
            <View
                android:layout_width="18dp"
                android:layout_height="18dp"
                android:id="@+id/dot_3"
                android:visibility="gone"
                android:layout_centerInParent="true"
                android:background="@drawable/bg_blue_20dp"/>
        </RelativeLayout>
    </RelativeLayout>
</androidx.constraintlayout.motion.widget.MotionLayout>
app/src/main/res/layout/fragment_include.xml
New file
@@ -0,0 +1,498 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.motion.widget.MotionLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:id="@+id/motion"
    app:layoutDescription="@xml/fragment_include_scene">
    <androidx.constraintlayout.widget.ConstraintLayout
        android:id="@+id/cl_1"
        android:layout_width="0dp"
        android:layout_height="0dp"
        android:padding="4dp"
        android:elevation="2dp"
        android:layout_marginTop="20dp"
        app:layout_constraintHorizontal_chainStyle="packed"
        app:layout_constraintVertical_chainStyle="packed"
        android:background="@drawable/bg_white_8dp"
        app:layout_constraintTop_toBottomOf="@id/cl_voice1"
        app:layout_constraintBottom_toTopOf="@id/cl_4"
        android:layout_marginBottom="145dp"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintEnd_toStartOf="@id/cl_2"
        android:layout_marginStart="50dp"
        android:layout_marginEnd="10dp">
        <com.facebook.drawee.view.SimpleDraweeView
            android:layout_width="match_parent"
            android:id="@+id/iv_1"
            app:actualImageScaleType="centerCrop"
            android:layout_height="match_parent"/>
    </androidx.constraintlayout.widget.ConstraintLayout>
    <androidx.constraintlayout.widget.ConstraintLayout
        android:id="@+id/cl_2"
        android:layout_width="0dp"
        android:layout_height="0dp"
        android:padding="4dp"
        android:elevation="2dp"
        android:background="@drawable/bg_white_8dp"
        app:layout_constraintTop_toTopOf="@id/cl_1"
        app:layout_constraintBottom_toBottomOf="@id/cl_1"
        app:layout_constraintStart_toEndOf="@id/cl_1"
        app:layout_constraintEnd_toStartOf="@id/cl_3"
        android:layout_marginEnd="10dp">
        <com.facebook.drawee.view.SimpleDraweeView
            android:layout_width="match_parent"
            android:id="@+id/iv_2"
            app:actualImageScaleType="centerCrop"
            android:layout_height="match_parent"/>
    </androidx.constraintlayout.widget.ConstraintLayout>
    <androidx.constraintlayout.widget.ConstraintLayout
        android:id="@+id/cl_3"
        android:layout_width="0dp"
        android:layout_height="0dp"
        android:padding="4dp"
        android:elevation="2dp"
        android:background="@drawable/bg_white_8dp"
        app:layout_constraintTop_toTopOf="@id/cl_1"
        app:layout_constraintBottom_toBottomOf="@id/cl_1"
        app:layout_constraintStart_toEndOf="@id/cl_2"
        app:layout_constraintEnd_toEndOf="parent"
        android:layout_marginEnd="50dp">
        <com.facebook.drawee.view.SimpleDraweeView
            android:layout_width="match_parent"
            android:id="@+id/iv_3"
            app:placeholderImage="@color/grey_f1"
            app:actualImageScaleType="centerCrop"
            app:failureImage="@color/grey_f1"
            android:layout_height="match_parent"/>
    </androidx.constraintlayout.widget.ConstraintLayout>
    <androidx.constraintlayout.widget.ConstraintLayout
        android:id="@+id/cl_4"
        android:layout_width="0dp"
        android:layout_height="0dp"
        android:padding="4dp"
        android:elevation="2dp"
        android:layout_marginBottom="10dp"
        app:layout_constraintTop_toBottomOf="@id/cl_1"
        android:background="@drawable/bg_white_8dp"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintStart_toStartOf="@id/cl_1"
        app:layout_constraintEnd_toEndOf="@id/cl_1">
        <com.facebook.drawee.view.SimpleDraweeView
            android:layout_width="match_parent"
            android:id="@+id/iv_4"
            app:actualImageScaleType="centerCrop"
            android:layout_height="match_parent"/>
    </androidx.constraintlayout.widget.ConstraintLayout>
    <androidx.constraintlayout.widget.ConstraintLayout
        android:id="@+id/cl_5"
        android:layout_width="0dp"
        android:layout_height="0dp"
        android:padding="4dp"
        android:elevation="2dp"
        android:background="@drawable/bg_white_8dp"
        app:layout_constraintBottom_toBottomOf="@id/cl_4"
        app:layout_constraintTop_toTopOf="@id/cl_4"
        app:layout_constraintStart_toStartOf="@id/cl_2"
        app:layout_constraintEnd_toEndOf="@id/cl_2">
        <com.facebook.drawee.view.SimpleDraweeView
            android:layout_width="match_parent"
            android:id="@+id/iv_5"
            app:placeholderImage="@color/grey_f1"
            app:actualImageScaleType="centerCrop"
            app:failureImage="@color/grey_f1"
            android:layout_height="match_parent"/>
    </androidx.constraintlayout.widget.ConstraintLayout>
    <androidx.constraintlayout.widget.ConstraintLayout
        android:id="@+id/cl_6"
        android:layout_width="0dp"
        android:layout_height="0dp"
        android:padding="4dp"
        android:elevation="2dp"
        android:background="@drawable/bg_white_8dp"
        app:layout_constraintBottom_toBottomOf="@id/cl_4"
        app:layout_constraintTop_toTopOf="@id/cl_4"
        app:layout_constraintStart_toStartOf="@id/cl_3"
        app:layout_constraintEnd_toEndOf="@id/cl_3">
        <com.facebook.drawee.view.SimpleDraweeView
            android:layout_width="match_parent"
            android:id="@+id/iv_6"
            app:placeholderImage="@color/grey_f1"
            app:actualImageScaleType="centerCrop"
            app:failureImage="@color/grey_f1"
            android:layout_height="match_parent"/>
    </androidx.constraintlayout.widget.ConstraintLayout>
    <androidx.constraintlayout.widget.ConstraintLayout
        android:layout_width="159dp"
        android:layout_height="52dp"
        app:layout_constraintStart_toStartOf="@id/cl_1"
        app:layout_constraintTop_toTopOf="parent"
        android:layout_marginTop="24dp"
        android:id="@+id/cl_voice1"
        android:layout_marginStart="4dp"
        android:background="@drawable/selector_bg_voice">
        <ImageView
            android:id="@+id/iv1_1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:src="@mipmap/yuyin"
            app:layout_constraintTop_toTopOf="parent"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            android:layout_marginStart="25dp"/>
        <ImageView
            android:id="@+id/iv2_1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:src="@mipmap/play"
            app:layout_constraintTop_toTopOf="parent"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintEnd_toEndOf="parent"
            android:layout_marginEnd="23dp"/>
        <ImageView
            android:id="@+id/iv_playing_1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:visibility="gone"
            android:src="@mipmap/bofangzhong"
            app:layout_constraintTop_toTopOf="parent"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent" />
    </androidx.constraintlayout.widget.ConstraintLayout>
    <androidx.constraintlayout.widget.ConstraintLayout
        android:layout_width="159dp"
        android:layout_height="52dp"
        app:layout_constraintStart_toStartOf="@id/cl_2"
        app:layout_constraintTop_toTopOf="parent"
        android:layout_marginTop="24dp"
        android:id="@+id/cl_voice2"
        android:layout_marginStart="4dp"
        android:background="@drawable/selector_bg_voice">
        <ImageView
            android:id="@+id/iv1_2"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:src="@mipmap/yuyin"
            app:layout_constraintTop_toTopOf="parent"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            android:layout_marginStart="25dp"/>
        <ImageView
            android:id="@+id/iv2_2"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:src="@mipmap/play"
            app:layout_constraintTop_toTopOf="parent"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintEnd_toEndOf="parent"
            android:layout_marginEnd="23dp"/>
        <ImageView
            android:id="@+id/iv_playing_2"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:visibility="gone"
            android:src="@mipmap/bofangzhong"
            app:layout_constraintTop_toTopOf="parent"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent" />
    </androidx.constraintlayout.widget.ConstraintLayout>
    <androidx.constraintlayout.widget.ConstraintLayout
        android:layout_width="159dp"
        android:layout_height="52dp"
        app:layout_constraintStart_toStartOf="@id/cl_3"
        app:layout_constraintTop_toTopOf="parent"
        android:layout_marginTop="24dp"
        android:id="@+id/cl_voice3"
        android:layout_marginStart="4dp"
        android:background="@drawable/selector_bg_voice">
        <ImageView
            android:id="@+id/iv1_3"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:src="@mipmap/yuyin"
            app:layout_constraintTop_toTopOf="parent"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            android:layout_marginStart="25dp"/>
        <ImageView
            android:id="@+id/iv2_3"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:src="@mipmap/play"
            app:layout_constraintTop_toTopOf="parent"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintEnd_toEndOf="parent"
            android:layout_marginEnd="23dp"/>
        <ImageView
            android:id="@+id/iv_playing_3"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:visibility="gone"
            android:src="@mipmap/bofangzhong"
            app:layout_constraintTop_toTopOf="parent"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent" />
    </androidx.constraintlayout.widget.ConstraintLayout>
    <androidx.constraintlayout.widget.ConstraintLayout
        android:layout_width="159dp"
        android:layout_height="52dp"
        app:layout_constraintStart_toStartOf="@id/cl_4"
        app:layout_constraintBottom_toTopOf="@id/cl_4"
        android:layout_marginBottom="20dp"
        android:id="@+id/cl_voice4"
        android:layout_marginStart="4dp"
        android:background="@drawable/selector_bg_voice">
        <ImageView
            android:id="@+id/iv1_4"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:src="@mipmap/yuyin"
            app:layout_constraintTop_toTopOf="parent"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            android:layout_marginStart="25dp"/>
        <ImageView
            android:id="@+id/iv2_4"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:src="@mipmap/play"
            app:layout_constraintTop_toTopOf="parent"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintEnd_toEndOf="parent"
            android:layout_marginEnd="23dp"/>
        <ImageView
            android:id="@+id/iv_playing_4"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:visibility="gone"
            android:src="@mipmap/bofangzhong"
            app:layout_constraintTop_toTopOf="parent"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent" />
    </androidx.constraintlayout.widget.ConstraintLayout>
    <androidx.constraintlayout.widget.ConstraintLayout
        android:layout_width="159dp"
        android:layout_height="52dp"
        app:layout_constraintStart_toStartOf="@id/cl_5"
        app:layout_constraintBottom_toTopOf="@id/cl_5"
        android:layout_marginBottom="20dp"
        android:id="@+id/cl_voice5"
        android:layout_marginStart="4dp"
        android:background="@drawable/selector_bg_voice">
        <ImageView
            android:id="@+id/iv1_5"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:src="@mipmap/yuyin"
            app:layout_constraintTop_toTopOf="parent"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            android:layout_marginStart="25dp"/>
        <ImageView
            android:id="@+id/iv2_5"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:src="@mipmap/play"
            app:layout_constraintTop_toTopOf="parent"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintEnd_toEndOf="parent"
            android:layout_marginEnd="23dp"/>
        <ImageView
            android:id="@+id/iv_playing_5"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:visibility="gone"
            android:src="@mipmap/bofangzhong"
            app:layout_constraintTop_toTopOf="parent"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent" />
    </androidx.constraintlayout.widget.ConstraintLayout>
    <androidx.constraintlayout.widget.ConstraintLayout
        android:layout_width="159dp"
        android:layout_height="52dp"
        app:layout_constraintStart_toStartOf="@id/cl_6"
        app:layout_constraintBottom_toTopOf="@id/cl_6"
        android:layout_marginBottom="20dp"
        android:id="@+id/cl_voice6"
        android:layout_marginStart="4dp"
        android:background="@drawable/selector_bg_voice">
        <ImageView
            android:id="@+id/iv1_6"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:src="@mipmap/yuyin"
            app:layout_constraintTop_toTopOf="parent"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            android:layout_marginStart="25dp"/>
        <ImageView
            android:id="@+id/iv2_6"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:src="@mipmap/play"
            app:layout_constraintTop_toTopOf="parent"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintEnd_toEndOf="parent"
            android:layout_marginEnd="23dp"/>
        <ImageView
            android:id="@+id/iv_playing_6"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:visibility="gone"
            android:src="@mipmap/bofangzhong"
            app:layout_constraintTop_toTopOf="parent"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent" />
    </androidx.constraintlayout.widget.ConstraintLayout>
    <com.facebook.drawee.view.SimpleDraweeView
        android:layout_width="85dp"
        android:layout_height="52dp"
        android:id="@+id/iv_answer_3"
        app:failureImage="@null"
        app:layout_constraintStart_toStartOf="@id/cl_answer_3"
        app:layout_constraintTop_toTopOf="@id/cl_answer_3"
        android:elevation="2dp"
        app:actualImageScaleType="centerCrop"
        app:roundedCornerRadius="8dp"/>
    <com.facebook.drawee.view.SimpleDraweeView
        android:layout_width="85dp"
        android:layout_height="52dp"
        android:id="@+id/iv_answer_2"
        app:failureImage="@null"
        android:elevation="2dp"
        app:layout_constraintStart_toStartOf="@id/cl_answer_2"
        app:layout_constraintTop_toTopOf="@id/cl_answer_2"
        app:actualImageScaleType="centerCrop"
        app:roundedCornerRadius="8dp"/>
    <com.facebook.drawee.view.SimpleDraweeView
        android:layout_width="85dp"
        android:layout_height="52dp"
        android:id="@+id/iv_answer_1"
        android:elevation="2dp"
        app:actualImageScaleType="centerCrop"
        app:layout_constraintStart_toStartOf="@id/cl_answer_1"
        app:layout_constraintTop_toTopOf="@id/cl_answer_1"
        app:failureImage="@null"
        app:roundedCornerRadius="8dp"/>
    <androidx.constraintlayout.widget.ConstraintLayout
        android:layout_width="85dp"
        android:layout_height="52dp"
        android:id="@+id/cl_answer_3"
        app:layout_constraintEnd_toEndOf="@id/cl_3"
        android:elevation="2dp"
        app:layout_constraintTop_toBottomOf="@id/cl_3"
        android:layout_marginEnd="23dp"
        android:layout_marginTop="8dp">
        <ImageView
            android:id="@+id/iv_error_3"
            android:layout_width="42dp"
            android:visibility="gone"
            android:layout_height="42dp"
            android:src="@mipmap/zhifushibai"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintTop_toTopOf="parent"
            app:layout_constraintBottom_toBottomOf="parent"/>
        <ImageView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:id="@+id/iv_full_3"
            android:visibility="gone"
            android:padding="2dp"
            app:layout_constraintTop_toTopOf="parent"
            app:layout_constraintEnd_toEndOf="parent"
            android:src="@mipmap/quanping"/>
    </androidx.constraintlayout.widget.ConstraintLayout>
    <androidx.constraintlayout.widget.ConstraintLayout
        android:layout_width="85dp"
        android:layout_height="52dp"
        android:id="@+id/cl_answer_2"
        android:elevation="2dp"
        app:layout_constraintEnd_toStartOf="@id/cl_answer_3"
        app:layout_constraintTop_toBottomOf="@id/cl_3"
        android:layout_marginEnd="5dp"
        android:layout_marginTop="8dp">
        <ImageView
            android:id="@+id/iv_error_2"
            android:layout_width="42dp"
            android:visibility="gone"
            android:layout_height="42dp"
            android:src="@mipmap/zhifushibai"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintTop_toTopOf="parent"
            app:layout_constraintBottom_toBottomOf="parent"/>
        <ImageView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:id="@+id/iv_full_2"
            android:visibility="gone"
            android:padding="2dp"
            app:layout_constraintTop_toTopOf="parent"
            app:layout_constraintEnd_toEndOf="parent"
            android:src="@mipmap/quanping"/>
    </androidx.constraintlayout.widget.ConstraintLayout>
    <androidx.constraintlayout.widget.ConstraintLayout
        android:layout_width="85dp"
        android:layout_height="52dp"
        android:id="@+id/cl_answer_1"
        android:elevation="2dp"
        app:layout_constraintEnd_toStartOf="@id/cl_answer_2"
        app:layout_constraintTop_toBottomOf="@id/cl_3"
        android:layout_marginEnd="5dp"
        android:layout_marginTop="8dp">
        <ImageView
            android:id="@+id/iv_error_1"
            android:layout_width="42dp"
            android:visibility="gone"
            android:layout_height="42dp"
            android:src="@mipmap/zhifushibai"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintTop_toTopOf="parent"
            app:layout_constraintBottom_toBottomOf="parent"/>
        <ImageView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:id="@+id/iv_full_1"
            android:visibility="gone"
            android:padding="2dp"
            app:layout_constraintTop_toTopOf="parent"
            app:layout_constraintEnd_toEndOf="parent"
            android:src="@mipmap/quanping"/>
    </androidx.constraintlayout.widget.ConstraintLayout>
</androidx.constraintlayout.motion.widget.MotionLayout>
app/src/main/res/layout/fragment_listen.xml
@@ -4,7 +4,7 @@
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:id="@+id/motion"
    app:layoutDescription="@xml/fragment_listen_scene_voice_1">
    app:layoutDescription="@xml/scene_fragment_listen_voice">
    <androidx.constraintlayout.widget.Guideline
        android:layout_width="wrap_content"
app/src/main/res/layout/fragment_match.xml
New file
@@ -0,0 +1,203 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.motion.widget.MotionLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:id="@+id/motion"
    app:layoutDescription="@xml/scene_fragment_listen_voice">
    <androidx.constraintlayout.widget.Guideline
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/center"
        app:layout_constraintGuide_percent="0.5"
        android:orientation="vertical"/>
    <androidx.constraintlayout.widget.Guideline
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/line1"
        app:layout_constraintGuide_percent="0.2"
        android:orientation="vertical"/>
    <androidx.constraintlayout.widget.Guideline
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/line2"
        app:layout_constraintGuide_percent="0.4"
        android:orientation="vertical"/>
    <androidx.constraintlayout.widget.Guideline
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/line3"
        app:layout_constraintGuide_percent="0.6"
        android:orientation="vertical"/>
    <androidx.constraintlayout.widget.Guideline
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/line4"
        app:layout_constraintGuide_percent="0.8"
        android:orientation="vertical"/>
    <androidx.constraintlayout.motion.widget.MotionLayout
        android:id="@+id/cl_1"
        android:layout_width="0dp"
        android:layout_height="0dp"
        android:padding="4dp"
        android:elevation="2dp"
        app:layout_constraintDimensionRatio="333:259"
        android:layout_marginTop="96dp"
        app:layout_constraintHorizontal_chainStyle="packed"
        android:background="@drawable/bg_white_8dp"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintEnd_toStartOf="@id/center"
        android:layout_marginEnd="11dp"
        app:layoutDescription="@xml/fragment_listen_scene_result_1"
        android:layout_marginBottom="8dp"
        app:layout_constraintBottom_toTopOf="@id/cl_3">
        <View
            android:layout_width="match_parent"
            android:layout_height="40dp"
            android:background="@color/page_bg"
            android:id="@+id/top_1"
            app:layout_constraintTop_toTopOf="parent"/>
        <com.facebook.drawee.view.SimpleDraweeView
            android:layout_width="match_parent"
            android:id="@+id/iv_1"
            android:layout_height="0dp"
            app:layout_constraintTop_toBottomOf="@id/top_1"
            app:layout_constraintBottom_toBottomOf="parent"/>
        <ImageView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:id="@+id/result_1"/>
    </androidx.constraintlayout.motion.widget.MotionLayout>
    <androidx.constraintlayout.motion.widget.MotionLayout
        android:id="@+id/cl_2"
        android:layout_width="0dp"
        android:layout_height="0dp"
        android:elevation="2dp"
        app:layout_constraintDimensionRatio="333:259"
        android:padding="4dp"
        app:layoutDescription="@xml/fragment_listen_scene_result_2"
        app:layout_constraintStart_toEndOf="@id/center"
        android:layout_marginStart="8dp"
        android:background="@drawable/bg_white_8dp"
        app:layout_constraintTop_toTopOf="@id/cl_1"
        app:layout_constraintBottom_toBottomOf="@id/cl_1">
        <View
            android:layout_width="match_parent"
            android:layout_height="40dp"
            android:id="@+id/top_2"
            android:background="@color/page_bg"
            app:layout_constraintTop_toTopOf="parent"/>
        <com.facebook.drawee.view.SimpleDraweeView
            android:layout_width="match_parent"
            android:id="@+id/iv_2"
            android:layout_height="0dp"
            app:layout_constraintTop_toBottomOf="@id/top_2"
            app:layout_constraintBottom_toBottomOf="parent"/>
        <ImageView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:id="@+id/result_2"/>
    </androidx.constraintlayout.motion.widget.MotionLayout>
    <androidx.constraintlayout.motion.widget.MotionLayout
        android:id="@+id/cl_3"
        android:layout_width="0dp"
        android:layout_height="0dp"
        android:padding="4dp"
        android:elevation="2dp"
        app:layoutDescription="@xml/fragment_listen_scene_result_3"
        app:layout_constraintStart_toStartOf="@id/cl_1"
        app:layout_constraintEnd_toEndOf="@id/cl_1"
        android:background="@drawable/bg_white_8dp"
        app:layout_constraintTop_toBottomOf="@id/cl_1"
        app:layout_constraintBottom_toBottomOf="parent">
        <View
            android:layout_width="match_parent"
            android:layout_height="40dp"
            android:id="@+id/top_3"
            android:background="@color/page_bg"
            app:layout_constraintTop_toTopOf="parent"/>
        <com.facebook.drawee.view.SimpleDraweeView
            android:layout_width="match_parent"
            android:id="@+id/iv_3"
            android:layout_height="0dp"
            app:layout_constraintTop_toBottomOf="@id/top_3"
            app:layout_constraintBottom_toBottomOf="parent"/>
        <ImageView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            app:layout_constraintStart_toStartOf="@id/iv_3"
            app:layout_constraintEnd_toEndOf="@id/iv_3"
            app:layout_constraintTop_toTopOf="@id/iv_3"
            app:layout_constraintBottom_toBottomOf="@id/iv_3"
            android:id="@+id/result_3"
            />
    </androidx.constraintlayout.motion.widget.MotionLayout>
    <androidx.constraintlayout.motion.widget.MotionLayout
        android:id="@+id/cl_4"
        android:layout_width="0dp"
        android:layout_height="0dp"
        android:elevation="2dp"
        android:padding="4dp"
        app:layout_constraintStart_toStartOf="@id/cl_2"
        app:layout_constraintEnd_toEndOf="@id/cl_2"
        app:layoutDescription="@xml/fragment_listen_scene_result_4"
        android:background="@drawable/bg_white_8dp"
        app:layout_constraintTop_toTopOf="@id/cl_3"
        app:layout_constraintBottom_toBottomOf="@id/cl_3">
        <View
            android:layout_width="match_parent"
            android:layout_height="40dp"
            android:id="@+id/top_4"
            android:background="@color/page_bg"
            app:layout_constraintTop_toTopOf="parent"/>
        <com.facebook.drawee.view.SimpleDraweeView
            android:layout_width="match_parent"
            android:id="@+id/iv_4"
            android:layout_height="0dp"
            app:layout_constraintTop_toBottomOf="@id/top_4"
            app:layout_constraintBottom_toBottomOf="parent"/>
        <ImageView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:id="@+id/result_4" />
    </androidx.constraintlayout.motion.widget.MotionLayout>
    <androidx.constraintlayout.widget.ConstraintLayout
        android:layout_width="159dp"
        android:layout_height="52dp"
        app:layout_constraintTop_toTopOf="parent"
        android:elevation="2dp"
        android:id="@+id/cl_voice"
        android:background="@drawable/bg_blue_8dp">
        <ImageView
            android:id="@+id/iv1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:src="@mipmap/yuyin"
            app:layout_constraintTop_toTopOf="parent"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            android:layout_marginStart="25dp"/>
        <ImageView
            android:id="@+id/iv2"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:src="@mipmap/play"
            app:layout_constraintTop_toTopOf="parent"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintEnd_toEndOf="parent"
            android:layout_marginEnd="23dp"/>
        <ImageView
            android:id="@+id/iv_playing"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:visibility="gone"
            android:src="@mipmap/bofangzhong"
            app:layout_constraintTop_toTopOf="parent"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent" />
    </androidx.constraintlayout.widget.ConstraintLayout>
</androidx.constraintlayout.motion.widget.MotionLayout>
app/src/main/res/mipmap-xxhdpi/quanping.png
app/src/main/res/xml/fragment_include_scene.xml
New file
@@ -0,0 +1,169 @@
<?xml version="1.0" encoding="utf-8"?>
<MotionScene
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:motion="http://schemas.android.com/apk/res-auto">
    <Transition
        motion:constraintSetEnd="@+id/end"
        motion:constraintSetStart="@id/start"
        motion:duration="1000">
       <KeyFrameSet>
       </KeyFrameSet>
    </Transition>
    <ConstraintSet android:id="@+id/start_1">
        <Constraint android:id="@+id/iv_answer_1"
            android:layout_width="85dp"
            android:layout_height="52dp"
            motion:layout_constraintStart_toStartOf="@+id/cl_answer_1"
            motion:layout_constraintTop_toTopOf="@+id/cl_answer_1" />
    </ConstraintSet>
    <ConstraintSet android:id="@+id/start_2">
        <Constraint android:id="@+id/iv_answer_2"
            android:layout_width="85dp"
            android:layout_height="52dp"
            motion:layout_constraintStart_toStartOf="@+id/cl_answer_2"
            motion:layout_constraintTop_toTopOf="@+id/cl_answer_2" />
    </ConstraintSet>
    <ConstraintSet android:id="@+id/start_3">
        <Constraint android:id="@+id/iv_answer_3"
            android:layout_width="85dp"
            android:layout_height="52dp"
            motion:layout_constraintStart_toStartOf="@+id/cl_answer_3"
            motion:layout_constraintTop_toTopOf="@+id/cl_answer_3" />
    </ConstraintSet>
    <ConstraintSet android:id="@+id/end_1_1">
        <Constraint android:id="@+id/iv_answer_1"
            android:layout_height="0dp"
            android:layout_width="0dp"
            motion:layout_constraintStart_toStartOf="@+id/cl_3"
            motion:layout_constraintEnd_toEndOf="@+id/cl_3"
            motion:layout_constraintBottom_toBottomOf="@+id/cl_3"
            motion:layout_constraintTop_toTopOf="@+id/cl_3"
            android:layout_marginTop="4dp"
            android:layout_marginStart="4dp"
            android:layout_marginEnd="4dp"
            android:layout_marginBottom="4dp"/>
    </ConstraintSet>
    <ConstraintSet android:id="@+id/end_1_2">
        <Constraint android:id="@+id/iv_answer_1"
            android:layout_height="0dp"
            android:layout_width="0dp"
            motion:layout_constraintStart_toStartOf="@+id/cl_5"
            motion:layout_constraintEnd_toEndOf="@+id/cl_5"
            motion:layout_constraintBottom_toBottomOf="@+id/cl_5"
            motion:layout_constraintTop_toTopOf="@+id/cl_5"
            android:layout_marginTop="4dp"
            android:layout_marginStart="4dp"
            android:layout_marginEnd="4dp"
            android:layout_marginBottom="4dp"/>
    </ConstraintSet>
    <ConstraintSet android:id="@+id/end_1_3">
        <Constraint android:id="@+id/iv_answer_1"
            android:layout_height="0dp"
            android:layout_width="0dp"
            motion:layout_constraintStart_toStartOf="@+id/cl_6"
            motion:layout_constraintEnd_toEndOf="@+id/cl_6"
            motion:layout_constraintBottom_toBottomOf="@+id/cl_6"
            motion:layout_constraintTop_toTopOf="@+id/cl_6"
            android:layout_marginTop="4dp"
            android:layout_marginStart="4dp"
            android:layout_marginEnd="4dp"
            android:layout_marginBottom="4dp"/>
    </ConstraintSet>
    <ConstraintSet android:id="@+id/end_2_1">
        <Constraint android:id="@+id/iv_answer_2"
            android:layout_height="0dp"
            android:layout_width="0dp"
            motion:layout_constraintStart_toStartOf="@+id/cl_3"
            motion:layout_constraintEnd_toEndOf="@+id/cl_3"
            motion:layout_constraintBottom_toBottomOf="@+id/cl_3"
            motion:layout_constraintTop_toTopOf="@+id/cl_3"
            android:layout_marginTop="4dp"
            android:layout_marginStart="4dp"
            android:layout_marginEnd="4dp"
            android:layout_marginBottom="4dp"/>
    </ConstraintSet>
    <ConstraintSet android:id="@+id/end_2_2">
        <Constraint android:id="@+id/iv_answer_2"
            android:layout_height="0dp"
            android:layout_width="0dp"
            motion:layout_constraintStart_toStartOf="@+id/cl_5"
            motion:layout_constraintEnd_toEndOf="@+id/cl_5"
            motion:layout_constraintBottom_toBottomOf="@+id/cl_5"
            motion:layout_constraintTop_toTopOf="@+id/cl_5"
            android:layout_marginTop="4dp"
            android:layout_marginStart="4dp"
            android:layout_marginEnd="4dp"
            android:layout_marginBottom="4dp"/>
    </ConstraintSet>
    <ConstraintSet android:id="@+id/end_2_3">
        <Constraint android:id="@+id/iv_answer_2"
            android:layout_height="0dp"
            android:layout_width="0dp"
            motion:layout_constraintStart_toStartOf="@+id/cl_6"
            motion:layout_constraintEnd_toEndOf="@+id/cl_6"
            motion:layout_constraintBottom_toBottomOf="@+id/cl_6"
            motion:layout_constraintTop_toTopOf="@+id/cl_6"
            android:layout_marginTop="4dp"
            android:layout_marginStart="4dp"
            android:layout_marginEnd="4dp"
            android:layout_marginBottom="4dp"/>
    </ConstraintSet>
    <ConstraintSet android:id="@+id/end_3_1">
        <Constraint android:id="@+id/iv_answer_3"
            android:layout_height="0dp"
            android:layout_width="0dp"
            motion:layout_constraintStart_toStartOf="@+id/cl_3"
            motion:layout_constraintEnd_toEndOf="@+id/cl_3"
            motion:layout_constraintBottom_toBottomOf="@+id/cl_3"
            motion:layout_constraintTop_toTopOf="@+id/cl_3"
            android:layout_marginTop="4dp"
            android:layout_marginStart="4dp"
            android:layout_marginEnd="4dp"
            android:layout_marginBottom="4dp"/>
    </ConstraintSet>
    <ConstraintSet android:id="@+id/end_3_2">
        <Constraint android:id="@+id/iv_answer_3"
            android:layout_height="0dp"
            android:layout_width="0dp"
            motion:layout_constraintStart_toStartOf="@+id/cl_5"
            motion:layout_constraintEnd_toEndOf="@+id/cl_5"
            motion:layout_constraintBottom_toBottomOf="@+id/cl_5"
            motion:layout_constraintTop_toTopOf="@+id/cl_5"
            android:layout_marginTop="4dp"
            android:layout_marginStart="4dp"
            android:layout_marginEnd="4dp"
            android:layout_marginBottom="4dp"/>
    </ConstraintSet>
    <ConstraintSet android:id="@+id/end_3_3">
        <Constraint android:id="@+id/iv_answer_3"
            android:layout_height="0dp"
            android:layout_width="0dp"
            motion:layout_constraintStart_toStartOf="@+id/cl_6"
            motion:layout_constraintEnd_toEndOf="@+id/cl_6"
            motion:layout_constraintBottom_toBottomOf="@+id/cl_6"
            motion:layout_constraintTop_toTopOf="@+id/cl_6"
            android:layout_marginTop="4dp"
            android:layout_marginStart="4dp"
            android:layout_marginEnd="4dp"
            android:layout_marginBottom="4dp"/>
    </ConstraintSet>
</MotionScene>
app/src/main/res/xml/scene_fragment_choose_voice.xml
New file
@@ -0,0 +1,187 @@
<?xml version="1.0" encoding="utf-8"?>
<MotionScene
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:motion="http://schemas.android.com/apk/res-auto">
    <Transition
        motion:constraintSetEnd="@+id/end"
        motion:constraintSetStart="@id/start"
        motion:duration="2000">
        <KeyFrameSet>
        </KeyFrameSet>
    </Transition>
    <ConstraintSet android:id="@+id/start_1">
        <Constraint android:id="@+id/cl_voice1"
            motion:layout_constraintStart_toStartOf="@+id/rl_1"
            motion:layout_constraintTop_toTopOf="parent"
            android:layout_width="159dp"
            android:layout_marginTop="24dp"
            android:layout_height="52dp"/>
    </ConstraintSet>
    <ConstraintSet android:id="@+id/start_2">
        <Constraint android:id="@+id/cl_voice2"
            motion:layout_constraintStart_toStartOf="@+id/rl_2"
            motion:layout_constraintTop_toTopOf="parent"
            android:layout_width="159dp"
            android:layout_marginTop="24dp"
            android:layout_height="52dp"/>
    </ConstraintSet>
    <ConstraintSet android:id="@+id/start_3">
        <Constraint android:id="@+id/cl_voice3"
            motion:layout_constraintStart_toStartOf="@+id/rl_3"
            motion:layout_constraintTop_toTopOf="parent"
            android:layout_width="159dp"
            android:layout_marginTop="24dp"
            android:layout_height="52dp"/>
    </ConstraintSet>
    <ConstraintSet android:id="@+id/end_1_1">
        <Constraint android:id="@+id/cl_voice1"
            motion:layout_constraintStart_toStartOf="@+id/cl_1"
            motion:layout_constraintEnd_toEndOf="@+id/cl_1"
            motion:layout_constraintTop_toTopOf="@+id/cl_1"
            android:layout_marginTop="4dp"
            android:layout_marginStart="4dp"
            android:layout_marginEnd="4dp"
            android:layout_width="0dp"
            android:layout_height="40dp"/>
    </ConstraintSet>
    <ConstraintSet android:id="@+id/end_1_2">
        <Constraint android:id="@+id/cl_voice1"
            motion:layout_constraintStart_toStartOf="@+id/cl_2"
            motion:layout_constraintEnd_toEndOf="@+id/cl_2"
            motion:layout_constraintTop_toTopOf="@+id/cl_2"
            android:layout_width="0dp"
            android:layout_marginTop="4dp"
            android:layout_marginStart="4dp"
            android:layout_marginEnd="4dp"
            android:layout_height="40dp"/>
    </ConstraintSet>
    <ConstraintSet android:id="@+id/end_1_3">
        <Constraint android:id="@+id/cl_voice1"
            motion:layout_constraintStart_toStartOf="@+id/cl_3"
            motion:layout_constraintEnd_toEndOf="@+id/cl_3"
            motion:layout_constraintTop_toTopOf="@+id/cl_3"
            android:layout_width="0dp"
            android:layout_marginTop="4dp"
            android:layout_marginStart="4dp"
            android:layout_marginEnd="4dp"
            android:layout_height="40dp"/>
    </ConstraintSet>
    <ConstraintSet android:id="@+id/end_1_4">
        <Constraint android:id="@+id/cl_voice1"
            motion:layout_constraintStart_toStartOf="@+id/cl_4"
            motion:layout_constraintEnd_toEndOf="@+id/cl_4"
            motion:layout_constraintTop_toTopOf="@+id/cl_4"
            android:layout_width="0dp"
            android:layout_marginTop="4dp"
            android:layout_marginStart="4dp"
            android:layout_marginEnd="4dp"
            android:layout_height="40dp"/>
    </ConstraintSet>
    <ConstraintSet android:id="@+id/end_2_1">
        <Constraint android:id="@+id/cl_voice2"
            motion:layout_constraintStart_toStartOf="@+id/cl_1"
            motion:layout_constraintEnd_toEndOf="@+id/cl_1"
            motion:layout_constraintTop_toTopOf="@+id/cl_1"
            android:layout_marginTop="4dp"
            android:layout_marginStart="4dp"
            android:layout_marginEnd="4dp"
            android:layout_width="0dp"
            android:layout_height="40dp"/>
    </ConstraintSet>
    <ConstraintSet android:id="@+id/end_2_2">
        <Constraint android:id="@+id/cl_voice2"
            motion:layout_constraintStart_toStartOf="@+id/cl_2"
            motion:layout_constraintEnd_toEndOf="@+id/cl_2"
            motion:layout_constraintTop_toTopOf="@+id/cl_2"
            android:layout_width="0dp"
            android:layout_marginTop="4dp"
            android:layout_marginStart="4dp"
            android:layout_marginEnd="4dp"
            android:layout_height="40dp"/>
    </ConstraintSet>
    <ConstraintSet android:id="@+id/end_2_3">
        <Constraint android:id="@+id/cl_voice2"
            motion:layout_constraintStart_toStartOf="@+id/cl_3"
            motion:layout_constraintEnd_toEndOf="@+id/cl_3"
            motion:layout_constraintTop_toTopOf="@+id/cl_3"
            android:layout_width="0dp"
            android:layout_marginTop="4dp"
            android:layout_marginStart="4dp"
            android:layout_marginEnd="4dp"
            android:layout_height="40dp"/>
    </ConstraintSet>
    <ConstraintSet android:id="@+id/end_2_4">
        <Constraint android:id="@+id/cl_voice2"
            motion:layout_constraintStart_toStartOf="@+id/cl_4"
            motion:layout_constraintEnd_toEndOf="@+id/cl_4"
            motion:layout_constraintTop_toTopOf="@+id/cl_4"
            android:layout_width="0dp"
            android:layout_marginTop="4dp"
            android:layout_marginStart="4dp"
            android:layout_marginEnd="4dp"
            android:layout_height="40dp"/>
    </ConstraintSet>
    <ConstraintSet android:id="@+id/end_3_1">
        <Constraint android:id="@+id/cl_voice3"
            motion:layout_constraintStart_toStartOf="@+id/cl_1"
            motion:layout_constraintEnd_toEndOf="@+id/cl_1"
            motion:layout_constraintTop_toTopOf="@+id/cl_1"
            android:layout_marginTop="4dp"
            android:layout_marginStart="4dp"
            android:layout_marginEnd="4dp"
            android:layout_width="0dp"
            android:layout_height="40dp"/>
    </ConstraintSet>
    <ConstraintSet android:id="@+id/end_3_2">
        <Constraint android:id="@+id/cl_voice3"
            motion:layout_constraintStart_toStartOf="@+id/cl_2"
            motion:layout_constraintEnd_toEndOf="@+id/cl_2"
            motion:layout_constraintTop_toTopOf="@+id/cl_2"
            android:layout_width="0dp"
            android:layout_marginTop="4dp"
            android:layout_marginStart="4dp"
            android:layout_marginEnd="4dp"
            android:layout_height="40dp"/>
    </ConstraintSet>
    <ConstraintSet android:id="@+id/end_3_3">
        <Constraint android:id="@+id/cl_voice3"
            motion:layout_constraintStart_toStartOf="@+id/cl_3"
            motion:layout_constraintEnd_toEndOf="@+id/cl_3"
            motion:layout_constraintTop_toTopOf="@+id/cl_3"
            android:layout_width="0dp"
            android:layout_marginTop="4dp"
            android:layout_marginStart="4dp"
            android:layout_marginEnd="4dp"
            android:layout_height="40dp"/>
    </ConstraintSet>
    <ConstraintSet android:id="@+id/end_3_4">
        <Constraint android:id="@+id/cl_voice3"
            motion:layout_constraintStart_toStartOf="@+id/cl_4"
            motion:layout_constraintEnd_toEndOf="@+id/cl_4"
            motion:layout_constraintTop_toTopOf="@+id/cl_4"
            android:layout_width="0dp"
            android:layout_marginTop="4dp"
            android:layout_marginStart="4dp"
            android:layout_marginEnd="4dp"
            android:layout_height="40dp"/>
    </ConstraintSet>
</MotionScene>
app/src/main/res/xml/scene_fragment_listen_voice.xml
File was renamed from app/src/main/res/xml/fragment_listen_scene_voice_1.xml
@@ -15,7 +15,6 @@
    <ConstraintSet android:id="@+id/start">
        <Constraint android:id="@+id/cl_voice"
            motion:layout_constraintBottom_toBottomOf="@+id/iv_1"
            motion:layout_constraintStart_toStartOf="parent"
            motion:layout_constraintEnd_toEndOf="parent"
            motion:layout_constraintTop_toTopOf="parent"
xldutils-kotlin/src/main/res/values/colors.xml
@@ -19,7 +19,8 @@
    <color name="white">@android:color/white</color>
    <color name="black">@android:color/black</color>
    <color name="page_bg">#C3BFB3</color>
    <color name="color_text_price">#F7462D</color>
    <color name="grey_f1">#F1F1F1</color>
    <color name="color_text_price">#FA1616</color>
    <color name="colorOrange">#E37324</color>
    <color name="colorYellow">#FF9803</color>
    <color name="colorDeepGreen">#256D0F</color>