Commit ae458d70 authored by wanglei's avatar wanglei

...

parent 8fd197b3
......@@ -109,7 +109,8 @@ dependencies {
//第三方UI控件
implementation("io.github.cymchad:BaseRecyclerViewAdapterHelper4:4.1.4")
implementation("io.github.youth5201314:banner:2.2.3")
implementation("com.github.zhpanvip:bannerviewpager:3.5.12")
implementation("com.github.angcyo.DslTablayout:TabLayout:3.6.4")
implementation("com.github.angcyo.DslTablayout:ViewPager2Delegate:3.6.4")
implementation("io.github.litao0621:nifty-slider:2.0.2")
......
......@@ -55,16 +55,19 @@ class ShortPlayHistoryAdapter(
private fun saveShortFavorite(item: ShortPlayHistory, favorite: Boolean) {
MainScope().launch(Dispatchers.IO) {
val favoriteList = SpJsonUtils.getSpJsonList<ShortPlay>(KEY_SHORTPLAY_FAVORITE).toMutableList()
if (favorite) {
val findBean = favoriteList.find { it.id == item.shortPlay.id }
if (findBean == null) {
favoriteList.add(item.shortPlay)
SpJsonUtils.saveJsonBeanList(KEY_SHORTPLAY_FAVORITE, favoriteList)
}
} else {
favoriteList.removeIf { it.id == item.shortPlay.id }
SpJsonUtils.saveJsonBeanList(KEY_SHORTPLAY_FAVORITE, favoriteList)
}
}
}
......
......@@ -4,10 +4,13 @@ import android.content.Context
import android.graphics.Bitmap
import android.graphics.Color
import android.graphics.drawable.Drawable
import android.view.View
import android.view.ViewGroup
import android.widget.ImageView
import androidx.core.content.ContextCompat
import androidx.core.view.updatePadding
import androidx.palette.graphics.Palette
import androidx.viewpager2.widget.ViewPager2
import com.base.appzxhy.R
import com.base.appzxhy.databinding.ItemBannerBinding
import com.base.appzxhy.databinding.ItemGalleryBannerBinding
......@@ -20,8 +23,12 @@ import com.bumptech.glide.request.target.CustomTarget
import com.bumptech.glide.request.transition.Transition
import com.bytedance.sdk.shortplay.api.ShortPlay
import com.chad.library.adapter4.BaseQuickAdapter
import com.youth.banner.adapter.BannerAdapter
import com.youth.banner.listener.OnPageChangeListener
import com.zhpan.bannerview.BannerViewPager
import com.zhpan.bannerview.BaseBannerAdapter
import com.zhpan.bannerview.BaseViewHolder
import com.zhpan.bannerview.constants.PageStyle
import com.zhpan.indicator.enums.IndicatorSlideMode
import com.zhpan.indicator.enums.IndicatorStyle
class BannerAdapter : BaseQuickAdapter<List<ShortPlay>, CommonViewHolder>() {
......@@ -30,7 +37,7 @@ class BannerAdapter : BaseQuickAdapter<List<ShortPlay>, CommonViewHolder>() {
var playAction: ((shortPlay: ShortPlay) -> Unit)? = null
var binding: ItemBannerBinding? = null
private var paletteMap = HashMap<String, Int>()
var paletteCallBack: ((color: Int) -> Unit)? = null
// var paletteCallBack: ((color: Int) -> Unit)? = null
override fun getItemCount(items: List<List<ShortPlay>>): Int {
return items.size
......@@ -46,36 +53,52 @@ class BannerAdapter : BaseQuickAdapter<List<ShortPlay>, CommonViewHolder>() {
val top = BarUtils.getStatusBarHeight() + context.resources.getDimensionPixelSize(R.dimen.dp_66)
binding?.root?.updatePadding(top = top)
val innerAdapter = binding?.banner?.adapter as GalleryAdapter?
if (innerAdapter == null && item.isNotEmpty()) {
if (binding?.banner?.adapter == null && item.isNotEmpty()) {
LogEx.logDebug(TAG, "onBindViewHolder banner")
binding?.banner?.setAdapter(GalleryAdapter(item))
binding?.banner?.setLoopTime(2500)
//添加画廊效果
binding?.banner?.setBannerGalleryEffect(
context.resources.getDimensionPixelSize(R.dimen.dp_30),
context.resources.getDimensionPixelSize(R.dimen.dp_10)
val innerAdapter = GalleryAdapter()
val banner: BannerViewPager<ShortPlay>? = binding?.root?.findViewById(R.id.banner)
banner?.adapter = innerAdapter
banner?.currentItem = item.size / 2
banner?.setPageMargin(context.resources.getDimensionPixelOffset(R.dimen.dp_10))
banner?.setScrollDuration(800)
banner?.setRevealWidth(
context.resources.getDimensionPixelOffset(R.dimen.dp_30),
context.resources.getDimensionPixelOffset(R.dimen.dp_30)
)
binding?.banner?.setIndicator(binding?.indicator, false)
binding?.banner?.addOnPageChangeListener(object : OnPageChangeListener {
override fun onPageScrolled(position: Int, positionOffset: Float, positionOffsetPixels: Int) {
}
banner?.setPageStyle(PageStyle.MULTI_PAGE_SCALE, 0.85f)
banner?.setIndicatorVisibility(View.GONE)
banner?.setIndicatorSlideMode(IndicatorSlideMode.SCALE)
banner?.setIndicatorStyle(IndicatorStyle.ROUND_RECT)
banner?.setIndicatorSliderGap(
context.resources.getDimensionPixelSize(R.dimen.dp_6)
)
banner?.setIndicatorSliderWidth(
context.resources.getDimensionPixelSize(R.dimen.dp_13),
context.resources.getDimensionPixelSize(R.dimen.dp_20)
)
banner?.setIndicatorSliderColor(
ContextCompat.getColor(context, R.color.color_4dffffff),
ContextCompat.getColor(context, R.color.color_ffffff),
)
banner?.setIndicatorView(binding?.indicator)
banner?.registerOnPageChangeCallback(object : ViewPager2.OnPageChangeCallback() {
override fun onPageSelected(position: Int) {
LogEx.logDebug(TAG, "onPageSelected position=$position")
val bean = item[position]
val coverImage = bean.coverImage
val color = paletteMap[coverImage] ?: Color.BLACK
LogEx.logDebug(TAG, "position=$position coverImage=$coverImage color=$color")
paletteCallBack?.invoke(color)
// paletteCallBack?.invoke(color)
binding?.root?.setBackgroundColor(color)
}
override fun onPageScrollStateChanged(state: Int) {
}
})
banner?.create(item)
} else {
innerAdapter?.setDatas(item)
if (binding?.banner?.adapter?.itemCount == 0) {
binding?.banner?.currentItem = item.size / 2
binding?.banner?.addData(item)
}
}
}
......@@ -83,23 +106,11 @@ class BannerAdapter : BaseQuickAdapter<List<ShortPlay>, CommonViewHolder>() {
return CommonViewHolder(R.layout.item_banner.inflate(parent))
}
inner class GalleryAdapter(list: List<ShortPlay>) : BannerAdapter<ShortPlay, CommonViewHolder>(list) {
override fun onCreateHolder(parent: ViewGroup, viewType: Int): CommonViewHolder {
return CommonViewHolder(R.layout.item_gallery_banner.inflate(parent))
}
override fun onBindView(holder: CommonViewHolder, data: ShortPlay?, position: Int, size: Int) {
data ?: return
val context = holder.itemView.context
val binding = ItemGalleryBannerBinding.bind(holder.itemView)
binding.llPlay.setOnClickListener {
playAction?.invoke(data)
}
paletteImage(binding.iv, data.coverImage)
fun setBannerAutoLoop(isAutoLoop: Boolean) {
binding?.banner?.setCanLoop(isAutoLoop)
}
}
inner class GalleryAdapter : BaseBannerAdapter<ShortPlay>() {
private fun paletteImage(imageView: ImageView, coverImage: String) {
Glide.with(context)
......@@ -111,13 +122,15 @@ class BannerAdapter : BaseQuickAdapter<List<ShortPlay>, CommonViewHolder>() {
Palette.from(bitmap).generate { palette ->
palette ?: return@generate
// 获取主题色
val vibrantColor: Int = palette.getVibrantColor(Color.TRANSPARENT)
val mutedColor: Int = palette.getMutedColor(Color.TRANSPARENT)
val alpha = 230 // 透明度值,范围为0-255,0为完全透明,255为完全不透明
val newColor = mutedColor and 0x00ffffff or (alpha shl 24)
// val vibrantColor: Int = palette.getVibrantColor(Color.TRANSPARENT)
//柔和是
// val mutedColor: Int = palette.getMutedColor(Color.TRANSPARENT)
//主色调
val dominantColor = palette.getDominantColor(Color.TRANSPARENT)
// val alpha = 230 // 透明度值,范围为0-255,0为完全透明,255为完全不透明
// val newColor = vibrantColor and 0x00ffffff or (alpha shl 24)
// 使用这些颜色进行后续操作,例如设置背景色等
paletteMap[coverImage] = newColor
paletteMap[coverImage] = dominantColor
}
}
......@@ -125,9 +138,24 @@ class BannerAdapter : BaseQuickAdapter<List<ShortPlay>, CommonViewHolder>() {
// 图片加载失败或清除时的处理
}
})
imageView.tag = coverImage
}
fun setBannerAutoLoop(isAutoLoop: Boolean) {
binding?.banner?.isAutoLoop(isAutoLoop)
override fun bindData(holder: BaseViewHolder<ShortPlay>, data: ShortPlay?, position: Int, pageSize: Int) {
data ?: return
val binding = ItemGalleryBannerBinding.bind(holder.itemView)
binding.llPlay.setOnClickListener {
playAction?.invoke(data)
}
val tag = binding.iv.tag
LogEx.logDebug(TAG, "position=$position tag=$tag coverImage=${data.coverImage}")
if (tag != data.coverImage) {
paletteImage(binding.iv, data.coverImage)
}
}
override fun getLayoutId(viewType: Int): Int {
return R.layout.item_gallery_banner
}
}
}
\ No newline at end of file
......@@ -97,9 +97,9 @@ class HomeFragment : BaseFragment<FragmentHomeBinding>(FragmentHomeBinding::infl
putExtra("data", Gson().toJson(shortPlay))
})
}
it.paletteCallBack = { color ->
// it.paletteCallBack = { color ->
// binding.blurView.setOverlayColor(color)
}
// }
contactAdapter?.addAdapter(0, it)
}
......
......@@ -22,12 +22,11 @@ class HistoryPageFragment : BaseFragment<FragmentHistoryPageBinding>(FragmentHis
override fun initView() {
super.initView()
binding.rv.adapter = shortPlayAdapter
refreshRv()
}
override fun onResume() {
super.onResume()
refreshRv()
}
private fun refreshRv() {
......@@ -36,6 +35,7 @@ class HistoryPageFragment : BaseFragment<FragmentHistoryPageBinding>(FragmentHis
val favoriteList = SpJsonUtils.getSpJsonList<ShortPlay>(KEY_SHORTPLAY_FAVORITE).map { it.id }
val list = SpJsonUtils.getSpJsonList<ShortPlayHistory>(KEY_SHORTPLAY_HISTORY)
list.forEach {
if (favoriteList.contains(it.shortPlay.id)) {
it.isFavorite = true
......@@ -45,6 +45,8 @@ class HistoryPageFragment : BaseFragment<FragmentHistoryPageBinding>(FragmentHis
launch(Dispatchers.Main) {
binding.llEmpty.isVisible = list.isEmpty()
shortPlayAdapter.submitList(list)
val pfg = parentFragment as MyListFragment
pfg.changeEditEnable(list.isNotEmpty())
}
}
}
......
......@@ -84,4 +84,8 @@ class MyListFragment : BaseFragment<FragmentMyListBinding>(FragmentMyListBinding
super.initListener()
}
fun changeEditEnable(enable: Boolean) {
binding.ivEdit.isEnabled = enable
}
}
\ No newline at end of file
package com.base.appzxhy.ui.main.mylist
import androidx.core.view.isVisible
import androidx.lifecycle.lifecycleScope
import com.base.appzxhy.R
import com.base.appzxhy.base.BaseFragment
import com.base.appzxhy.databinding.FragmentMyListPageBinding
import com.base.appzxhy.ui.adapter.ShortPlayAdapter
import com.base.appzxhy.utils.SpJsonUtils
import com.base.appzxhy.utils.SpJsonUtils.KEY_SHORTPLAY_FAVORITE
import com.bytedance.sdk.shortplay.api.ShortPlay
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
class MyListPageFragment : BaseFragment<FragmentMyListPageBinding>(FragmentMyListPageBinding::inflate) {
......@@ -12,6 +19,22 @@ class MyListPageFragment : BaseFragment<FragmentMyListPageBinding>(FragmentMyLis
override fun initView() {
super.initView()
binding.rv.adapter = shortPlayAdapter
}
override fun onResume() {
super.onResume()
refreshData()
}
private fun refreshData() = lifecycleScope.launch(Dispatchers.IO) {
val list = SpJsonUtils.getSpJsonList<ShortPlay>(KEY_SHORTPLAY_FAVORITE)
launch(Dispatchers.Main) {
binding.llEmpty.isVisible = list.isEmpty()
shortPlayAdapter.submitList(list)
val pfg = parentFragment as MyListFragment
pfg.changeEditEnable(list.isNotEmpty())
}
}
override fun initListener() {
......
package com.base.appzxhy.ui.views
import android.content.Context
import com.zhpan.indicator.base.BaseIndicatorView
class MyIndicatorView(context: Context) : BaseIndicatorView(context, null, 0) {
}
\ No newline at end of file
......@@ -4,7 +4,7 @@
<gradient
android:angle="90"
android:centerY="0.5"
android:endColor="#1A000000"
android:endColor="#00000000"
android:startColor="@color/black" />
</shape>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@mipmap/my_bianji_n" android:state_enabled="false" />
<item android:drawable="@mipmap/my_bianji_s" android:state_enabled="true" />
</selector>
\ No newline at end of file
......@@ -10,6 +10,7 @@
android:id="@+id/rv"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:overScrollMode="never"
app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager"
tools:listitem="@layout/item_shortplay_style_5" />
......
......@@ -44,19 +44,19 @@
app:layout_constraintTop_toBottomOf="@id/dslTabLayout" />
<FrameLayout
android:id="@+id/flEdit"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:padding="16dp"
android:src="@mipmap/my_bianji_n"
app:layout_constraintBottom_toBottomOf="@id/dslTabLayout"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="@id/dslTabLayout">
<ImageView
android:id="@+id/ivIcon"
android:id="@+id/ivEdit"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@mipmap/my_bianji_n"
android:src="@drawable/my_bianji_enable"
tools:ignore="ContentDescription" />
</FrameLayout>
......
......@@ -11,6 +11,7 @@
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_gravity="center"
android:overScrollMode="never"
app:layoutManager="androidx.recyclerview.widget.GridLayoutManager"
app:spanCount="3"
tools:listitem="@layout/item_shortplay_style_3" />
......
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:banner="http://schemas.android.com/apk/res-auto"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/root"
android:layout_width="match_parent"
......@@ -18,20 +18,16 @@
android:layout_height="wrap_content"
android:orientation="vertical">
<com.youth.banner.Banner
<com.zhpan.bannerview.BannerViewPager
android:id="@+id/banner"
android:layout_width="match_parent"
android:layout_height="450dp"
banner:banner_indicator_height="3dp"
banner:banner_indicator_normal_color="#4DFFFFFF"
banner:banner_indicator_normal_width="13dp"
banner:banner_indicator_selected_color="#FFFFFF"
banner:banner_indicator_selected_width="20dp"
banner:layout_constraintEnd_toEndOf="parent"
banner:layout_constraintStart_toStartOf="parent"
banner:layout_constraintTop_toTopOf="parent" />
app:bvp_page_style="multi_page"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<com.youth.banner.indicator.RectangleIndicator
<com.zhpan.indicator.IndicatorView
android:id="@+id/indicator"
android:layout_width="wrap_content"
android:layout_height="6dp"
......
......@@ -2,4 +2,6 @@
<resources>
<color name="black">#FF000000</color>
<color name="white">#FFFFFFFF</color>
<color name="color_4dffffff">#4dffffff</color>
<color name="color_ffffff">#ffffff</color>
</resources>
\ No newline at end of file
......@@ -31,4 +31,6 @@
<dimen name="dp_28">28dp</dimen>
<dimen name="dp_60">60dp</dimen>
<dimen name="dp_66">66dp</dimen>
<dimen name="dp_20">20dp</dimen>
<dimen name="dp_13">13dp</dimen>
</resources>
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment