diff --git a/app/build.gradle b/app/build.gradle index b8e2671..05db4e7 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -212,6 +212,8 @@ dependencies { implementation 'com.bytedance.ads:AppConvert:2.0.0' //巨量融合 implementation 'com.github.gzu-liyujiang.AndroidPicker:WheelPicker:4.1.14' // 滚轮选择器 implementation 'com.github.lihangleo2:ShadowLayout:3.4.1' //阴影布局 + implementation 'com.github.YvesCheung.RollingText:RollingText:1.3.0' //数字滚动效果 + implementation 'com.tencent.tav:libpag:4.4.25' //libpag动画加载 //media3视频播放 implementation "androidx.media3:media3-exoplayer:1.4.1" implementation "androidx.media3:media3-ui:1.4.1" diff --git a/app/src/main/assets/effects/guide_bubble.pag b/app/src/main/assets/effects/guide_bubble.pag new file mode 100644 index 0000000..e42ad18 Binary files /dev/null and b/app/src/main/assets/effects/guide_bubble.pag differ diff --git a/app/src/main/java/com/cheng/blzb/bean/ConfigEntity.kt b/app/src/main/java/com/cheng/blzb/bean/ConfigEntity.kt index 75eb22c..dbc4aa1 100644 --- a/app/src/main/java/com/cheng/blzb/bean/ConfigEntity.kt +++ b/app/src/main/java/com/cheng/blzb/bean/ConfigEntity.kt @@ -5,10 +5,10 @@ import com.google.gson.annotations.SerializedName class ConfigEntity { @SerializedName("client.version.upgrade") - var versionEntity: com.cheng.blzb.bean.VersionEntity? = null + var versionEntity: VersionEntity? = null @SerializedName("client.weixin.share") //微信分享 - var wxShareEntity: com.cheng.blzb.bean.WxShareEntity? = null + var wxShareEntity: WxShareEntity? = null @SerializedName("client.guide.pay.enable") var guidePayEnable: Boolean? = true //引导页是否开启支付,默认可以 @@ -16,9 +16,6 @@ class ConfigEntity { @SerializedName("client.guide.enable") var guideEnable: Boolean? = true //是否开启引导页 - @SerializedName("client.start.function.hint") - var guideHint: String? = "" - @SerializedName("client.nologin.pay.enable") var noLoginPayEnable: Boolean? = false diff --git a/app/src/main/java/com/cheng/blzb/bean/HotWordEntity.kt b/app/src/main/java/com/cheng/blzb/bean/HotWordEntity.kt index b412dee..7533bfa 100644 --- a/app/src/main/java/com/cheng/blzb/bean/HotWordEntity.kt +++ b/app/src/main/java/com/cheng/blzb/bean/HotWordEntity.kt @@ -14,7 +14,7 @@ data class HotWordEntity( val amount: String = "0", val children: List = emptyList(), val id: Int = 0, - val name: String, + val name: String = "", val pid: Int = 0, val status: String = "", val type: String = "", diff --git a/app/src/main/java/com/cheng/blzb/event/GuideEvent.kt b/app/src/main/java/com/cheng/blzb/event/GuideEvent.kt index 2b7465b..b930d7b 100644 --- a/app/src/main/java/com/cheng/blzb/event/GuideEvent.kt +++ b/app/src/main/java/com/cheng/blzb/event/GuideEvent.kt @@ -1,4 +1,3 @@ package com.cheng.blzb.event -class GuideEvent(var nextPage: Boolean) { -} \ No newline at end of file +class GuideEvent(var toIndex: Int) \ No newline at end of file diff --git a/app/src/main/java/com/cheng/blzb/manager/UserConfigManager.kt b/app/src/main/java/com/cheng/blzb/manager/UserConfigManager.kt index 5b85458..80b9fd8 100644 --- a/app/src/main/java/com/cheng/blzb/manager/UserConfigManager.kt +++ b/app/src/main/java/com/cheng/blzb/manager/UserConfigManager.kt @@ -3,8 +3,8 @@ package com.cheng.blzb.manager import android.os.Build import android.text.TextUtils import androidx.lifecycle.MutableLiveData -import com.cheng.blzb.bean.BidTypeEntity import com.cheng.blzb.bean.AreaEntity +import com.cheng.blzb.bean.BidTypeEntity import com.cheng.blzb.bean.HotWordEntity import com.cheng.blzb.net.ApiFactory import com.example.base.extensions.toast @@ -77,7 +77,6 @@ object UserConfigManager { if (data.config != null){ saveGuidePayEnable(data.config!!.guidePayEnable!!) saveGuideEnable(data.config!!.guideEnable!!) - saveGuideHint(data.config!!.guideHint) saveNoLoginPay(data.config!!.noLoginPayEnable!!) savePayAgreementEnable(data.config!!.payAgreementEnable!!) saveLoginType(data.config!!.loginType!!) @@ -131,14 +130,6 @@ object UserConfigManager { return MMKVUtils.getBoolean("guide", true) } - private fun saveGuideHint(hint: String?) { - MMKVUtils.put("guide_hint", hint) - } - - fun getGuideHint(): String { - return MMKVUtils.getString("guide_hint") ?: "" - } - fun saveIsTemp(temp: Boolean) { MMKVUtils.put("x-role", temp)//true临时用户 ,false登录用户 } diff --git a/app/src/main/java/com/cheng/blzb/ui/dialog/AddKeywordDialog.kt b/app/src/main/java/com/cheng/blzb/ui/dialog/AddKeywordDialog.kt new file mode 100644 index 0000000..6309e08 --- /dev/null +++ b/app/src/main/java/com/cheng/blzb/ui/dialog/AddKeywordDialog.kt @@ -0,0 +1,108 @@ +package com.cheng.blzb.ui.dialog + +import android.annotation.SuppressLint +import android.app.Dialog +import android.graphics.Color +import android.graphics.drawable.ColorDrawable +import android.os.Bundle +import android.text.TextUtils +import android.view.Gravity +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.constraintlayout.widget.ConstraintLayout +import androidx.fragment.app.DialogFragment +import com.cheng.blzb.R +import com.cheng.blzb.common.Constants +import com.cheng.blzb.databinding.DialogAddKeywordBinding +import com.cheng.blzb.impl.TextWatcherImpl +import com.cheng.blzb.utils.KeyboardUtils +import com.example.base.extensions.onClick +import com.example.base.extensions.toast +import com.example.base.utils.ScreenUtils + +class AddKeywordDialog : DialogFragment(), KeyboardUtils.OnSoftInputChangedListener { + private var mOnBackListener: ((String) -> Unit)? = null //回调事件 + + lateinit var binding: DialogAddKeywordBinding + + override fun onStart() { + super.onStart() + val window = dialog?.window + val windowParams = window?.attributes + windowParams?.dimAmount = 0.7f + windowParams?.width = ScreenUtils.getWindowSize().x + windowParams?.gravity = Gravity.BOTTOM + windowParams?.windowAnimations = R.style.dialog_bottom + dialog?.window?.attributes = windowParams + } + + override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { + dialog?.window?.setBackgroundDrawable(ColorDrawable(Color.TRANSPARENT)) + setCancelable(false) + KeyboardUtils.registerSoftInputChangedListener(requireActivity(), this) + return super.onCreateView(inflater, container, savedInstanceState) + } + + private val textWatcher = object : TextWatcherImpl() { + @SuppressLint("SetTextI18n") + override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) { + binding.ivClearText.visibility = if (TextUtils.isEmpty(s)) View.GONE else View.VISIBLE + } + } + + override fun onCreateDialog(savedInstanceState: Bundle?): Dialog { + val view = layoutInflater.inflate(R.layout.dialog_add_keyword, null) + + binding = DialogAddKeywordBinding.bind(view) + + binding.tvTitle.typeface = Constants.douyinsansB + + binding.etKeyword.addTextChangedListener(textWatcher) + + binding.ivClose.onClick { + dismiss() + } + binding.ivClearText.onClick { + binding.etKeyword.setText("") + } + binding.btnNext.onClick { + val keyword = binding.etKeyword.text.toString().trim() + if (TextUtils.isEmpty(keyword)) { + toast("请输入关键词") + return@onClick + } + mOnBackListener?.invoke(keyword) + dismiss() + } + + val dialog = Dialog(requireContext()) + dialog.setContentView(view) + return dialog + } + + fun setOnBackListener(listener: (String) -> Unit) { + mOnBackListener = listener + } + + override fun onSoftInputChanged(height: Int) { + val lp = binding.layoutContent.layoutParams as ConstraintLayout.LayoutParams + lp.bottomMargin = height + binding.layoutContent.layoutParams = lp + } + + override fun onDestroyView() { + KeyboardUtils.unregisterSoftInputChangedListener(requireActivity().window) + binding.etKeyword.removeTextChangedListener(textWatcher) + super.onDestroyView() + } + + companion object { + fun newInstance(): AddKeywordDialog { + val arg = Bundle() + val fragment = AddKeywordDialog() + fragment.arguments = arg + return fragment + } + } +} \ No newline at end of file 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 69b5ba8..7693a76 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 @@ -3,14 +3,10 @@ package com.cheng.blzb.ui.fragment.guide import android.annotation.SuppressLint import androidx.fragment.app.Fragment import androidx.fragment.app.FragmentStatePagerAdapter -import androidx.viewpager.widget.ViewPager import androidx.viewpager.widget.ViewPager.OnPageChangeListener -import com.example.base.extensions.gone -import com.example.base.extensions.onClick -import com.example.base.ui.BaseFragment -import com.cheng.blzb.ui.activity.MainActivity -import com.cheng.blzb.ui.activity.PublicActivity -import com.cheng.blzb.common.Constants +import com.cheng.blzb.bean.AreaEntity +import com.cheng.blzb.bean.GuideTotalBidEntity +import com.cheng.blzb.bean.HotWordEntity import com.cheng.blzb.common.EventConstants import com.cheng.blzb.databinding.FragmentGuideContentBinding import com.cheng.blzb.event.GuideEvent @@ -20,19 +16,31 @@ import com.cheng.blzb.ui.base.BasePageAdapter import com.cheng.blzb.ui.fragment.guide.item.GuideItem1Fragment import com.cheng.blzb.ui.fragment.guide.item.GuideItem2Fragment import com.cheng.blzb.ui.fragment.guide.item.GuideItem3Fragment -import com.cheng.blzb.ui.fragment.mine.vip.VipFragment +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 org.jetbrains.anko.startActivity -import kotlin.collections.minusAssign -import kotlin.collections.plusAssign +import com.example.base.ui.BaseFragment -class GuideFragment :BaseFragment(){ +class GuideFragment : BaseFragment() { private var titles = listOf("guide1", "guide2", "guide3", "guide4", "guide5") private val fragmentList by lazy { mutableListOf() } - private val pageAdapter by lazy { BasePageAdapter(childFragmentManager, titles, fragmentList, FragmentStatePagerAdapter.BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT) } + private val pageAdapter by lazy { + BasePageAdapter( + childFragmentManager, + titles, + fragmentList, + FragmentStatePagerAdapter.BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT + ) + } private var currentPosition = 0 + companion object { + val cityList = mutableListOf() + val hotWordList = mutableListOf() + var totalInfo: GuideTotalBidEntity? = null + } + override fun initView() { super.initView() @@ -44,8 +52,8 @@ class GuideFragment :BaseFragment() fragmentList.add(GuideItem1Fragment()) fragmentList.add(GuideItem2Fragment()) fragmentList.add(GuideItem3Fragment()) -// fragmentList.add(GuideItem4Fragment()) -// fragmentList.add(GuideItem5Fragment()) + fragmentList.add(GuideItem4Fragment()) + fragmentList.add(GuideItem5Fragment()) } override fun initData() { @@ -86,10 +94,8 @@ class GuideFragment :BaseFragment() } val guideEvent = RxBus.defaultInstance.toObservable(GuideEvent::class.java).subscribe { - if (it.nextPage) { - binding.viewPager.currentItem += 1 - } else { - binding.viewPager.currentItem -= 1 + if (it.toIndex < fragmentList.size) { + binding.viewPager.currentItem = it.toIndex } } addDisposable(guideEvent) 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/GuideItem4Adapter.kt new file mode 100644 index 0000000..dee39c5 --- /dev/null +++ b/app/src/main/java/com/cheng/blzb/ui/fragment/guide/adapter/GuideItem4Adapter.kt @@ -0,0 +1,20 @@ +package com.cheng.blzb.ui.fragment.guide.adapter + +import com.chad.library.adapter.base.BaseQuickAdapter +import com.chad.library.adapter.base.viewholder.BaseViewHolder +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) { + 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.setTextColor(R.id.tv_name, getColor(R.color.color_125ffe)) + } else { + holder.setImageResource(R.id.iv_add, R.mipmap.ic_guide_item4_default) + holder.setTextColor(R.id.tv_name, getColor(R.color.color_1a1a1a)) + } + } +} \ No newline at end of file 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/GuideItem4SelectedAdapter.kt new file mode 100644 index 0000000..e520917 --- /dev/null +++ b/app/src/main/java/com/cheng/blzb/ui/fragment/guide/adapter/GuideItem4SelectedAdapter.kt @@ -0,0 +1,28 @@ +package com.cheng.blzb.ui.fragment.guide.adapter + +import android.widget.TextView +import androidx.core.graphics.toColorInt +import com.chad.library.adapter.base.BaseQuickAdapter +import com.chad.library.adapter.base.viewholder.BaseViewHolder +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) { + + init { + addChildClickViewIds(R.id.iv_delete) + } + + override fun convert(holder: BaseViewHolder, item: HotWordEntity.Child) { + holder.setText(R.id.tv_name, item.name) + if (item.id == -1) { + holder.setTextColor(R.id.tv_name, "#8D93A1".toColorInt()) + holder.setImageResource(R.id.iv_delete, R.mipmap.ic_guide_item4_default) + } else { + holder.setTextColor(R.id.tv_name, getColor(R.color.color_125ffe)) + holder.setImageResource(R.id.iv_delete, R.mipmap.ic_guide_item4_delete) + } + holder.getView(R.id.tv_name).requestFocus() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/cheng/blzb/ui/fragment/guide/adapter/GuideItem5CityAdapter.kt b/app/src/main/java/com/cheng/blzb/ui/fragment/guide/adapter/GuideItem5CityAdapter.kt new file mode 100644 index 0000000..94834ce --- /dev/null +++ b/app/src/main/java/com/cheng/blzb/ui/fragment/guide/adapter/GuideItem5CityAdapter.kt @@ -0,0 +1,45 @@ +package com.cheng.blzb.ui.fragment.guide.adapter + +import android.content.Context +import android.view.View +import android.view.ViewGroup +import android.widget.BaseAdapter +import android.widget.TextView +import com.cheng.blzb.R +import com.cheng.blzb.bean.AreaEntity +import com.cheng.blzb.common.Constants + + +class GuideItem5CityAdapter(val context: Context, val data: List): BaseAdapter() { + override fun getCount(): Int { + return data.size + } + + override fun getItem(position: Int): AreaEntity { + return data[position] + } + + override fun getItemId(position: Int): Long { + return position.toLong() + } + + override fun getView(position: Int, convertView: View?, parent: ViewGroup?): View { + val view: View + val viewHolder: ViewHolder + if (convertView == null) { + view = View.inflate(context, R.layout.listitem_guide_item5_city, null) + viewHolder = ViewHolder(view) + view.tag = viewHolder + } else { + view = convertView + viewHolder = convertView.tag as ViewHolder + } + viewHolder.tvName.typeface = Constants.ysbth + viewHolder.tvName.text = getItem(position).name + return view + } + + inner class ViewHolder(val view: View) { + val tvName: TextView = view.findViewById(R.id.tv_name) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/cheng/blzb/ui/fragment/guide/adapter/GuideItem5IndustryAdapter.kt b/app/src/main/java/com/cheng/blzb/ui/fragment/guide/adapter/GuideItem5IndustryAdapter.kt new file mode 100644 index 0000000..b22e6ce --- /dev/null +++ b/app/src/main/java/com/cheng/blzb/ui/fragment/guide/adapter/GuideItem5IndustryAdapter.kt @@ -0,0 +1,31 @@ +package com.cheng.blzb.ui.fragment.guide.adapter + +import android.content.Context +import android.view.View +import android.view.ViewGroup +import android.widget.TextView +import androidx.recyclerview.widget.RecyclerView +import com.chad.library.adapter.base.viewholder.BaseViewHolder +import com.cheng.blzb.R +import com.cheng.blzb.bean.HotWordEntity +import com.cheng.blzb.common.Constants + +class GuideItem5IndustryAdapter(val context: Context, val data: MutableList): RecyclerView.Adapter() { + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): BaseViewHolder { + val view = View.inflate(context, R.layout.listitem_guide_item5_industry, null) + return BaseViewHolder(view) + } + + override fun onBindViewHolder(holder: BaseViewHolder, position: Int) { + holder.getView(R.id.tv_name).typeface = Constants.ysbth + holder.setText(R.id.tv_name, data[position % data.size].name) + } + + override fun getItemCount(): Int { + if (data.isNotEmpty()) { + return Int.MAX_VALUE + } + return 0 + } + +} \ No newline at end of file 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 667d786..e67d20e 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 @@ -32,7 +32,7 @@ class GuideItem1Fragment : BaseFragment() { + private val ids = mutableListOf() private var canClick = false @@ -34,6 +40,46 @@ class GuideItem3Fragment : BaseFragment + 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 + } + } + } } override fun onLazyLoad() { @@ -43,9 +89,110 @@ class GuideItem3Fragment : BaseFragment() { + private val mAdapter by lazy { GuideItem4Adapter() } + + private val selectedAdapter by lazy { GuideItem4SelectedAdapter() } + + private val hotWordChildList = mutableListOf() + + private var tabIndex = 0 + + private var page = 0 + + 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.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() + hotWordChildList.addAll(GuideFragment.hotWordList) + hotWordChildList.forEach { item -> + binding.tabLayout.addView(createTab(item.name)) + } + + startAnim() + } + + override fun initListener() { + super.initListener() + 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.ivRefresh.onClick { + startRotate() + val hotWordChild = hotWordChildList[tabIndex] + if (ceil(hotWordChild.children.size / 15.0) > page + 1) { + page++ + } else { + page = 0 + } + 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) 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 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() + } + } + } + + override fun initObserve() { + super.initObserve() + mViewModel.totalLiveData.observe(this) { + GuideFragment.totalInfo = it + RxBus.defaultInstance.post(GuideEvent(4)) + } + } + + 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() + } + 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 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) + titleTransAnim.duration = 1000 + titleTransAnim.startDelay = 200 + titleTransAnim.addListener(onStart = { + binding.ivTitle.visible() + }) + + val descTransAnim = ObjectAnimator.ofFloat(binding.ivDesc, "translationY", -DensityUtils.dp2px(200f).toFloat(), 0f) + descTransAnim.duration = 1000 + titleTransAnim.startDelay = 200 + descTransAnim.addListener(onStart = { + binding.ivDesc.visible() + }) + + val btnTransAnim = ObjectAnimator.ofFloat(binding.ivBtn, "translationY", DensityUtils.dp2px(100f).toFloat(), 0f) + btnTransAnim.duration = 1000 + btnTransAnim.startDelay = 800 + btnTransAnim.interpolator = LinearInterpolator() + btnTransAnim.addListener(onStart = { + binding.ivBtn.visible() + }, onEnd = { + canClick = true + }) + + val animSet = AnimatorSet() + animSet.playTogether( + keyword1TransAnim, + keyword2TransAnim, + titleTransAnim, + descTransAnim, + btnTransAnim + ) + animSet.start() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/cheng/blzb/ui/fragment/guide/item/GuideItem5Fragment.kt b/app/src/main/java/com/cheng/blzb/ui/fragment/guide/item/GuideItem5Fragment.kt new file mode 100644 index 0000000..dd3fc5b --- /dev/null +++ b/app/src/main/java/com/cheng/blzb/ui/fragment/guide/item/GuideItem5Fragment.kt @@ -0,0 +1,242 @@ +package com.cheng.blzb.ui.fragment.guide.item + +import android.animation.AnimatorSet +import android.animation.ObjectAnimator +import android.animation.ValueAnimator +import android.view.animation.AccelerateDecelerateInterpolator +import android.view.animation.LinearInterpolator +import androidx.constraintlayout.widget.ConstraintLayout +import androidx.core.animation.addListener +import androidx.core.view.isVisible +import com.cheng.blzb.bean.AreaEntity +import com.cheng.blzb.bean.GuideTotalBidEntity +import com.cheng.blzb.bean.HotWordEntity +import com.cheng.blzb.common.Constants +import com.cheng.blzb.databinding.FragmentGuideItem5Binding +import com.cheng.blzb.ui.activity.PublicActivity +import com.cheng.blzb.ui.fragment.guide.GuideFragment +import com.cheng.blzb.ui.fragment.guide.GuideViewModel +import com.cheng.blzb.ui.fragment.guide.adapter.GuideItem5CityAdapter +import com.cheng.blzb.ui.fragment.guide.adapter.GuideItem5IndustryAdapter +import com.cheng.blzb.ui.fragment.guide.vip.GuideVipFragment +import com.example.base.extensions.visible +import com.example.base.ui.BaseFragment +import com.example.base.utils.DensityUtils +import com.google.gson.Gson +import com.yy.mobile.rollingtextview.CharOrder +import com.yy.mobile.rollingtextview.strategy.Strategy +import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers +import io.reactivex.rxjava3.core.Observable +import io.reactivex.rxjava3.disposables.Disposable +import org.libpag.PAGFile +import java.util.concurrent.TimeUnit + +class GuideItem5Fragment : BaseFragment() { + private val cityAdapter by lazy { GuideItem5CityAdapter(requireContext(), cityList) } + + private val industryAdapter by lazy { GuideItem5IndustryAdapter(requireContext(), hotWordChildList) } + + private val hotWordChildList = mutableListOf() + private val cityList = mutableListOf() + + private var totalInfo: GuideTotalBidEntity? = null + + private var industryTask: Disposable? = null + + override fun initView() { + super.initView() + binding.tvBidCount.typeface = Constants.ysbth + binding.tvUnit.typeface = Constants.ysbth + + binding.rvIndustry.adapter = industryAdapter + } + + override fun onLazyLoad() { + super.onLazyLoad() + totalInfo = GuideFragment.totalInfo + + cityList.addAll(GuideFragment.cityList) + binding.viewFlipper.adapter = cityAdapter + + hotWordChildList.addAll(GuideFragment.hotWordList) + industryAdapter.notifyDataSetChanged() + startIndustryTask() + + startAnim() + } + + private fun startAnim() { + val bgTransAnim = ObjectAnimator.ofFloat(binding.ivBg, "translationY", 0f, -DensityUtils.dp2px(75f).toFloat()) + bgTransAnim.duration = 2000 + bgTransAnim.startDelay = 200 + + val star1TranAnim = ObjectAnimator.ofFloat(binding.ivStar1, "translationY", DensityUtils.dp2px(125f).toFloat(), 0f) + star1TranAnim.duration = 2000 + star1TranAnim.startDelay = 200 + + val star2TranAnim = ObjectAnimator.ofFloat(binding.ivStar2, "translationY", 0f, -DensityUtils.dp2px(125f).toFloat()) + star2TranAnim.duration = 2000 + star2TranAnim.startDelay = 200 + + val earthTransAnim = ObjectAnimator.ofFloat(binding.ivEarth, "translationY", 0f, -DensityUtils.dp2px(150f).toFloat()) + earthTransAnim.duration = 2000 + earthTransAnim.startDelay = 200 + + val earthRotateAnim = ObjectAnimator.ofFloat(binding.ivEarth, "rotation", 0f, 360f) + earthRotateAnim.duration = 100000 + earthRotateAnim.startDelay = 2400 + earthRotateAnim.repeatCount = -1 + earthRotateAnim.interpolator = LinearInterpolator() + + val infoAlphaAnim = ObjectAnimator.ofFloat(binding.layoutInfo, "alpha", 0f, 1f) + infoAlphaAnim.duration = 1000 + infoAlphaAnim.startDelay = 2400 + infoAlphaAnim.addListener(onStart = { + binding.layoutInfo.visible() + }, onEnd = { + startNumAnim() + }) + + val progressMaskAnim = ValueAnimator.ofFloat(0f, 1f) + progressMaskAnim.duration = 1000 + progressMaskAnim.startDelay = 2400 + val maskHeight = binding.ivProgressMask.height + progressMaskAnim.addUpdateListener { animator -> + val value = animator.animatedValue as Float + val lp = binding.ivProgressMask.layoutParams as ConstraintLayout.LayoutParams + lp.height = (value * maskHeight).toInt() + + binding.ivProgressMask.layoutParams = lp + if (!binding.ivProgressMask.isVisible) { + binding.ivProgressMask.visible() + } + } + progressMaskAnim.addListener(onEnd = { + startProgressAnim() + + val pagFile = PAGFile.Load(requireContext().assets, "effects/guide_bubble.pag") + binding.pagView.composition = pagFile + binding.pagView.setRepeatCount(0) + binding.pagView.play() + binding.pagView.visible() + }) + + val animSet = AnimatorSet() + animSet.playTogether(bgTransAnim, star1TranAnim, star2TranAnim, earthTransAnim, earthRotateAnim, infoAlphaAnim, progressMaskAnim) + animSet.start() + } + + private fun startNumAnim() { + binding.tvBidCount.animationDuration = 2000 + binding.tvBidCount.charStrategy = Strategy.CarryBitAnimation() + binding.tvBidCount.addCharOrder(CharOrder.Number) + binding.tvBidCount.animationInterpolator = AccelerateDecelerateInterpolator() + binding.tvBidCount.setText("${totalInfo?.bidCount}") + } + + private fun startProgressAnim() { + binding.progressBar.post { + if (activity != null) { + binding.progressBar.progress = 1 + binding.tvProgressStatus.text = "采集引擎启动中...." + } + } + binding.progressBar.postDelayed({ + if (activity != null) { + binding.progressBar.progress = 10 + binding.tvProgressStatus.text = "筛选区域标讯..." + } + }, 1500) + binding.progressBar.postDelayed({ + if (activity != null) { + binding.progressBar.progress = 20 + binding.tvProgressStatus.text = "筛选行业标讯..." + } + }, 2000) + binding.progressBar.postDelayed({ + if (activity != null) { + binding.progressBar.progress = 30 + binding.tvProgressStatus.text = "关键词标讯标注中..." + } + }, 2500) + binding.progressBar.postDelayed({ + if (activity != null) { + binding.progressBar.progress = 40 + binding.tvProgressStatus.text = "筛选最新优质标讯..." + } + }, 3000) + binding.progressBar.postDelayed({ + if (activity != null) { + binding.progressBar.progress = 50 + binding.tvProgressStatus.text = "正在整理数据..." + } + }, 3500) + binding.progressBar.postDelayed({ + if (activity != null) { + binding.progressBar.progress = 60 + binding.tvProgressStatus.text = "正在整理数据..." + } + }, 5500) + binding.progressBar.postDelayed({ + if (activity != null) { + binding.progressBar.progress = 70 + binding.tvProgressStatus.text = "正在整理数据..." + } + }, 7500) + binding.progressBar.postDelayed({ + if (activity != null) { + binding.progressBar.progress = 80 + binding.tvProgressStatus.text = "正在整理数据..." + } + }, 7600) + binding.progressBar.postDelayed({ + if (activity != null) { + binding.progressBar.progress = 90 + binding.tvProgressStatus.text = "正在整理数据..." + } + }, 7700) + binding.progressBar.postDelayed({ + if (activity != null) { + binding.progressBar.progress = 100 + binding.tvProgressStatus.text = "打开标讯采集报告..." + binding.progressBar.postDelayed({ + if (activity != null) { + PublicActivity.start( + requireContext(), + GuideVipFragment::class.java, + Pair("hotWords", Gson().toJson(hotWordChildList)), + Pair("total", totalInfo) + ) + requireActivity().finish() + } + }, 1000) + } + }, 8700) + } + + private fun startIndustryTask() { + if (industryAdapter.data.isEmpty() || industryTask != null) return + industryTask = Observable.interval(300, 9, TimeUnit.MILLISECONDS) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe { + if (activity != null) { + binding.rvIndustry.scrollBy(3, 0) + } + } + } + + private fun stopIndustryTask() { + industryTask?.dispose() + industryTask = null + } + + override fun onStart() { + super.onStart() + startIndustryTask() + } + + override fun onStop() { + super.onStop() + stopIndustryTask() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/cheng/blzb/ui/fragment/guide/vip/GuideVipFragment.kt b/app/src/main/java/com/cheng/blzb/ui/fragment/guide/vip/GuideVipFragment.kt new file mode 100644 index 0000000..44652a9 --- /dev/null +++ b/app/src/main/java/com/cheng/blzb/ui/fragment/guide/vip/GuideVipFragment.kt @@ -0,0 +1,45 @@ +package com.cheng.blzb.ui.fragment.guide.vip + +import android.annotation.SuppressLint +import android.window.OnBackInvokedDispatcher +import androidx.activity.addCallback +import androidx.core.os.BuildCompat +import com.cheng.blzb.databinding.FragmentGuideVipBinding +import com.cheng.blzb.ui.activity.MainActivity +import com.cheng.blzb.ui.fragment.guide.GuideViewModel +import com.example.base.extensions.onClick +import com.example.base.ui.BaseFragment +import org.jetbrains.anko.startActivity + +class GuideVipFragment: BaseFragment() { + + override fun initView() { + super.initView() + } + + override fun initData() { + super.initData() + } + + override fun initListener() { + super.initListener() + setBackPressed() + + binding.ivClose.onClick { + requireActivity().startActivity() + } + } + + override fun initObserve() { + super.initObserve() + } + + @SuppressLint("UnsafeOptInUsageError") + private fun setBackPressed() { + if (BuildCompat.isAtLeastT()) { + requireActivity().onBackInvokedDispatcher.registerOnBackInvokedCallback(OnBackInvokedDispatcher.PRIORITY_DEFAULT) {} + } else { + requireActivity().onBackPressedDispatcher.addCallback(this) {} + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/cheng/blzb/ui/fragment/guide/vip/GuideVipViewModel.kt b/app/src/main/java/com/cheng/blzb/ui/fragment/guide/vip/GuideVipViewModel.kt new file mode 100644 index 0000000..abf61e0 --- /dev/null +++ b/app/src/main/java/com/cheng/blzb/ui/fragment/guide/vip/GuideVipViewModel.kt @@ -0,0 +1,79 @@ +package com.cheng.blzb.ui.fragment.guide.vip + +import androidx.lifecycle.MutableLiveData +import com.cheng.blzb.bean.AreaEntity +import com.cheng.blzb.bean.GuideTotalBidEntity +import com.cheng.blzb.bean.GuideUpdateEntity +import com.cheng.blzb.bean.HotWordEntity +import com.cheng.blzb.net.ApiFactory +import com.example.base.extensions.toast +import com.example.base.utils.L +import com.example.base.viewmodel.BaseViewModel + +class GuideVipViewModel: BaseViewModel() { + val hotWordLiveData = MutableLiveData>() + val cityLiveData = MutableLiveData>() + val userCityLiveData = MutableLiveData() + val totalLiveData = MutableLiveData() + val updateLiveData = MutableLiveData>() + + fun getHotWordList() { + launchOnUiTryCatch({ + val response = ApiFactory.apiService.getHotWordList() + if (response.status) { + hotWordLiveData.postValue(response.data) + } else toast(response.message, true) + }, { + setError(it) + L.d(it) + }) + } + + fun getCityList() { + launchOnUiTryCatch({ + val response = ApiFactory.apiService.getAreaList() + if (response.status) { + cityLiveData.postValue(response.data) + } else toast(response.message, true) + }, { + setError(it) + L.d(it) + }) + } + + fun getUserCity() { + launchOnUiTryCatch({ + val response = ApiFactory.apiService.getUserCity() + if (response.status) { + userCityLiveData.postValue(response.data) + } else toast(response.message, true) + }, { + setError(it) + L.d(it) + }) + } + + fun getTotalBidInfo(keywords: String, cityIds: String, kindNum: String) { + launchOnUiTryCatch({ + val response = ApiFactory.apiService.getTotalBidInfo(keywords, cityIds, kindNum) + if (response.status) { + totalLiveData.postValue(response.data) + } else toast(response.message, true) + }, { + setError(it) + L.d(it) + }) + } + + fun getUpdateNum() { + launchOnUiTryCatch({ + val response = ApiFactory.apiService.getUpdateNum("8") + if (response.status) { + updateLiveData.postValue(response.data) + } else toast(response.message, true) + }, { + setError(it) + L.d(it) + }) + } +} \ No newline at end of file diff --git a/app/src/main/res/animator/anim_vf_in.xml b/app/src/main/res/animator/anim_vf_in.xml new file mode 100644 index 0000000..7966873 --- /dev/null +++ b/app/src/main/res/animator/anim_vf_in.xml @@ -0,0 +1,6 @@ + + \ No newline at end of file diff --git a/app/src/main/res/animator/anim_vf_out.xml b/app/src/main/res/animator/anim_vf_out.xml new file mode 100644 index 0000000..090e5b8 --- /dev/null +++ b/app/src/main/res/animator/anim_vf_out.xml @@ -0,0 +1,6 @@ + + \ No newline at end of file diff --git a/app/src/main/res/drawable/layer_guide_item5_progress.xml b/app/src/main/res/drawable/layer_guide_item5_progress.xml new file mode 100644 index 0000000..3b2b144 --- /dev/null +++ b/app/src/main/res/drawable/layer_guide_item5_progress.xml @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/shape_f5f8ff_cor16.xml b/app/src/main/res/drawable/shape_f5f8ff_cor16.xml new file mode 100644 index 0000000..1e160e0 --- /dev/null +++ b/app/src/main/res/drawable/shape_f5f8ff_cor16.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/shape_f5f8ff_cor4.xml b/app/src/main/res/drawable/shape_f5f8ff_cor4.xml new file mode 100644 index 0000000..3294795 --- /dev/null +++ b/app/src/main/res/drawable/shape_f5f8ff_cor4.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/shape_f5f8ff_top_cor16.xml b/app/src/main/res/drawable/shape_f5f8ff_top_cor16.xml new file mode 100644 index 0000000..b1bdd02 --- /dev/null +++ b/app/src/main/res/drawable/shape_f5f8ff_top_cor16.xml @@ -0,0 +1,7 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/shape_guide_item3_bg.xml b/app/src/main/res/drawable/shape_guide_item3_bg.xml deleted file mode 100644 index 11e8462..0000000 --- a/app/src/main/res/drawable/shape_guide_item3_bg.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - \ No newline at end of file diff --git a/app/src/main/res/layout/dialog_add_keyword.xml b/app/src/main/res/layout/dialog_add_keyword.xml new file mode 100644 index 0000000..44bc02e --- /dev/null +++ b/app/src/main/res/layout/dialog_add_keyword.xml @@ -0,0 +1,113 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + \ 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 2ea3ba2..881b617 100644 --- a/app/src/main/res/layout/fragment_guide_item3.xml +++ b/app/src/main/res/layout/fragment_guide_item3.xml @@ -4,7 +4,7 @@ xmlns:tool="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" - android:background="@drawable/shape_guide_item3_bg"> + android:background="@mipmap/ic_guide_bg"> + app:layout_constraintStart_toStartOf="@id/iv_icon1" + app:layout_constraintTop_toTopOf="@id/iv_icon1" /> + app:layout_constraintTop_toBottomOf="@id/iv_icon1" /> + app:layout_constraintStart_toStartOf="@id/iv_icon2" + app:layout_constraintTop_toTopOf="@id/iv_icon2" /> + app:layout_constraintTop_toBottomOf="@id/iv_icon2" /> + app:layout_constraintStart_toStartOf="@id/iv_icon3" + app:layout_constraintTop_toTopOf="@id/iv_icon3" /> + app:layout_constraintTop_toBottomOf="@id/iv_icon3" /> + app:layout_constraintStart_toStartOf="@id/iv_icon4" + app:layout_constraintTop_toTopOf="@id/iv_icon4" /> + app:layout_constraintTop_toBottomOf="@id/iv_icon4" /> + + app:layout_constraintStart_toStartOf="@id/iv_icon5" + app:layout_constraintTop_toTopOf="@id/iv_icon5" /> + app:layout_constraintTop_toBottomOf="@id/iv_icon5" /> + app:layout_constraintStart_toStartOf="@id/iv_icon6" + app:layout_constraintTop_toTopOf="@id/iv_icon6" /> + app:layout_constraintTop_toBottomOf="@id/iv_icon6" /> + app:layout_constraintStart_toStartOf="@id/iv_icon7" + app:layout_constraintTop_toTopOf="@id/iv_icon7" /> + app:layout_constraintTop_toBottomOf="@id/iv_icon7" /> + app:layout_constraintStart_toStartOf="@id/iv_icon8" + app:layout_constraintTop_toTopOf="@id/iv_icon8" /> + app:layout_constraintTop_toBottomOf="@id/iv_icon8" /> + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_guide_item4.xml b/app/src/main/res/layout/fragment_guide_item4.xml new file mode 100644 index 0000000..f92fd5f --- /dev/null +++ b/app/src/main/res/layout/fragment_guide_item4.xml @@ -0,0 +1,172 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_guide_item5.xml b/app/src/main/res/layout/fragment_guide_item5.xml new file mode 100644 index 0000000..06a2d33 --- /dev/null +++ b/app/src/main/res/layout/fragment_guide_item5.xml @@ -0,0 +1,176 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_guide_vip.xml b/app/src/main/res/layout/fragment_guide_vip.xml new file mode 100644 index 0000000..91592c4 --- /dev/null +++ b/app/src/main/res/layout/fragment_guide_vip.xml @@ -0,0 +1,31 @@ + + + + + + + + + + + + + + \ 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_guide4_selected_keyword.xml new file mode 100644 index 0000000..11ef666 --- /dev/null +++ b/app/src/main/res/layout/listitem_guide4_selected_keyword.xml @@ -0,0 +1,39 @@ + + + + + + + \ 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_item4.xml new file mode 100644 index 0000000..fdb2fdd --- /dev/null +++ b/app/src/main/res/layout/listitem_guide_item4.xml @@ -0,0 +1,34 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/listitem_guide_item5_city.xml b/app/src/main/res/layout/listitem_guide_item5_city.xml new file mode 100644 index 0000000..b50b3cd --- /dev/null +++ b/app/src/main/res/layout/listitem_guide_item5_city.xml @@ -0,0 +1,16 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/listitem_guide_item5_industry.xml b/app/src/main/res/layout/listitem_guide_item5_industry.xml new file mode 100644 index 0000000..32c8d16 --- /dev/null +++ b/app/src/main/res/layout/listitem_guide_item5_industry.xml @@ -0,0 +1,14 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/mipmap-xxhdpi/ic_add_keyword_dialog_bg.webp b/app/src/main/res/mipmap-xxhdpi/ic_add_keyword_dialog_bg.webp new file mode 100644 index 0000000..3914b97 Binary files /dev/null and b/app/src/main/res/mipmap-xxhdpi/ic_add_keyword_dialog_bg.webp differ diff --git a/app/src/main/res/mipmap-xxhdpi/ic_guide_fire.webp b/app/src/main/res/mipmap-xxhdpi/ic_guide_fire.webp new file mode 100644 index 0000000..fd32141 Binary files /dev/null and b/app/src/main/res/mipmap-xxhdpi/ic_guide_fire.webp differ diff --git a/app/src/main/res/mipmap-xxhdpi/ic_guide_item3_bg.png b/app/src/main/res/mipmap-xxhdpi/ic_guide_item3_bg.png deleted file mode 100644 index f0a943b..0000000 Binary files a/app/src/main/res/mipmap-xxhdpi/ic_guide_item3_bg.png and /dev/null differ diff --git a/app/src/main/res/mipmap-xxhdpi/ic_guide_item3_bg.webp b/app/src/main/res/mipmap-xxhdpi/ic_guide_item3_bg.webp new file mode 100644 index 0000000..c4eba51 Binary files /dev/null and b/app/src/main/res/mipmap-xxhdpi/ic_guide_item3_bg.webp differ diff --git a/app/src/main/res/mipmap-xxhdpi/ic_guide_item3_btn.png b/app/src/main/res/mipmap-xxhdpi/ic_guide_item3_btn.png deleted file mode 100644 index 2e2b682..0000000 Binary files a/app/src/main/res/mipmap-xxhdpi/ic_guide_item3_btn.png and /dev/null differ diff --git a/app/src/main/res/mipmap-xxhdpi/ic_guide_item3_btn.webp b/app/src/main/res/mipmap-xxhdpi/ic_guide_item3_btn.webp new file mode 100644 index 0000000..a9d719f Binary files /dev/null and b/app/src/main/res/mipmap-xxhdpi/ic_guide_item3_btn.webp differ diff --git a/app/src/main/res/mipmap-xxhdpi/ic_guide_item3_checked.png b/app/src/main/res/mipmap-xxhdpi/ic_guide_item3_checked.png deleted file mode 100644 index 4caa8b3..0000000 Binary files a/app/src/main/res/mipmap-xxhdpi/ic_guide_item3_checked.png and /dev/null 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 new file mode 100644 index 0000000..036b195 Binary files /dev/null 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_item3_desc.png b/app/src/main/res/mipmap-xxhdpi/ic_guide_item3_desc.png deleted file mode 100644 index 457f187..0000000 Binary files a/app/src/main/res/mipmap-xxhdpi/ic_guide_item3_desc.png and /dev/null differ diff --git a/app/src/main/res/mipmap-xxhdpi/ic_guide_item3_desc.webp b/app/src/main/res/mipmap-xxhdpi/ic_guide_item3_desc.webp new file mode 100644 index 0000000..583c84f Binary files /dev/null and b/app/src/main/res/mipmap-xxhdpi/ic_guide_item3_desc.webp differ diff --git a/app/src/main/res/mipmap-xxhdpi/ic_guide_item3_icon1.png b/app/src/main/res/mipmap-xxhdpi/ic_guide_item3_icon1.png deleted file mode 100644 index 0e49586..0000000 Binary files a/app/src/main/res/mipmap-xxhdpi/ic_guide_item3_icon1.png and /dev/null differ diff --git a/app/src/main/res/mipmap-xxhdpi/ic_guide_item3_icon1.webp b/app/src/main/res/mipmap-xxhdpi/ic_guide_item3_icon1.webp new file mode 100644 index 0000000..a6a1bf2 Binary files /dev/null and b/app/src/main/res/mipmap-xxhdpi/ic_guide_item3_icon1.webp differ diff --git a/app/src/main/res/mipmap-xxhdpi/ic_guide_item3_icon2.png b/app/src/main/res/mipmap-xxhdpi/ic_guide_item3_icon2.png deleted file mode 100644 index bed4ff8..0000000 Binary files a/app/src/main/res/mipmap-xxhdpi/ic_guide_item3_icon2.png and /dev/null differ diff --git a/app/src/main/res/mipmap-xxhdpi/ic_guide_item3_icon2.webp b/app/src/main/res/mipmap-xxhdpi/ic_guide_item3_icon2.webp new file mode 100644 index 0000000..5983b97 Binary files /dev/null and b/app/src/main/res/mipmap-xxhdpi/ic_guide_item3_icon2.webp differ diff --git a/app/src/main/res/mipmap-xxhdpi/ic_guide_item3_icon3.png b/app/src/main/res/mipmap-xxhdpi/ic_guide_item3_icon3.png deleted file mode 100644 index 6ef42c1..0000000 Binary files a/app/src/main/res/mipmap-xxhdpi/ic_guide_item3_icon3.png and /dev/null differ diff --git a/app/src/main/res/mipmap-xxhdpi/ic_guide_item3_icon3.webp b/app/src/main/res/mipmap-xxhdpi/ic_guide_item3_icon3.webp new file mode 100644 index 0000000..f9fefd5 Binary files /dev/null and b/app/src/main/res/mipmap-xxhdpi/ic_guide_item3_icon3.webp differ diff --git a/app/src/main/res/mipmap-xxhdpi/ic_guide_item3_icon4.png b/app/src/main/res/mipmap-xxhdpi/ic_guide_item3_icon4.png deleted file mode 100644 index 5a7476a..0000000 Binary files a/app/src/main/res/mipmap-xxhdpi/ic_guide_item3_icon4.png and /dev/null differ diff --git a/app/src/main/res/mipmap-xxhdpi/ic_guide_item3_icon4.webp b/app/src/main/res/mipmap-xxhdpi/ic_guide_item3_icon4.webp new file mode 100644 index 0000000..4db9bad Binary files /dev/null and b/app/src/main/res/mipmap-xxhdpi/ic_guide_item3_icon4.webp differ diff --git a/app/src/main/res/mipmap-xxhdpi/ic_guide_item3_icon5.png b/app/src/main/res/mipmap-xxhdpi/ic_guide_item3_icon5.png deleted file mode 100644 index 817e1c7..0000000 Binary files a/app/src/main/res/mipmap-xxhdpi/ic_guide_item3_icon5.png and /dev/null differ diff --git a/app/src/main/res/mipmap-xxhdpi/ic_guide_item3_icon5.webp b/app/src/main/res/mipmap-xxhdpi/ic_guide_item3_icon5.webp new file mode 100644 index 0000000..1506ee9 Binary files /dev/null and b/app/src/main/res/mipmap-xxhdpi/ic_guide_item3_icon5.webp differ diff --git a/app/src/main/res/mipmap-xxhdpi/ic_guide_item3_icon6.png b/app/src/main/res/mipmap-xxhdpi/ic_guide_item3_icon6.png deleted file mode 100644 index df9bb60..0000000 Binary files a/app/src/main/res/mipmap-xxhdpi/ic_guide_item3_icon6.png and /dev/null differ diff --git a/app/src/main/res/mipmap-xxhdpi/ic_guide_item3_icon6.webp b/app/src/main/res/mipmap-xxhdpi/ic_guide_item3_icon6.webp new file mode 100644 index 0000000..54ca664 Binary files /dev/null and b/app/src/main/res/mipmap-xxhdpi/ic_guide_item3_icon6.webp differ diff --git a/app/src/main/res/mipmap-xxhdpi/ic_guide_item3_icon7.png b/app/src/main/res/mipmap-xxhdpi/ic_guide_item3_icon7.png deleted file mode 100644 index 169535a..0000000 Binary files a/app/src/main/res/mipmap-xxhdpi/ic_guide_item3_icon7.png and /dev/null differ diff --git a/app/src/main/res/mipmap-xxhdpi/ic_guide_item3_icon7.webp b/app/src/main/res/mipmap-xxhdpi/ic_guide_item3_icon7.webp new file mode 100644 index 0000000..aa274e4 Binary files /dev/null and b/app/src/main/res/mipmap-xxhdpi/ic_guide_item3_icon7.webp differ diff --git a/app/src/main/res/mipmap-xxhdpi/ic_guide_item3_icon8.png b/app/src/main/res/mipmap-xxhdpi/ic_guide_item3_icon8.png deleted file mode 100644 index e3f2129..0000000 Binary files a/app/src/main/res/mipmap-xxhdpi/ic_guide_item3_icon8.png and /dev/null differ diff --git a/app/src/main/res/mipmap-xxhdpi/ic_guide_item3_icon8.webp b/app/src/main/res/mipmap-xxhdpi/ic_guide_item3_icon8.webp new file mode 100644 index 0000000..c168564 Binary files /dev/null and b/app/src/main/res/mipmap-xxhdpi/ic_guide_item3_icon8.webp differ diff --git a/app/src/main/res/mipmap-xxhdpi/ic_guide_item3_star_checked.png b/app/src/main/res/mipmap-xxhdpi/ic_guide_item3_star_checked.png deleted file mode 100644 index 8f5f51a..0000000 Binary files a/app/src/main/res/mipmap-xxhdpi/ic_guide_item3_star_checked.png and /dev/null differ diff --git a/app/src/main/res/mipmap-xxhdpi/ic_guide_item3_star_checked.webp b/app/src/main/res/mipmap-xxhdpi/ic_guide_item3_star_checked.webp new file mode 100644 index 0000000..ea038b5 Binary files /dev/null and b/app/src/main/res/mipmap-xxhdpi/ic_guide_item3_star_checked.webp differ diff --git a/app/src/main/res/mipmap-xxhdpi/ic_guide_item3_star_default.png b/app/src/main/res/mipmap-xxhdpi/ic_guide_item3_star_default.png deleted file mode 100644 index 0af1722..0000000 Binary files a/app/src/main/res/mipmap-xxhdpi/ic_guide_item3_star_default.png and /dev/null differ diff --git a/app/src/main/res/mipmap-xxhdpi/ic_guide_item3_star_default.webp b/app/src/main/res/mipmap-xxhdpi/ic_guide_item3_star_default.webp new file mode 100644 index 0000000..11b9a91 Binary files /dev/null and b/app/src/main/res/mipmap-xxhdpi/ic_guide_item3_star_default.webp differ diff --git a/app/src/main/res/mipmap-xxhdpi/ic_guide_item3_title.png b/app/src/main/res/mipmap-xxhdpi/ic_guide_item3_title.png deleted file mode 100644 index 035c272..0000000 Binary files a/app/src/main/res/mipmap-xxhdpi/ic_guide_item3_title.png and /dev/null differ diff --git a/app/src/main/res/mipmap-xxhdpi/ic_guide_item3_title.webp b/app/src/main/res/mipmap-xxhdpi/ic_guide_item3_title.webp new file mode 100644 index 0000000..9608f2d Binary files /dev/null and b/app/src/main/res/mipmap-xxhdpi/ic_guide_item3_title.webp differ 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 new file mode 100644 index 0000000..42b6068 Binary files /dev/null and b/app/src/main/res/mipmap-xxhdpi/ic_guide_item4_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_item4_default.webp new file mode 100644 index 0000000..ca9a6ac Binary files /dev/null and b/app/src/main/res/mipmap-xxhdpi/ic_guide_item4_default.webp differ diff --git a/app/src/main/res/mipmap-xxhdpi/ic_guide_item4_delete.webp b/app/src/main/res/mipmap-xxhdpi/ic_guide_item4_delete.webp new file mode 100644 index 0000000..1b8c07e Binary files /dev/null and b/app/src/main/res/mipmap-xxhdpi/ic_guide_item4_delete.webp differ diff --git a/app/src/main/res/mipmap-xxhdpi/ic_guide_item4_desc.webp b/app/src/main/res/mipmap-xxhdpi/ic_guide_item4_desc.webp new file mode 100644 index 0000000..38a3749 Binary files /dev/null and b/app/src/main/res/mipmap-xxhdpi/ic_guide_item4_desc.webp differ diff --git a/app/src/main/res/mipmap-xxhdpi/ic_guide_item4_title.webp b/app/src/main/res/mipmap-xxhdpi/ic_guide_item4_title.webp new file mode 100644 index 0000000..1e4ebac Binary files /dev/null and b/app/src/main/res/mipmap-xxhdpi/ic_guide_item4_title.webp differ diff --git a/app/src/main/res/mipmap-xxhdpi/ic_guide_item5_bg.webp b/app/src/main/res/mipmap-xxhdpi/ic_guide_item5_bg.webp new file mode 100644 index 0000000..945ea52 Binary files /dev/null and b/app/src/main/res/mipmap-xxhdpi/ic_guide_item5_bg.webp differ diff --git a/app/src/main/res/mipmap-xxhdpi/ic_guide_item5_earth.webp b/app/src/main/res/mipmap-xxhdpi/ic_guide_item5_earth.webp new file mode 100644 index 0000000..acfe4b5 Binary files /dev/null and b/app/src/main/res/mipmap-xxhdpi/ic_guide_item5_earth.webp differ diff --git a/app/src/main/res/mipmap-xxhdpi/ic_guide_item5_mask.webp b/app/src/main/res/mipmap-xxhdpi/ic_guide_item5_mask.webp new file mode 100644 index 0000000..8f53eec Binary files /dev/null and b/app/src/main/res/mipmap-xxhdpi/ic_guide_item5_mask.webp differ diff --git a/app/src/main/res/mipmap-xxhdpi/ic_guide_item5_progress_start.webp b/app/src/main/res/mipmap-xxhdpi/ic_guide_item5_progress_start.webp new file mode 100644 index 0000000..20bdb71 Binary files /dev/null and b/app/src/main/res/mipmap-xxhdpi/ic_guide_item5_progress_start.webp differ diff --git a/app/src/main/res/mipmap-xxhdpi/ic_guide_item5_search.webp b/app/src/main/res/mipmap-xxhdpi/ic_guide_item5_search.webp new file mode 100644 index 0000000..aabfe36 Binary files /dev/null and b/app/src/main/res/mipmap-xxhdpi/ic_guide_item5_search.webp differ diff --git a/app/src/main/res/mipmap-xxhdpi/ic_guide_item5_star.webp b/app/src/main/res/mipmap-xxhdpi/ic_guide_item5_star.webp new file mode 100644 index 0000000..22c04b1 Binary files /dev/null and b/app/src/main/res/mipmap-xxhdpi/ic_guide_item5_star.webp differ diff --git a/app/src/main/res/mipmap-xxhdpi/ic_guide_vip_bg.webp b/app/src/main/res/mipmap-xxhdpi/ic_guide_vip_bg.webp new file mode 100644 index 0000000..9e7aa6c Binary files /dev/null and b/app/src/main/res/mipmap-xxhdpi/ic_guide_vip_bg.webp differ diff --git a/app/src/main/res/mipmap-xxhdpi/ic_guide_vip_close.webp b/app/src/main/res/mipmap-xxhdpi/ic_guide_vip_close.webp new file mode 100644 index 0000000..8bbd1dc Binary files /dev/null and b/app/src/main/res/mipmap-xxhdpi/ic_guide_vip_close.webp differ diff --git a/app/src/main/res/mipmap-xxhdpi/ic_refresh_guide_keywords.webp b/app/src/main/res/mipmap-xxhdpi/ic_refresh_guide_keywords.webp new file mode 100644 index 0000000..9af61f2 Binary files /dev/null and b/app/src/main/res/mipmap-xxhdpi/ic_refresh_guide_keywords.webp differ diff --git a/app/src/main/res/values/dimens.xml b/app/src/main/res/values/dimens.xml index 280a1bd..fecff7c 100644 --- a/app/src/main/res/values/dimens.xml +++ b/app/src/main/res/values/dimens.xml @@ -91,5 +91,6 @@ 68dp 66dp 190dp + 180dp \ No newline at end of file