diff --git a/app/build.gradle b/app/build.gradle index 35af05c..0903507 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -20,8 +20,8 @@ android { applicationId "com.cheng.BoLe" minSdk 26 targetSdk 34 - versionCode 272 - versionName "2.7.2" + versionCode 273 + versionName "2.7.3" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" vectorDrawables { diff --git a/app/src/main/assets/effects/guide_earth.pag b/app/src/main/assets/effects/guide_earth.pag new file mode 100644 index 0000000..3289554 Binary files /dev/null and b/app/src/main/assets/effects/guide_earth.pag differ diff --git a/app/src/main/assets/fonts/AlibabaPuHuTi-Bold.otf b/app/src/main/assets/fonts/AlibabaPuHuTi-Bold.otf new file mode 100644 index 0000000..b3811e4 Binary files /dev/null and b/app/src/main/assets/fonts/AlibabaPuHuTi-Bold.otf differ diff --git a/app/src/main/java/com/cheng/blzb/common/Constants.kt b/app/src/main/java/com/cheng/blzb/common/Constants.kt index aaf4274..41fd6c8 100644 --- a/app/src/main/java/com/cheng/blzb/common/Constants.kt +++ b/app/src/main/java/com/cheng/blzb/common/Constants.kt @@ -33,4 +33,5 @@ object Constants { val pmzdbt = Typeface.createFromAsset(Utils.getApp().assets, "fonts/PangMenZhengDaoBiaoTiTi.ttf") val dtjbt = Typeface.createFromAsset(Utils.getApp().assets, "fonts/DingTalk-JinBuTi.ttf") val ysbth = Typeface.createFromAsset(Utils.getApp().assets, "fonts/YouSheBiaoTiHei.ttf") + val albbphtB = Typeface.createFromAsset(Utils.getApp().assets, "fonts/AlibabaPuHuTi-Bold.otf") } \ No newline at end of file diff --git a/app/src/main/java/com/cheng/blzb/ui/activity/LauncherActivity.kt b/app/src/main/java/com/cheng/blzb/ui/activity/LauncherActivity.kt index 41cc61f..ca0055b 100644 --- a/app/src/main/java/com/cheng/blzb/ui/activity/LauncherActivity.kt +++ b/app/src/main/java/com/cheng/blzb/ui/activity/LauncherActivity.kt @@ -116,7 +116,8 @@ class LauncherActivity : BaseActivity() { LoginActivity.start(this@LauncherActivity) } } else { - startActivity() +// startActivity() + startActivity() } finish() } diff --git a/app/src/main/java/com/cheng/blzb/ui/fragment/guide/GuideFragment.kt b/app/src/main/java/com/cheng/blzb/ui/fragment/guide/GuideFragment.kt index 47229fb..a6297d7 100644 --- a/app/src/main/java/com/cheng/blzb/ui/fragment/guide/GuideFragment.kt +++ b/app/src/main/java/com/cheng/blzb/ui/fragment/guide/GuideFragment.kt @@ -14,9 +14,9 @@ import com.cheng.blzb.manager.EventReportManager import com.cheng.blzb.manager.UserConfigManager import com.cheng.blzb.ui.base.BasePageAdapter import com.cheng.blzb.ui.fragment.guide.item.GuideItem1Fragment +import com.cheng.blzb.ui.fragment.guide.item.GuideItem4Fragment import com.cheng.blzb.ui.fragment.guide.item.GuideItem2Fragment import com.cheng.blzb.ui.fragment.guide.item.GuideItem3Fragment -import com.cheng.blzb.ui.fragment.guide.item.GuideItem4Fragment import com.cheng.blzb.ui.fragment.guide.item.GuideItem5Fragment import com.example.base.common.RxBus import com.example.base.ui.BaseFragment diff --git a/app/src/main/java/com/cheng/blzb/ui/fragment/guide/adapter/GuideItem4Adapter.kt b/app/src/main/java/com/cheng/blzb/ui/fragment/guide/adapter/GuideItem3Adapter.kt similarity index 83% rename from app/src/main/java/com/cheng/blzb/ui/fragment/guide/adapter/GuideItem4Adapter.kt rename to app/src/main/java/com/cheng/blzb/ui/fragment/guide/adapter/GuideItem3Adapter.kt index dee39c5..1806119 100644 --- a/app/src/main/java/com/cheng/blzb/ui/fragment/guide/adapter/GuideItem4Adapter.kt +++ b/app/src/main/java/com/cheng/blzb/ui/fragment/guide/adapter/GuideItem3Adapter.kt @@ -6,14 +6,14 @@ import com.cheng.blzb.R import com.cheng.blzb.bean.HotWordEntity import com.example.base.extensions.getColor -class GuideItem4Adapter : BaseQuickAdapter(R.layout.listitem_guide_item4) { +class GuideItem3Adapter : BaseQuickAdapter(R.layout.listitem_guide_item3) { override fun convert(holder: BaseViewHolder, item: HotWordEntity.Child) { holder.setText(R.id.tv_name, item.name) if (item.isChecked) { - holder.setImageResource(R.id.iv_add, R.mipmap.ic_guide_item4_checked) + holder.setImageResource(R.id.iv_add, R.mipmap.ic_guide_item3_checked) holder.setTextColor(R.id.tv_name, getColor(R.color.color_125ffe)) } else { - holder.setImageResource(R.id.iv_add, R.mipmap.ic_guide_item4_default) + holder.setImageResource(R.id.iv_add, R.mipmap.ic_guide_item3_default) holder.setTextColor(R.id.tv_name, getColor(R.color.color_1a1a1a)) } } diff --git a/app/src/main/java/com/cheng/blzb/ui/fragment/guide/adapter/GuideItem4SelectedAdapter.kt b/app/src/main/java/com/cheng/blzb/ui/fragment/guide/adapter/GuideItem3SelectedAdapter.kt similarity index 86% rename from app/src/main/java/com/cheng/blzb/ui/fragment/guide/adapter/GuideItem4SelectedAdapter.kt rename to app/src/main/java/com/cheng/blzb/ui/fragment/guide/adapter/GuideItem3SelectedAdapter.kt index e520917..1716d93 100644 --- a/app/src/main/java/com/cheng/blzb/ui/fragment/guide/adapter/GuideItem4SelectedAdapter.kt +++ b/app/src/main/java/com/cheng/blzb/ui/fragment/guide/adapter/GuideItem3SelectedAdapter.kt @@ -8,7 +8,7 @@ import com.cheng.blzb.R import com.cheng.blzb.bean.HotWordEntity import com.example.base.extensions.getColor -class GuideItem4SelectedAdapter: BaseQuickAdapter(R.layout.listitem_guide4_selected_keyword) { +class GuideItem3SelectedAdapter: BaseQuickAdapter(R.layout.listitem_guide3_selected_keyword) { init { addChildClickViewIds(R.id.iv_delete) @@ -18,7 +18,7 @@ class GuideItem4SelectedAdapter: BaseQuickAdapter(R.layout.listitem_guide_area1) { +class GuideItem4Area1Adapter: BaseQuickAdapter(R.layout.listitem_guide_area1) { override fun convert(holder: BaseViewHolder, item: AreaEntity) { holder.setText(R.id.tv_name, item.name) holder.setTextColor(R.id.tv_name, if (item.isChecked) getColor(R.color.color_125ffe) else getColor(R.color.color_222222)) diff --git a/app/src/main/java/com/cheng/blzb/ui/fragment/guide/adapter/GuideItem2Area2Adapter.kt b/app/src/main/java/com/cheng/blzb/ui/fragment/guide/adapter/GuideItem4Area2Adapter.kt similarity index 94% rename from app/src/main/java/com/cheng/blzb/ui/fragment/guide/adapter/GuideItem2Area2Adapter.kt rename to app/src/main/java/com/cheng/blzb/ui/fragment/guide/adapter/GuideItem4Area2Adapter.kt index 62a5523..8636272 100644 --- a/app/src/main/java/com/cheng/blzb/ui/fragment/guide/adapter/GuideItem2Area2Adapter.kt +++ b/app/src/main/java/com/cheng/blzb/ui/fragment/guide/adapter/GuideItem4Area2Adapter.kt @@ -11,7 +11,7 @@ import com.example.base.decoration.GridSpaceItemDecoration import com.example.base.extensions.onClick import com.example.base.utils.DensityUtils -class GuideItem2Area2Adapter(): BaseQuickAdapter(R.layout.listitem_guide_area2) { +class GuideItem4Area2Adapter(): BaseQuickAdapter(R.layout.listitem_guide_area2) { private var mListener: (() -> Unit)? = null @SuppressLint("NotifyDataSetChanged") @@ -23,11 +23,11 @@ class GuideItem2Area2Adapter(): BaseQuickAdapter(R.l tvName.text = item.name if (rvCity.adapter == null) { - val adapter = GuideItem2CityAdapter() + val adapter = GuideItem4CityAdapter() rvCity.adapter = adapter rvCity.addItemDecoration(GridSpaceItemDecoration(2, DensityUtils.dp2px(10f), DensityUtils.dp2px(10f))) } - val cityAdapter = rvCity.adapter as GuideItem2CityAdapter + val cityAdapter = rvCity.adapter as GuideItem4CityAdapter cityAdapter.setList(item.children) if (item.id == 0) { diff --git a/app/src/main/java/com/cheng/blzb/ui/fragment/guide/adapter/GuideItem2CityAdapter.kt b/app/src/main/java/com/cheng/blzb/ui/fragment/guide/adapter/GuideItem4CityAdapter.kt similarity index 90% rename from app/src/main/java/com/cheng/blzb/ui/fragment/guide/adapter/GuideItem2CityAdapter.kt rename to app/src/main/java/com/cheng/blzb/ui/fragment/guide/adapter/GuideItem4CityAdapter.kt index b116a7e..a78a0fa 100644 --- a/app/src/main/java/com/cheng/blzb/ui/fragment/guide/adapter/GuideItem2CityAdapter.kt +++ b/app/src/main/java/com/cheng/blzb/ui/fragment/guide/adapter/GuideItem4CityAdapter.kt @@ -5,7 +5,7 @@ import com.chad.library.adapter.base.viewholder.BaseViewHolder import com.cheng.blzb.R import com.cheng.blzb.bean.AreaEntity -class GuideItem2CityAdapter: BaseQuickAdapter(R.layout.listitem_guide_city) { +class GuideItem4CityAdapter: BaseQuickAdapter(R.layout.listitem_guide_city) { override fun convert(holder: BaseViewHolder, item: AreaEntity) { holder.setImageResource(R.id.iv_cover, item.getCityImage()) holder.setText(R.id.tv_city_name, item.name) diff --git a/app/src/main/java/com/cheng/blzb/ui/fragment/guide/item/GuideItem1Fragment.kt b/app/src/main/java/com/cheng/blzb/ui/fragment/guide/item/GuideItem1Fragment.kt index e67d20e..6dc1cce 100644 --- a/app/src/main/java/com/cheng/blzb/ui/fragment/guide/item/GuideItem1Fragment.kt +++ b/app/src/main/java/com/cheng/blzb/ui/fragment/guide/item/GuideItem1Fragment.kt @@ -6,6 +6,7 @@ import android.animation.PropertyValuesHolder import android.view.ViewTreeObserver import android.view.animation.LinearInterpolator import androidx.core.animation.addListener +import com.cheng.blzb.common.Constants import com.cheng.blzb.databinding.FragmentGuideItem1Binding import com.cheng.blzb.event.GuideEvent import com.cheng.blzb.ui.fragment.guide.GuideViewModel @@ -14,10 +15,23 @@ import com.example.base.extensions.onClick import com.example.base.extensions.visible import com.example.base.ui.BaseFragment import com.example.base.utils.DensityUtils +import com.example.base.utils.ScreenUtils +import org.libpag.PAGFile class GuideItem1Fragment : BaseFragment() { private var canClick = false + override fun initView() { + super.initView() + binding.tvTitle.typeface = Constants.albbphtB + binding.tvAppName.typeface = Constants.pmzdbt + binding.tvBtn.typeface = Constants.almmsht + + val pagFile = PAGFile.Load(requireContext().assets, "effects/guide_earth.pag") + binding.pagView.composition = pagFile + binding.pagView.setRepeatCount(0) + } + override fun onLazyLoad() { super.onLazyLoad() binding.root.viewTreeObserver.addOnGlobalLayoutListener(object : ViewTreeObserver.OnGlobalLayoutListener { @@ -30,7 +44,7 @@ class GuideItem1Fragment : BaseFragment() { - private val area1Adapter by lazy { GuideItem2Area1Adapter() } - - private val area2Adapter by lazy { GuideItem2Area2Adapter() } + private val ids = mutableListOf() private var canClick = false override fun initView() { super.initView() - binding.btnNext.typeface = Constants.almmsht - - binding.rvArea1.adapter = area1Adapter - binding.rvArea2.adapter = area2Adapter + binding.tvName1.typeface = Constants.douyinsansB + binding.tvName2.typeface = Constants.douyinsansB + binding.tvName3.typeface = Constants.douyinsansB + binding.tvName4.typeface = Constants.douyinsansB + binding.tvName5.typeface = Constants.douyinsansB + binding.tvName6.typeface = Constants.douyinsansB + binding.tvName7.typeface = Constants.douyinsansB + binding.tvName8.typeface = Constants.douyinsansB } override fun onLazyLoad() { super.onLazyLoad() - if (UserConfigManager.getAreaList().isNotEmpty()) { + if (UserConfigManager.getGuideKeywords().isNotEmpty()) { setData() } else { - mViewModel.getCityList() + mViewModel.getHotWordList() } + } - @SuppressLint("NotifyDataSetChanged") override fun initListener() { super.initListener() - area1Adapter.setOnItemClickListener { _, _, position -> - val item = area1Adapter.getItem(position) - area1Adapter.data.find { it.isChecked }?.isChecked = false - item.isChecked = true - - scrollToPosition(position) + binding.layoutOption1.onClick { + val id = binding.layoutOption1.tag as Int + if (ids.contains(id)) { + ids.remove(id) + binding.ivCheck1.gone() + } else { + ids.add(id) + binding.ivCheck1.visible() + } } - area2Adapter.setOnCityClickListener { - val selectList = mutableListOf() - area2Adapter.data.forEach { area -> - selectList.addAll(area.children.filter { it.isChecked }) + binding.layoutOption2.onClick { + val id = binding.layoutOption2.tag as Int + if (ids.contains(id)) { + ids.remove(id) + binding.ivCheck2.gone() + } else { + ids.add(id) + binding.ivCheck2.visible() } - binding.tvCityCount.text = "${selectList.size}" } - binding.rvArea2.addOnScrollListener(object : RecyclerView.OnScrollListener() { - override fun onScrolled(recyclerView: RecyclerView, dx: Int, dy: Int) { - super.onScrolled(recyclerView, dx, dy) - val layoutManager = binding.rvArea2.layoutManager as LinearLayoutManager - val firstPosition = layoutManager.findFirstCompletelyVisibleItemPosition() - - if (firstPosition >= 0) { - val firstItem = area1Adapter.getItem(firstPosition) - area1Adapter.data.find { it.isChecked }?.isChecked = false - firstItem.isChecked = true - area1Adapter.notifyDataSetChanged() - } + binding.layoutOption3.onClick { + val id = binding.layoutOption3.tag as Int + if (ids.contains(id)) { + ids.remove(id) + binding.ivCheck3.gone() + } else { + ids.add(id) + binding.ivCheck3.visible() } - }) + } - binding.btnNext.onClick { + binding.layoutOption4.onClick { + val id = binding.layoutOption4.tag as Int + if (ids.contains(id)) { + ids.remove(id) + binding.ivCheck4.gone() + } else { + ids.add(id) + binding.ivCheck4.visible() + } + } + + binding.layoutOption5.onClick { + val id = binding.layoutOption5.tag as Int + if (ids.contains(id)) { + ids.remove(id) + binding.ivCheck5.gone() + } else { + ids.add(id) + binding.ivCheck5.visible() + } + } + + binding.layoutOption6.onClick { + val id = binding.layoutOption6.tag as Int + if (ids.contains(id)) { + ids.remove(id) + binding.ivCheck6.gone() + } else { + ids.add(id) + binding.ivCheck6.visible() + } + } + + binding.layoutOption7.onClick { + val id = binding.layoutOption7.tag as Int + if (ids.contains(id)) { + ids.remove(id) + binding.ivCheck7.gone() + } else { + ids.add(id) + binding.ivCheck7.visible() + } + } + + binding.layoutOption8.onClick { + val id = 0 + if (ids.contains(id)) { + ids.remove(id) + binding.ivCheck8.gone() + } else { + ids.add(id) + binding.ivCheck8.visible() + } + } + + binding.ivBtn.onClick { if (canClick) { - val selectList = mutableListOf() - area1Adapter.data.forEach { area -> - selectList.addAll(area.children.filter { it.isChecked }) - } - if (selectList.isEmpty()) { - toast("请选择地区") + if (ids.isEmpty()) { + toast("请选择行业") return@onClick } - GuideFragment.cityList.addAll(selectList) - RxBus.defaultInstance.post(GuideEvent(2)) + val hasOther = ids.contains(0) + val selectedList = if (hasOther) { + UserConfigManager.getGuideKeywords() + } else { + UserConfigManager.getGuideKeywords().filter { ids.contains(it.id) } + } + selectedList.forEach { + GuideFragment.hotWordList.addAll(it.children) + } + RxBus.defaultInstance.post(GuideEvent(3)) } } } override fun initObserve() { super.initObserve() - mViewModel.cityLiveData.observe(this) { - UserConfigManager.saveAreaList(it) + mViewModel.hotWordLiveData.observe(this) { + UserConfigManager.saveGuideKeywords(it) setData() } } private fun setData() { - val areaList = UserConfigManager.getAreaList() - areaList.add(0, AreaEntity(0, name = "全国地区", isChecked = true)) - area1Adapter.setList(areaList) - area2Adapter.setList(areaList) + val hotWords = UserConfigManager.getGuideKeywords() + hotWords.forEachIndexed { index, item -> + when(index) { + 0 -> { + binding.tvName1.text = item.name + binding.ivIcon1.setImageResource(R.mipmap.ic_guide_item3_icon1) + binding.layoutOption1.tag = item.id + } + 1 -> { + binding.tvName2.text = item.name + binding.ivIcon2.setImageResource(R.mipmap.ic_guide_item3_icon2) + binding.layoutOption2.tag = item.id + } + 2 -> { + binding.tvName3.text = item.name + binding.ivIcon3.setImageResource(R.mipmap.ic_guide_item3_icon3) + binding.layoutOption3.tag = item.id + } + 3 -> { + binding.tvName4.text = item.name + binding.ivIcon4.setImageResource(R.mipmap.ic_guide_item3_icon4) + binding.layoutOption4.tag = item.id + } + 4 -> { + binding.tvName5.text = item.name + binding.ivIcon5.setImageResource(R.mipmap.ic_guide_item3_icon5) + binding.layoutOption5.tag = item.id + } + 5 -> { + binding.tvName6.text = item.name + binding.ivIcon6.setImageResource(R.mipmap.ic_guide_item3_icon6) + binding.layoutOption6.tag = item.id + } + 6 -> { + binding.tvName7.text = item.name + binding.ivIcon7.setImageResource(R.mipmap.ic_guide_item3_icon7) + binding.layoutOption7.tag = item.id + } + } + } startAnim() } - private fun scrollToPosition(position: Int) { - binding.rvArea2.layoutManager?.startSmoothScroll( - LinearTopSmoothScroller(requireContext(), true) - .apply { targetPosition = position } - ) - } - private fun startAnim() { - val titleTransAnim = ObjectAnimator.ofFloat(binding.ivTitle, "translationX", -DensityUtils.dp2px(200f).toFloat(), 0f) + val scaleXHolder = PropertyValuesHolder.ofFloat("scaleX", 0.85f, 1.15f, 0.9f, 1.1f, 0.95f, 1f) + val scaleYHolder = PropertyValuesHolder.ofFloat("scaleY", 0.85f, 1.15f, 0.9f, 1.1f, 0.95f, 1f) + + val option1ScaleAnim = ObjectAnimator.ofPropertyValuesHolder(binding.layoutOption1, scaleXHolder, scaleYHolder) + option1ScaleAnim.duration = 1000 + option1ScaleAnim.startDelay = 1000 + option1ScaleAnim.interpolator = LinearInterpolator() + option1ScaleAnim.addListener(onStart = { + binding.layoutOption1.visible() + }) + + val option2ScaleAnim = ObjectAnimator.ofPropertyValuesHolder(binding.layoutOption2, scaleXHolder, scaleYHolder) + option2ScaleAnim.duration = 1000 + option2ScaleAnim.startDelay = 1400 + option2ScaleAnim.interpolator = LinearInterpolator() + option2ScaleAnim.addListener(onStart = { + binding.layoutOption2.visible() + }) + + val option3ScaleAnim = ObjectAnimator.ofPropertyValuesHolder(binding.layoutOption3, scaleXHolder, scaleYHolder) + option3ScaleAnim.duration = 1000 + option3ScaleAnim.startDelay = 1800 + option3ScaleAnim.interpolator = LinearInterpolator() + option3ScaleAnim.addListener(onStart = { + binding.layoutOption3.visible() + }) + + val option4ScaleAnim = ObjectAnimator.ofPropertyValuesHolder(binding.layoutOption4, scaleXHolder, scaleYHolder) + option4ScaleAnim.duration = 1000 + option4ScaleAnim.startDelay = 1400 + option4ScaleAnim.interpolator = LinearInterpolator() + option4ScaleAnim.addListener(onStart = { + binding.layoutOption4.visible() + }) + + val option5ScaleAnim = ObjectAnimator.ofPropertyValuesHolder(binding.layoutOption5, scaleXHolder, scaleYHolder) + option5ScaleAnim.duration = 1000 + option5ScaleAnim.startDelay = 1800 + option5ScaleAnim.interpolator = LinearInterpolator() + option5ScaleAnim.addListener(onStart = { + binding.layoutOption5.visible() + }) + + val option6ScaleAnim = ObjectAnimator.ofPropertyValuesHolder(binding.layoutOption6, scaleXHolder, scaleYHolder) + option6ScaleAnim.duration = 1000 + option6ScaleAnim.startDelay = 1200 + option6ScaleAnim.interpolator = LinearInterpolator() + option6ScaleAnim.addListener(onStart = { + binding.layoutOption6.visible() + }) + + val option7ScaleAnim = ObjectAnimator.ofPropertyValuesHolder(binding.layoutOption7, scaleXHolder, scaleYHolder) + option7ScaleAnim.duration = 1000 + option7ScaleAnim.startDelay = 1600 + option7ScaleAnim.interpolator = LinearInterpolator() + option7ScaleAnim.addListener(onStart = { + binding.layoutOption7.visible() + }) + + val option8ScaleAnim = ObjectAnimator.ofPropertyValuesHolder(binding.layoutOption8, scaleXHolder, scaleYHolder) + option8ScaleAnim.duration = 1000 + option8ScaleAnim.startDelay = 1800 + option8ScaleAnim.interpolator = LinearInterpolator() + option8ScaleAnim.addListener(onStart = { + binding.layoutOption8.visible() + }) + + val bgTransAnim = ObjectAnimator.ofFloat(binding.ivBg, "translationY", ScreenUtils.getScreenHeight().toFloat(), 0f) + bgTransAnim.duration = 1000 + bgTransAnim.addListener(onStart = { + binding.ivBg.visible() + }) + + val titleTransAnim = ObjectAnimator.ofFloat(binding.ivTitle, "translationY", -DensityUtils.dp2px(200f).toFloat(), 0f) titleTransAnim.duration = 1000 - titleTransAnim.startDelay = 600 + titleTransAnim.startDelay = 200 titleTransAnim.addListener(onStart = { binding.ivTitle.visible() }) - val descTransAnim = ObjectAnimator.ofFloat(binding.ivDesc, "translationX", -DensityUtils.dp2px(200f).toFloat(), 0f) + val descTransAnim = ObjectAnimator.ofFloat(binding.ivDesc, "translationY", -DensityUtils.dp2px(200f).toFloat(), 0f) descTransAnim.duration = 1000 - descTransAnim.startDelay = 600 + descTransAnim.startDelay = 200 descTransAnim.addListener(onStart = { binding.ivDesc.visible() }) - val contentTransAnim = ObjectAnimator.ofFloat(binding.layoutContent, "translationY", ScreenUtils.getScreenHeight().toFloat(), 0f) - contentTransAnim.duration = 1000 - contentTransAnim.addListener(onStart = { - binding.layoutContent.visible() - }) - - val icon1TransAnim = ObjectAnimator.ofFloat(binding.ivIcon1, "translationX", DensityUtils.dp2px(200f).toFloat(), 0f) - icon1TransAnim.duration = 1000 - icon1TransAnim.startDelay = 600 - icon1TransAnim.addListener(onStart = { - binding.ivIcon1.visible() - }) - - val icon2TransAnim = ObjectAnimator.ofFloat(binding.ivIcon2, "translationY", DensityUtils.dp2px(200f).toFloat(), 0f) - icon2TransAnim.duration = 1000 - icon2TransAnim.startDelay = 400 - icon2TransAnim.addListener(onStart = { - binding.ivIcon2.visible() - }) - - val countTransAnim = ObjectAnimator.ofFloat(binding.tvCityCount, "translationY", DensityUtils.dp2px(200f).toFloat(), 0f) - countTransAnim.duration = 1000 - countTransAnim.startDelay = 400 - countTransAnim.addListener(onStart = { - binding.tvCityCount.visible() - }) - - val btnTransAnim = ObjectAnimator.ofFloat(binding.btnNext, "translationY", DensityUtils.dp2px(200f).toFloat(), 0f) - btnTransAnim.duration = 1000 - btnTransAnim.startDelay = 400 - btnTransAnim.addListener(onStart = { - binding.btnNext.visible() + val btnScaleAnim = ObjectAnimator.ofPropertyValuesHolder(binding.ivBtn, scaleXHolder, scaleYHolder) + btnScaleAnim.duration = 1000 + btnScaleAnim.startDelay = 600 + btnScaleAnim.interpolator = LinearInterpolator() + btnScaleAnim.addListener(onStart = { + binding.ivBtn.visible() }, onEnd = { canClick = true }) val animSet = AnimatorSet() - animSet.playTogether(titleTransAnim, descTransAnim, contentTransAnim, icon1TransAnim, icon2TransAnim, countTransAnim, btnTransAnim) + animSet.playTogether( + option1ScaleAnim, + option2ScaleAnim, + option3ScaleAnim, + option4ScaleAnim, + option5ScaleAnim, + option6ScaleAnim, + option7ScaleAnim, + option8ScaleAnim, + bgTransAnim, + titleTransAnim, + descTransAnim, + btnScaleAnim + ) animSet.start() } } \ No newline at end of file diff --git a/app/src/main/java/com/cheng/blzb/ui/fragment/guide/item/GuideItem3Fragment.kt b/app/src/main/java/com/cheng/blzb/ui/fragment/guide/item/GuideItem3Fragment.kt index 3e84c2c..6d84953 100644 --- a/app/src/main/java/com/cheng/blzb/ui/fragment/guide/item/GuideItem3Fragment.kt +++ b/app/src/main/java/com/cheng/blzb/ui/fragment/guide/item/GuideItem3Fragment.kt @@ -2,286 +2,210 @@ package com.cheng.blzb.ui.fragment.guide.item import android.animation.AnimatorSet import android.animation.ObjectAnimator -import android.animation.PropertyValuesHolder +import android.view.Gravity import android.view.animation.LinearInterpolator +import android.view.animation.RotateAnimation +import android.widget.TextView import androidx.core.animation.addListener import com.cheng.blzb.R -import com.cheng.blzb.common.Constants +import com.cheng.blzb.bean.HotWordEntity import com.cheng.blzb.databinding.FragmentGuideItem3Binding import com.cheng.blzb.event.GuideEvent -import com.cheng.blzb.manager.UserConfigManager +import com.cheng.blzb.ui.dialog.AddKeywordDialog import com.cheng.blzb.ui.fragment.guide.GuideFragment import com.cheng.blzb.ui.fragment.guide.GuideViewModel +import com.cheng.blzb.ui.fragment.guide.adapter.GuideItem3Adapter +import com.cheng.blzb.ui.fragment.guide.adapter.GuideItem3SelectedAdapter import com.example.base.common.RxBus -import com.example.base.extensions.gone +import com.example.base.decoration.GridSpaceItemDecoration +import com.example.base.extensions.getColor import com.example.base.extensions.onClick import com.example.base.extensions.toast import com.example.base.extensions.visible import com.example.base.ui.BaseFragment import com.example.base.utils.DensityUtils import com.example.base.utils.ScreenUtils +import com.example.base.utils.SpanUtils +import kotlin.math.ceil class GuideItem3Fragment : BaseFragment() { - private val ids = mutableListOf() + private val mAdapter by lazy { GuideItem3Adapter() } + + private val selectedAdapter by lazy { GuideItem3SelectedAdapter() } + + private val hotWordChildList = mutableListOf() + + private var tabIndex = 0 + + private var page = 0 private var canClick = false override fun initView() { super.initView() - binding.tvName1.typeface = Constants.douyinsansB - binding.tvName2.typeface = Constants.douyinsansB - binding.tvName3.typeface = Constants.douyinsansB - binding.tvName4.typeface = Constants.douyinsansB - binding.tvName5.typeface = Constants.douyinsansB - binding.tvName6.typeface = Constants.douyinsansB - binding.tvName7.typeface = Constants.douyinsansB - binding.tvName8.typeface = Constants.douyinsansB + binding.mRecyclerView.adapter = mAdapter + binding.mRecyclerView.addItemDecoration(GridSpaceItemDecoration(3, DensityUtils.dp2px(10f), DensityUtils.dp2px(10f))) + + binding.rvSelectedKeywords.adapter = selectedAdapter + binding.rvSelectedKeywords.addItemDecoration(GridSpaceItemDecoration(3, DensityUtils.dp2px(10f), DensityUtils.dp2px(10f))) + selectedAdapter.addData(HotWordEntity.Child(id = -1, name = "自定义", isChecked = true)) + setKeywordCount() } override fun onLazyLoad() { super.onLazyLoad() - if (UserConfigManager.getGuideKeywords().isNotEmpty()) { - setData() - } else { - mViewModel.getHotWordList() + hotWordChildList.addAll(GuideFragment.hotWordList) + hotWordChildList.forEach { item -> + binding.tabLayout.addView(createTab(item.name)) } + startAnim() } override fun initListener() { super.initListener() - binding.layoutOption1.onClick { - val id = binding.layoutOption1.tag as Int - if (ids.contains(id)) { - ids.remove(id) - binding.ivCheck1.gone() - } else { - ids.add(id) - binding.ivCheck1.visible() + binding.tabLayout.observeIndexChange { fromIndex, toIndex, _, _ -> + page = 0 + tabIndex = toIndex + + if (fromIndex >= 0) { + val textView = binding.tabLayout.getChildAt(fromIndex) + textView.setBackgroundResource(0) } + if (toIndex >= 0) { + val textView = binding.tabLayout.getChildAt(toIndex) + textView.setBackgroundResource(R.drawable.shape_f5f8ff_top_cor16) + } + + val hotWordChild = hotWordChildList[toIndex] + binding.tvAmount.text = "${hotWordChild.amount}亿元" + + val keywordList = mutableListOf() + for (i in 0 until 15) { + keywordList.add(hotWordChild.children[i]) + } + mAdapter.setList(keywordList) } - binding.layoutOption2.onClick { - val id = binding.layoutOption2.tag as Int - if (ids.contains(id)) { - ids.remove(id) - binding.ivCheck2.gone() + binding.ivRefresh.onClick { + startRotate() + val hotWordChild = hotWordChildList[tabIndex] + if (ceil(hotWordChild.children.size / 15.0) > page + 1) { + page++ } else { - ids.add(id) - binding.ivCheck2.visible() + page = 0 } - } - - binding.layoutOption3.onClick { - val id = binding.layoutOption3.tag as Int - if (ids.contains(id)) { - ids.remove(id) - binding.ivCheck3.gone() - } else { - ids.add(id) - binding.ivCheck3.visible() - } - } - - binding.layoutOption4.onClick { - val id = binding.layoutOption4.tag as Int - if (ids.contains(id)) { - ids.remove(id) - binding.ivCheck4.gone() - } else { - ids.add(id) - binding.ivCheck4.visible() - } - } - - binding.layoutOption5.onClick { - val id = binding.layoutOption5.tag as Int - if (ids.contains(id)) { - ids.remove(id) - binding.ivCheck5.gone() - } else { - ids.add(id) - binding.ivCheck5.visible() - } - } - - binding.layoutOption6.onClick { - val id = binding.layoutOption6.tag as Int - if (ids.contains(id)) { - ids.remove(id) - binding.ivCheck6.gone() - } else { - ids.add(id) - binding.ivCheck6.visible() - } - } - - binding.layoutOption7.onClick { - val id = binding.layoutOption7.tag as Int - if (ids.contains(id)) { - ids.remove(id) - binding.ivCheck7.gone() - } else { - ids.add(id) - binding.ivCheck7.visible() - } - } - - binding.layoutOption8.onClick { - val id = 0 - if (ids.contains(id)) { - ids.remove(id) - binding.ivCheck8.gone() - } else { - ids.add(id) - binding.ivCheck8.visible() + val keywordList = mutableListOf() + for (i in page * 15 until ((page + 1) * 15).coerceAtMost(hotWordChild.children.size)) { + keywordList.add(hotWordChild.children[i]) } + mAdapter.setList(keywordList) } binding.ivBtn.onClick { - if (canClick) { - if (ids.isEmpty()) { - toast("请选择行业") - return@onClick + if (!canClick) return@onClick + if (selectedAdapter.data.size == 1) { + toast("请添加关键词") + return@onClick + } + val keywords = selectedAdapter.data.filter { it.id != -1 }.map { it.name } + val cityIds = GuideFragment.cityList.map { it.id } + mViewModel.getTotalBidInfo(keywords.joinToString(","), cityIds.joinToString(","), "${hotWordChildList.size}") + } + + mAdapter.setOnItemClickListener { _, _, i -> + if (!canClick) return@setOnItemClickListener + val item = mAdapter.getItem(i) + if (!item.isChecked && selectedAdapter.data.size == 6) { + toast("最多添加5个关键词") + return@setOnItemClickListener + } + + item.isChecked = !item.isChecked + mAdapter.notifyDataSetChanged() + if (item.isChecked) { + selectedAdapter.addData(item) + } else { + selectedAdapter.remove(item) + } + setKeywordCount() + } + + selectedAdapter.setOnItemClickListener { _, _, i -> + val item = selectedAdapter.getItem(i) + if (item.id == -1) { + if (selectedAdapter.data.size == 6) { + toast("最多添加5个关键词") + return@setOnItemClickListener } - val hasOther = ids.contains(0) - val selectedList = if (hasOther) { - UserConfigManager.getGuideKeywords() - } else { - UserConfigManager.getGuideKeywords().filter { ids.contains(it.id) } + val f = AddKeywordDialog.newInstance() + f.setOnBackListener { + selectedAdapter.addData(HotWordEntity.Child(name = it, isChecked = true)) + setKeywordCount() } - selectedList.forEach { - GuideFragment.hotWordList.addAll(it.children) - } - RxBus.defaultInstance.post(GuideEvent(3)) + f.show(childFragmentManager, "") + } + } + + selectedAdapter.setOnItemChildClickListener { _, view, i -> + val item = selectedAdapter.getItem(i) + if (!canClick || item.id == -1) return@setOnItemChildClickListener + if (view.id == R.id.iv_delete) { + selectedAdapter.remove(item) + item.isChecked = false + mAdapter.notifyDataSetChanged() + setKeywordCount() } } } override fun initObserve() { super.initObserve() - mViewModel.hotWordLiveData.observe(this) { - UserConfigManager.saveGuideKeywords(it) - setData() + mViewModel.totalLiveData.observe(this) { + GuideFragment.totalInfo = it + RxBus.defaultInstance.post(GuideEvent(4)) } } - private fun setData() { - val hotWords = UserConfigManager.getGuideKeywords() - hotWords.forEachIndexed { index, item -> - when(index) { - 0 -> { - binding.tvName1.text = item.name - binding.ivIcon1.setImageResource(R.mipmap.ic_guide_item3_icon1) - binding.layoutOption1.tag = item.id - } - 1 -> { - binding.tvName2.text = item.name - binding.ivIcon2.setImageResource(R.mipmap.ic_guide_item3_icon2) - binding.layoutOption2.tag = item.id - } - 2 -> { - binding.tvName3.text = item.name - binding.ivIcon3.setImageResource(R.mipmap.ic_guide_item3_icon3) - binding.layoutOption3.tag = item.id - } - 3 -> { - binding.tvName4.text = item.name - binding.ivIcon4.setImageResource(R.mipmap.ic_guide_item3_icon4) - binding.layoutOption4.tag = item.id - } - 4 -> { - binding.tvName5.text = item.name - binding.ivIcon5.setImageResource(R.mipmap.ic_guide_item3_icon5) - binding.layoutOption5.tag = item.id - } - 5 -> { - binding.tvName6.text = item.name - binding.ivIcon6.setImageResource(R.mipmap.ic_guide_item3_icon6) - binding.layoutOption6.tag = item.id - } - 6 -> { - binding.tvName7.text = item.name - binding.ivIcon7.setImageResource(R.mipmap.ic_guide_item3_icon7) - binding.layoutOption7.tag = item.id - } - } + private fun setKeywordCount() { + SpanUtils.with(binding.tvKeywordsCount) + .append("已添加关键词(") + .append("${selectedAdapter.data.size - 1}") + .setForegroundColor(getColor(R.color.color_ff493c)) + .append("/5)") + .create() + } + + private fun createTab(title: String): TextView { + val textView = TextView(requireContext()) + textView.text = title + textView.gravity = Gravity.CENTER + textView.setPadding(DensityUtils.dp2px(14f) , 0, DensityUtils.dp2px(14f), 0) + return textView + } + + private fun startRotate() { + if (binding.ivRefresh.animation != null) { + binding.ivRefresh.animation.cancel() } - startAnim() + val anim = RotateAnimation(0f, 360f, RotateAnimation.RELATIVE_TO_SELF, 0.5f, RotateAnimation.RELATIVE_TO_SELF, 0.5f) + anim.duration = 1000 + binding.ivRefresh.startAnimation(anim) } private fun startAnim() { - val scaleXHolder = PropertyValuesHolder.ofFloat("scaleX", 0.85f, 1.15f, 0.9f, 1.1f, 0.95f, 1f) - val scaleYHolder = PropertyValuesHolder.ofFloat("scaleY", 0.85f, 1.15f, 0.9f, 1.1f, 0.95f, 1f) - - val option1ScaleAnim = ObjectAnimator.ofPropertyValuesHolder(binding.layoutOption1, scaleXHolder, scaleYHolder) - option1ScaleAnim.duration = 1000 - option1ScaleAnim.startDelay = 1000 - option1ScaleAnim.interpolator = LinearInterpolator() - option1ScaleAnim.addListener(onStart = { - binding.layoutOption1.visible() + val keyword1TransAnim = ObjectAnimator.ofFloat(binding.layoutKeywords, "translationY", ScreenUtils.getScreenWidth().toFloat(), 0f) + keyword1TransAnim.duration = 1000 + keyword1TransAnim.startDelay = 200 + keyword1TransAnim.addListener(onStart = { + binding.layoutKeywords.visible() }) - val option2ScaleAnim = ObjectAnimator.ofPropertyValuesHolder(binding.layoutOption2, scaleXHolder, scaleYHolder) - option2ScaleAnim.duration = 1000 - option2ScaleAnim.startDelay = 1400 - option2ScaleAnim.interpolator = LinearInterpolator() - option2ScaleAnim.addListener(onStart = { - binding.layoutOption2.visible() - }) - - val option3ScaleAnim = ObjectAnimator.ofPropertyValuesHolder(binding.layoutOption3, scaleXHolder, scaleYHolder) - option3ScaleAnim.duration = 1000 - option3ScaleAnim.startDelay = 1800 - option3ScaleAnim.interpolator = LinearInterpolator() - option3ScaleAnim.addListener(onStart = { - binding.layoutOption3.visible() - }) - - val option4ScaleAnim = ObjectAnimator.ofPropertyValuesHolder(binding.layoutOption4, scaleXHolder, scaleYHolder) - option4ScaleAnim.duration = 1000 - option4ScaleAnim.startDelay = 1400 - option4ScaleAnim.interpolator = LinearInterpolator() - option4ScaleAnim.addListener(onStart = { - binding.layoutOption4.visible() - }) - - val option5ScaleAnim = ObjectAnimator.ofPropertyValuesHolder(binding.layoutOption5, scaleXHolder, scaleYHolder) - option5ScaleAnim.duration = 1000 - option5ScaleAnim.startDelay = 1800 - option5ScaleAnim.interpolator = LinearInterpolator() - option5ScaleAnim.addListener(onStart = { - binding.layoutOption5.visible() - }) - - val option6ScaleAnim = ObjectAnimator.ofPropertyValuesHolder(binding.layoutOption6, scaleXHolder, scaleYHolder) - option6ScaleAnim.duration = 1000 - option6ScaleAnim.startDelay = 1200 - option6ScaleAnim.interpolator = LinearInterpolator() - option6ScaleAnim.addListener(onStart = { - binding.layoutOption6.visible() - }) - - val option7ScaleAnim = ObjectAnimator.ofPropertyValuesHolder(binding.layoutOption7, scaleXHolder, scaleYHolder) - option7ScaleAnim.duration = 1000 - option7ScaleAnim.startDelay = 1600 - option7ScaleAnim.interpolator = LinearInterpolator() - option7ScaleAnim.addListener(onStart = { - binding.layoutOption7.visible() - }) - - val option8ScaleAnim = ObjectAnimator.ofPropertyValuesHolder(binding.layoutOption8, scaleXHolder, scaleYHolder) - option8ScaleAnim.duration = 1000 - option8ScaleAnim.startDelay = 1800 - option8ScaleAnim.interpolator = LinearInterpolator() - option8ScaleAnim.addListener(onStart = { - binding.layoutOption8.visible() - }) - - val bgTransAnim = ObjectAnimator.ofFloat(binding.ivBg, "translationY", ScreenUtils.getScreenHeight().toFloat(), 0f) - bgTransAnim.duration = 1000 - bgTransAnim.addListener(onStart = { - binding.ivBg.visible() + val keyword2TransAnim = ObjectAnimator.ofFloat(binding.layoutSelectedKeywords, "translationY", ScreenUtils.getScreenWidth().toFloat(), 0f) + keyword2TransAnim.duration = 1000 + keyword2TransAnim.startDelay = 600 + keyword2TransAnim.addListener(onStart = { + binding.layoutSelectedKeywords.visible() }) val titleTransAnim = ObjectAnimator.ofFloat(binding.ivTitle, "translationY", -DensityUtils.dp2px(200f).toFloat(), 0f) @@ -293,16 +217,16 @@ class GuideItem3Fragment : BaseFragment() { - private val mAdapter by lazy { GuideItem4Adapter() } + private val area1Adapter by lazy { GuideItem4Area1Adapter() } - private val selectedAdapter by lazy { GuideItem4SelectedAdapter() } - - private val hotWordChildList = mutableListOf() - - private var tabIndex = 0 - - private var page = 0 + private val area2Adapter by lazy { GuideItem4Area2Adapter() } private var canClick = false override fun initView() { super.initView() - binding.mRecyclerView.adapter = mAdapter - binding.mRecyclerView.addItemDecoration(GridSpaceItemDecoration(3, DensityUtils.dp2px(10f), DensityUtils.dp2px(10f))) + binding.btnNext.typeface = Constants.almmsht - binding.rvSelectedKeywords.adapter = selectedAdapter - binding.rvSelectedKeywords.addItemDecoration(GridSpaceItemDecoration(3, DensityUtils.dp2px(10f), DensityUtils.dp2px(10f))) - selectedAdapter.addData(HotWordEntity.Child(id = -1, name = "自定义", isChecked = true)) - setKeywordCount() + binding.rvArea1.adapter = area1Adapter + binding.rvArea2.adapter = area2Adapter } override fun onLazyLoad() { super.onLazyLoad() - hotWordChildList.addAll(GuideFragment.hotWordList) - hotWordChildList.forEach { item -> - binding.tabLayout.addView(createTab(item.name)) + if (UserConfigManager.getAreaList().isNotEmpty()) { + setData() + } else { + mViewModel.getCityList() } - - startAnim() } + @SuppressLint("NotifyDataSetChanged") override fun initListener() { super.initListener() - binding.tabLayout.observeIndexChange { fromIndex, toIndex, _, _ -> - page = 0 - tabIndex = toIndex + area1Adapter.setOnItemClickListener { _, _, position -> + val item = area1Adapter.getItem(position) + area1Adapter.data.find { it.isChecked }?.isChecked = false + item.isChecked = true - if (fromIndex >= 0) { - val textView = binding.tabLayout.getChildAt(fromIndex) - textView.setBackgroundResource(0) - } - if (toIndex >= 0) { - val textView = binding.tabLayout.getChildAt(toIndex) - textView.setBackgroundResource(R.drawable.shape_f5f8ff_top_cor16) - } - - val hotWordChild = hotWordChildList[toIndex] - binding.tvAmount.text = "${hotWordChild.amount}亿元" - - val keywordList = mutableListOf() - for (i in 0 until 15) { - keywordList.add(hotWordChild.children[i]) - } - mAdapter.setList(keywordList) + scrollToPosition(position) } - binding.ivRefresh.onClick { - startRotate() - val hotWordChild = hotWordChildList[tabIndex] - if (ceil(hotWordChild.children.size / 15.0) > page + 1) { - page++ - } else { - page = 0 + area2Adapter.setOnCityClickListener { + val selectList = mutableListOf() + area2Adapter.data.forEach { area -> + selectList.addAll(area.children.filter { it.isChecked }) } - val keywordList = mutableListOf() - for (i in page * 15 until ((page + 1) * 15).coerceAtMost(hotWordChild.children.size)) { - keywordList.add(hotWordChild.children[i]) - } - mAdapter.setList(keywordList) + binding.tvCityCount.text = "${selectList.size}" } - binding.ivBtn.onClick { - if (!canClick) return@onClick - if (selectedAdapter.data.size == 1) { - toast("请添加关键词") - return@onClick - } - val keywords = selectedAdapter.data.filter { it.id != -1 }.map { it.name } - val cityIds = GuideFragment.cityList.map { it.id } - mViewModel.getTotalBidInfo(keywords.joinToString(","), cityIds.joinToString(","), "${hotWordChildList.size}") - } + binding.rvArea2.addOnScrollListener(object : RecyclerView.OnScrollListener() { + override fun onScrolled(recyclerView: RecyclerView, dx: Int, dy: Int) { + super.onScrolled(recyclerView, dx, dy) + val layoutManager = binding.rvArea2.layoutManager as LinearLayoutManager + val firstPosition = layoutManager.findFirstCompletelyVisibleItemPosition() - mAdapter.setOnItemClickListener { _, _, i -> - if (!canClick) return@setOnItemClickListener - val item = mAdapter.getItem(i) - if (!item.isChecked && selectedAdapter.data.size == 6) { - toast("最多添加5个关键词") - return@setOnItemClickListener - } - - item.isChecked = !item.isChecked - mAdapter.notifyDataSetChanged() - if (item.isChecked) { - selectedAdapter.addData(item) - } else { - selectedAdapter.remove(item) - } - setKeywordCount() - } - - selectedAdapter.setOnItemClickListener { _, _, i -> - val item = selectedAdapter.getItem(i) - if (item.id == -1) { - if (selectedAdapter.data.size == 6) { - toast("最多添加5个关键词") - return@setOnItemClickListener + if (firstPosition >= 0) { + val firstItem = area1Adapter.getItem(firstPosition) + area1Adapter.data.find { it.isChecked }?.isChecked = false + firstItem.isChecked = true + area1Adapter.notifyDataSetChanged() } - val f = AddKeywordDialog.newInstance() - f.setOnBackListener { - selectedAdapter.addData(HotWordEntity.Child(name = it, isChecked = true)) - setKeywordCount() - } - f.show(childFragmentManager, "") } - } + }) - selectedAdapter.setOnItemChildClickListener { _, view, i -> - val item = selectedAdapter.getItem(i) - if (!canClick || item.id == -1) return@setOnItemChildClickListener - if (view.id == R.id.iv_delete) { - selectedAdapter.remove(item) - item.isChecked = false - mAdapter.notifyDataSetChanged() - setKeywordCount() + binding.btnNext.onClick { + if (canClick) { + val selectList = mutableListOf() + area1Adapter.data.forEach { area -> + selectList.addAll(area.children.filter { it.isChecked }) + } + if (selectList.isEmpty()) { + toast("请选择地区") + return@onClick + } + GuideFragment.cityList.addAll(selectList) + RxBus.defaultInstance.post(GuideEvent(2)) } } } override fun initObserve() { super.initObserve() - mViewModel.totalLiveData.observe(this) { - GuideFragment.totalInfo = it - RxBus.defaultInstance.post(GuideEvent(4)) + mViewModel.cityLiveData.observe(this) { + UserConfigManager.saveAreaList(it) + setData() } } - private fun setKeywordCount() { - SpanUtils.with(binding.tvKeywordsCount) - .append("已添加关键词(") - .append("${selectedAdapter.data.size - 1}") - .setForegroundColor(getColor(R.color.color_ff493c)) - .append("/5)") - .create() + private fun setData() { + val areaList = UserConfigManager.getAreaList() + areaList.add(0, AreaEntity(0, name = "全国地区", isChecked = true)) + area1Adapter.setList(areaList) + area2Adapter.setList(areaList) + startAnim() } - private fun createTab(title: String): TextView { - val textView = TextView(requireContext()) - textView.text = title - textView.gravity = Gravity.CENTER - textView.setPadding(DensityUtils.dp2px(14f) , 0, DensityUtils.dp2px(14f), 0) - return textView - } - - private fun startRotate() { - if (binding.ivRefresh.animation != null) { - binding.ivRefresh.animation.cancel() - } - val anim = RotateAnimation(0f, 360f, RotateAnimation.RELATIVE_TO_SELF, 0.5f, RotateAnimation.RELATIVE_TO_SELF, 0.5f) - anim.duration = 1000 - binding.ivRefresh.startAnimation(anim) + private fun scrollToPosition(position: Int) { + binding.rvArea2.layoutManager?.startSmoothScroll( + LinearTopSmoothScroller(requireContext(), true) + .apply { targetPosition = position } + ) } private fun startAnim() { - val keyword1TransAnim = ObjectAnimator.ofFloat(binding.layoutKeywords, "translationY", ScreenUtils.getScreenWidth().toFloat(), 0f) - keyword1TransAnim.duration = 1000 - keyword1TransAnim.startDelay = 200 - keyword1TransAnim.addListener(onStart = { - binding.layoutKeywords.visible() - }) - - val keyword2TransAnim = ObjectAnimator.ofFloat(binding.layoutSelectedKeywords, "translationY", ScreenUtils.getScreenWidth().toFloat(), 0f) - keyword2TransAnim.duration = 1000 - keyword2TransAnim.startDelay = 600 - keyword2TransAnim.addListener(onStart = { - binding.layoutSelectedKeywords.visible() - }) - - val titleTransAnim = ObjectAnimator.ofFloat(binding.ivTitle, "translationY", -DensityUtils.dp2px(200f).toFloat(), 0f) + val titleTransAnim = ObjectAnimator.ofFloat(binding.ivTitle, "translationX", -DensityUtils.dp2px(200f).toFloat(), 0f) titleTransAnim.duration = 1000 - titleTransAnim.startDelay = 200 + titleTransAnim.startDelay = 600 titleTransAnim.addListener(onStart = { binding.ivTitle.visible() }) - val descTransAnim = ObjectAnimator.ofFloat(binding.ivDesc, "translationY", -DensityUtils.dp2px(200f).toFloat(), 0f) + val descTransAnim = ObjectAnimator.ofFloat(binding.ivDesc, "translationX", -DensityUtils.dp2px(200f).toFloat(), 0f) descTransAnim.duration = 1000 - titleTransAnim.startDelay = 200 + descTransAnim.startDelay = 600 descTransAnim.addListener(onStart = { binding.ivDesc.visible() }) - val btnTransAnim = ObjectAnimator.ofFloat(binding.ivBtn, "translationY", DensityUtils.dp2px(100f).toFloat(), 0f) + val contentTransAnim = ObjectAnimator.ofFloat(binding.layoutContent, "translationY", ScreenUtils.getScreenHeight().toFloat(), 0f) + contentTransAnim.duration = 1000 + contentTransAnim.addListener(onStart = { + binding.layoutContent.visible() + }) + + val icon1TransAnim = ObjectAnimator.ofFloat(binding.ivIcon1, "translationX", DensityUtils.dp2px(200f).toFloat(), 0f) + icon1TransAnim.duration = 1000 + icon1TransAnim.startDelay = 600 + icon1TransAnim.addListener(onStart = { + binding.ivIcon1.visible() + }) + + val icon2TransAnim = ObjectAnimator.ofFloat(binding.ivIcon2, "translationY", DensityUtils.dp2px(200f).toFloat(), 0f) + icon2TransAnim.duration = 1000 + icon2TransAnim.startDelay = 400 + icon2TransAnim.addListener(onStart = { + binding.ivIcon2.visible() + }) + + val countTransAnim = ObjectAnimator.ofFloat(binding.tvCityCount, "translationY", DensityUtils.dp2px(200f).toFloat(), 0f) + countTransAnim.duration = 1000 + countTransAnim.startDelay = 400 + countTransAnim.addListener(onStart = { + binding.tvCityCount.visible() + }) + + val btnTransAnim = ObjectAnimator.ofFloat(binding.btnNext, "translationY", DensityUtils.dp2px(200f).toFloat(), 0f) btnTransAnim.duration = 1000 - btnTransAnim.startDelay = 800 - btnTransAnim.interpolator = LinearInterpolator() + btnTransAnim.startDelay = 400 btnTransAnim.addListener(onStart = { - binding.ivBtn.visible() + binding.btnNext.visible() }, onEnd = { canClick = true }) val animSet = AnimatorSet() - animSet.playTogether( - keyword1TransAnim, - keyword2TransAnim, - titleTransAnim, - descTransAnim, - btnTransAnim - ) + animSet.playTogether(titleTransAnim, descTransAnim, contentTransAnim, icon1TransAnim, icon2TransAnim, countTransAnim, btnTransAnim) animSet.start() } } \ No newline at end of file diff --git a/app/src/main/java/com/cheng/blzb/ui/fragment/mine/MineFragment.kt b/app/src/main/java/com/cheng/blzb/ui/fragment/mine/MineFragment.kt index 62e2ebe..3c7a5f1 100644 --- a/app/src/main/java/com/cheng/blzb/ui/fragment/mine/MineFragment.kt +++ b/app/src/main/java/com/cheng/blzb/ui/fragment/mine/MineFragment.kt @@ -42,7 +42,10 @@ import com.example.base.utils.ClipboardUtils /** * 我的 */ -class MineFragment : BaseFragment() { +class + + +MineFragment : BaseFragment() { private var userInfo: UserEntity? = null private var isInit = true @@ -224,7 +227,7 @@ class MineFragment : BaseFragment() { error(R.mipmap.ic_default_avatar) } - if (userInfo?.vip == "1") { + if (userInfo?.vip == "1" || userInfo?.vip == "10") { isEnterprise = false binding.tvVipName.text = "开通会员" diff --git a/app/src/main/java/com/cheng/blzb/ui/fragment/mine/order/invoice/InvoiceFragment.kt b/app/src/main/java/com/cheng/blzb/ui/fragment/mine/order/invoice/InvoiceFragment.kt index 84666f9..b7d17f3 100644 --- a/app/src/main/java/com/cheng/blzb/ui/fragment/mine/order/invoice/InvoiceFragment.kt +++ b/app/src/main/java/com/cheng/blzb/ui/fragment/mine/order/invoice/InvoiceFragment.kt @@ -129,7 +129,7 @@ class InvoiceFragment : BaseFragment() private fun commit() { val enterpriseName = binding.etEnterpriseName.text.toString().trim() - val enterpriseCode = binding.etEnterpriseCode.toString().trim() + val enterpriseCode = binding.etEnterpriseCode.text.toString().trim() val enterpriseAddress = binding.etEnterpriseAddress.text.toString().trim() val enterprisePhone = binding.etEnterprisePhone.text.toString().trim() val bankName = binding.etBankName.text.toString().trim() diff --git a/app/src/main/res/drawable/shape_guide_item1_desc_bg.xml b/app/src/main/res/drawable/shape_guide_item1_desc_bg.xml new file mode 100644 index 0000000..9989af2 --- /dev/null +++ b/app/src/main/res/drawable/shape_guide_item1_desc_bg.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_guide_item1.xml b/app/src/main/res/layout/fragment_guide_item1.xml index 0f06fac..a34df83 100644 --- a/app/src/main/res/layout/fragment_guide_item1.xml +++ b/app/src/main/res/layout/fragment_guide_item1.xml @@ -4,133 +4,177 @@ xmlns:tool="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" - android:background="@mipmap/ic_guide_bg"> + android:background="#00071A"> - + tool:visibility="visible" + android:layout_height="match_parent"/> - + + + + + + + + + + + + + + + + + + + + + + + + + + + + tool:visibility="visible"> - - - - - - - - - - - - - - - + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_guide_item2.xml b/app/src/main/res/layout/fragment_guide_item2.xml index c230d02..f56f010 100644 --- a/app/src/main/res/layout/fragment_guide_item2.xml +++ b/app/src/main/res/layout/fragment_guide_item2.xml @@ -7,24 +7,26 @@ android:background="@mipmap/ic_guide_bg"> + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toTopOf="parent" /> @@ -33,114 +35,387 @@ android:id="@+id/iv_desc" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:layout_marginTop="@dimen/dp_10" - android:src="@mipmap/ic_guide_item2_desc" + android:layout_marginTop="@dimen/dp_12" + android:src="@mipmap/ic_guide_item3_desc" android:visibility="invisible" - app:layout_constraintStart_toStartOf="@id/iv_title" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@id/iv_title" tool:visibility="visible" /> - + + - - + - - + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toBottomOf="@id/iv_icon1" /> - + + + + + + + + + + app:layout_constraintTop_toTopOf="parent" + tool:visibility="visible"> - + + + + + + + + app:layout_constraintBottom_toTopOf="@id/layout_option8" + app:layout_constraintEnd_toEndOf="@id/layout_option8" + tool:visibility="visible"> - + + + + + + + + + + + + + + + + + + + + + + + + + + + tool:visibility="visible"> + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_guide_item3.xml b/app/src/main/res/layout/fragment_guide_item3.xml index 881b617..f0ac5c5 100644 --- a/app/src/main/res/layout/fragment_guide_item3.xml +++ b/app/src/main/res/layout/fragment_guide_item3.xml @@ -6,25 +6,12 @@ android:layout_height="match_parent" android:background="@mipmap/ic_guide_bg"> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - + android:layout_marginTop="@dimen/dp_11" + android:gravity="center_vertical" + android:orientation="horizontal" + app:layout_constraintTop_toBottomOf="@id/tabLayout"> - + + + + + + + + + + + android:layout_margin="@dimen/dp_14" + android:background="@drawable/shape_white_cor14" + android:overScrollMode="never" + android:padding="@dimen/dp_14" + app:layoutManager="androidx.recyclerview.widget.GridLayoutManager" + app:layout_constraintBottom_toBottomOf="parent" + app:layout_constraintTop_toBottomOf="@id/layout_base_info" + app:spanCount="3" + tool:itemCount="18" + tool:listitem="@layout/listitem_guide_item3" /> + - - - - - - - - - - - - - - - - - - - - - - + android:layout_marginTop="@dimen/dp_10" + android:background="@drawable/shape_white_cor14" + android:paddingStart="@dimen/dp_12" + android:paddingTop="@dimen/dp_10" + android:paddingEnd="@dimen/dp_12" + android:paddingBottom="@dimen/dp_10" + app:layoutManager="androidx.recyclerview.widget.GridLayoutManager" + app:layout_constraintTop_toBottomOf="@id/tv_keywords_count" + app:spanCount="3" + tool:itemCount="5" + tool:listitem="@layout/listitem_guide3_selected_keyword" /> diff --git a/app/src/main/res/layout/fragment_guide_item4.xml b/app/src/main/res/layout/fragment_guide_item4.xml index f92fd5f..c230d02 100644 --- a/app/src/main/res/layout/fragment_guide_item4.xml +++ b/app/src/main/res/layout/fragment_guide_item4.xml @@ -6,14 +6,25 @@ android:layout_height="match_parent" android:background="@mipmap/ic_guide_bg"> + + @@ -22,151 +33,114 @@ android:id="@+id/iv_desc" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:layout_marginTop="@dimen/dp_12" - android:src="@mipmap/ic_guide_item4_desc" + android:layout_marginTop="@dimen/dp_10" + android:src="@mipmap/ic_guide_item2_desc" android:visibility="invisible" - app:layout_constraintEnd_toEndOf="parent" - app:layout_constraintStart_toStartOf="parent" + app:layout_constraintStart_toStartOf="@id/iv_title" app:layout_constraintTop_toBottomOf="@id/iv_title" tool:visibility="visible" /> - - - - - - - - - - - - - - - - - - - - - - + android:id="@+id/rv_area1" + android:layout_width="0dp" + android:layout_height="0dp" + android:layout_marginTop="@dimen/dp_20" + android:background="@drawable/shape_guide_area_bg" + android:orientation="vertical" + app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager" + app:layout_constraintBottom_toBottomOf="parent" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toBottomOf="@id/tv_title" + app:layout_constraintWidth_percent="0.33" + tool:listitem="@layout/listitem_guide_area1" /> + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/listitem_guide4_selected_keyword.xml b/app/src/main/res/layout/listitem_guide3_selected_keyword.xml similarity index 100% rename from app/src/main/res/layout/listitem_guide4_selected_keyword.xml rename to app/src/main/res/layout/listitem_guide3_selected_keyword.xml diff --git a/app/src/main/res/layout/listitem_guide_item1_company.xml b/app/src/main/res/layout/listitem_guide_item1_company.xml new file mode 100644 index 0000000..9df902a --- /dev/null +++ b/app/src/main/res/layout/listitem_guide_item1_company.xml @@ -0,0 +1,20 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/listitem_guide_item4.xml b/app/src/main/res/layout/listitem_guide_item3.xml similarity index 92% rename from app/src/main/res/layout/listitem_guide_item4.xml rename to app/src/main/res/layout/listitem_guide_item3.xml index 9c07dce..04189f8 100644 --- a/app/src/main/res/layout/listitem_guide_item4.xml +++ b/app/src/main/res/layout/listitem_guide_item3.xml @@ -27,7 +27,7 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginEnd="@dimen/dp_6" - android:src="@mipmap/ic_guide_item4_checked" + android:src="@mipmap/ic_guide_item3_checked" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintTop_toTopOf="parent" /> diff --git a/app/src/main/res/mipmap-xxhdpi/ic_guide_item1_arrow_l.png b/app/src/main/res/mipmap-xxhdpi/ic_guide_item1_arrow_l.png new file mode 100644 index 0000000..0423d1c Binary files /dev/null and b/app/src/main/res/mipmap-xxhdpi/ic_guide_item1_arrow_l.png differ diff --git a/app/src/main/res/mipmap-xxhdpi/ic_guide_item1_arrow_r.png b/app/src/main/res/mipmap-xxhdpi/ic_guide_item1_arrow_r.png new file mode 100644 index 0000000..3b7da08 Binary files /dev/null and b/app/src/main/res/mipmap-xxhdpi/ic_guide_item1_arrow_r.png differ diff --git a/app/src/main/res/mipmap-xxhdpi/ic_guide_item1_bg.png b/app/src/main/res/mipmap-xxhdpi/ic_guide_item1_bg.png new file mode 100644 index 0000000..92b62f6 Binary files /dev/null and b/app/src/main/res/mipmap-xxhdpi/ic_guide_item1_bg.png differ diff --git a/app/src/main/res/mipmap-xxhdpi/ic_guide_item1_btn.png b/app/src/main/res/mipmap-xxhdpi/ic_guide_item1_btn.png new file mode 100644 index 0000000..305ccb1 Binary files /dev/null and b/app/src/main/res/mipmap-xxhdpi/ic_guide_item1_btn.png differ diff --git a/app/src/main/res/mipmap-xxhdpi/ic_guide_item1_btn.webp b/app/src/main/res/mipmap-xxhdpi/ic_guide_item1_btn.webp deleted file mode 100644 index 5c7e784..0000000 Binary files a/app/src/main/res/mipmap-xxhdpi/ic_guide_item1_btn.webp and /dev/null differ diff --git a/app/src/main/res/mipmap-xxhdpi/ic_guide_item1_desc.webp b/app/src/main/res/mipmap-xxhdpi/ic_guide_item1_desc.webp deleted file mode 100644 index f94ea00..0000000 Binary files a/app/src/main/res/mipmap-xxhdpi/ic_guide_item1_desc.webp and /dev/null differ diff --git a/app/src/main/res/mipmap-xxhdpi/ic_guide_item1_flow.png b/app/src/main/res/mipmap-xxhdpi/ic_guide_item1_flow.png new file mode 100644 index 0000000..778e481 Binary files /dev/null and b/app/src/main/res/mipmap-xxhdpi/ic_guide_item1_flow.png differ diff --git a/app/src/main/res/mipmap-xxhdpi/ic_guide_item1_icon1.webp b/app/src/main/res/mipmap-xxhdpi/ic_guide_item1_icon1.webp deleted file mode 100644 index de28e97..0000000 Binary files a/app/src/main/res/mipmap-xxhdpi/ic_guide_item1_icon1.webp and /dev/null differ diff --git a/app/src/main/res/mipmap-xxhdpi/ic_guide_item1_icon2.webp b/app/src/main/res/mipmap-xxhdpi/ic_guide_item1_icon2.webp deleted file mode 100644 index 154caec..0000000 Binary files a/app/src/main/res/mipmap-xxhdpi/ic_guide_item1_icon2.webp and /dev/null differ diff --git a/app/src/main/res/mipmap-xxhdpi/ic_guide_item1_icon3.webp b/app/src/main/res/mipmap-xxhdpi/ic_guide_item1_icon3.webp deleted file mode 100644 index bfb9d91..0000000 Binary files a/app/src/main/res/mipmap-xxhdpi/ic_guide_item1_icon3.webp and /dev/null differ diff --git a/app/src/main/res/mipmap-xxhdpi/ic_guide_item1_icon4.webp b/app/src/main/res/mipmap-xxhdpi/ic_guide_item1_icon4.webp deleted file mode 100644 index 7a4a713..0000000 Binary files a/app/src/main/res/mipmap-xxhdpi/ic_guide_item1_icon4.webp and /dev/null differ diff --git a/app/src/main/res/mipmap-xxhdpi/ic_guide_item1_layer1.webp b/app/src/main/res/mipmap-xxhdpi/ic_guide_item1_layer1.webp deleted file mode 100644 index c704ae8..0000000 Binary files a/app/src/main/res/mipmap-xxhdpi/ic_guide_item1_layer1.webp and /dev/null differ diff --git a/app/src/main/res/mipmap-xxhdpi/ic_guide_item1_layer2.webp b/app/src/main/res/mipmap-xxhdpi/ic_guide_item1_layer2.webp deleted file mode 100644 index d7e2f87..0000000 Binary files a/app/src/main/res/mipmap-xxhdpi/ic_guide_item1_layer2.webp and /dev/null differ diff --git a/app/src/main/res/mipmap-xxhdpi/ic_guide_item1_layer3.webp b/app/src/main/res/mipmap-xxhdpi/ic_guide_item1_layer3.webp deleted file mode 100644 index 869f9e1..0000000 Binary files a/app/src/main/res/mipmap-xxhdpi/ic_guide_item1_layer3.webp and /dev/null differ diff --git a/app/src/main/res/mipmap-xxhdpi/ic_guide_item1_rv_bg.png b/app/src/main/res/mipmap-xxhdpi/ic_guide_item1_rv_bg.png new file mode 100644 index 0000000..4f83b67 Binary files /dev/null and b/app/src/main/res/mipmap-xxhdpi/ic_guide_item1_rv_bg.png differ diff --git a/app/src/main/res/mipmap-xxhdpi/ic_guide_item1_title.webp b/app/src/main/res/mipmap-xxhdpi/ic_guide_item1_title.webp deleted file mode 100644 index b063f77..0000000 Binary files a/app/src/main/res/mipmap-xxhdpi/ic_guide_item1_title.webp and /dev/null differ diff --git a/app/src/main/res/mipmap-xxhdpi/ic_guide_item1_title_bg.png b/app/src/main/res/mipmap-xxhdpi/ic_guide_item1_title_bg.png new file mode 100644 index 0000000..aa92910 Binary files /dev/null and b/app/src/main/res/mipmap-xxhdpi/ic_guide_item1_title_bg.png differ diff --git a/app/src/main/res/mipmap-xxhdpi/ic_guide_item1_title_light.png b/app/src/main/res/mipmap-xxhdpi/ic_guide_item1_title_light.png new file mode 100644 index 0000000..599166c Binary files /dev/null and b/app/src/main/res/mipmap-xxhdpi/ic_guide_item1_title_light.png differ diff --git a/app/src/main/res/mipmap-xxhdpi/ic_guide_item2_checked.webp b/app/src/main/res/mipmap-xxhdpi/ic_guide_item2_checked.webp new file mode 100644 index 0000000..036b195 Binary files /dev/null and b/app/src/main/res/mipmap-xxhdpi/ic_guide_item2_checked.webp differ diff --git a/app/src/main/res/mipmap-xxhdpi/ic_guide_item3_checked.webp b/app/src/main/res/mipmap-xxhdpi/ic_guide_item3_checked.webp index 036b195..42b6068 100644 Binary files a/app/src/main/res/mipmap-xxhdpi/ic_guide_item3_checked.webp and b/app/src/main/res/mipmap-xxhdpi/ic_guide_item3_checked.webp differ diff --git a/app/src/main/res/mipmap-xxhdpi/ic_guide_item4_default.webp b/app/src/main/res/mipmap-xxhdpi/ic_guide_item3_default.webp similarity index 100% rename from app/src/main/res/mipmap-xxhdpi/ic_guide_item4_default.webp rename to app/src/main/res/mipmap-xxhdpi/ic_guide_item3_default.webp diff --git a/app/src/main/res/mipmap-xxhdpi/ic_guide_item4_checked.webp b/app/src/main/res/mipmap-xxhdpi/ic_guide_item4_checked.webp deleted file mode 100644 index 42b6068..0000000 Binary files a/app/src/main/res/mipmap-xxhdpi/ic_guide_item4_checked.webp and /dev/null differ diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml index 17317b0..c953cdb 100644 --- a/app/src/main/res/values/colors.xml +++ b/app/src/main/res/values/colors.xml @@ -135,4 +135,5 @@ #20F3E6 #05ACE8 #6DD9F2 + #E6FFFF \ No newline at end of file