.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>