Commit 9bd753b1 authored by wanglei's avatar wanglei

...搜索栏高斯模糊

parent b3ffe2fa
package com.base.appzxhy.bean
import com.bytedance.sdk.shortplay.api.ShortPlay
/**
* 短剧的观看历史
*/
data class ShortPlayHistory(
val shortPlay: ShortPlay,
var epIndex: Int,
) {
var isFavorite: Boolean = false
}
package com.base.appzxhy.shortplay;
import com.bytedance.sdk.shortplay.api.ShortPlay;
import java.util.ArrayList;
public class PlayHistoryHelper {
private static final ArrayList<PlayHistory> playHistoryList = new ArrayList<>();
public static void savePlayHistory(PlayHistory newPlayHistory) {
if (newPlayHistory == null || newPlayHistory.shortPlay == null) {
return;
}
for (PlayHistory history : playHistoryList) {
if (history.shortPlay.id == newPlayHistory.shortPlay.id) {
playHistoryList.remove(history);
break;
}
}
playHistoryList.add(0, newPlayHistory);
}
public static ArrayList<PlayHistory> getPlayHistory() {
return playHistoryList;
}
public static PlayHistory getLastWatchShortPlay() {
return playHistoryList.isEmpty() ? null : playHistoryList.get(0);
}
public static class PlayHistory {
public ShortPlay shortPlay;
public int index;
public int seconds;
}
}
package com.base.appzxhy.ui.adapter
import android.content.Context
import android.graphics.Color
import android.text.SpannableString
import android.text.style.ForegroundColorSpan
import android.view.ViewGroup
import com.base.appzxhy.R
import com.base.appzxhy.bean.ShortPlayHistory
import com.base.appzxhy.databinding.ItemShortplayStyle5Binding
import com.base.appzxhy.utils.SpJsonUtils
import com.base.appzxhy.utils.SpJsonUtils.KEY_SHORTPLAY_FAVORITE
import com.base.appzxhy.utils.XmlEx.inflate
import com.bumptech.glide.Glide
import com.bytedance.sdk.shortplay.api.ShortPlay
import com.chad.library.adapter4.BaseQuickAdapter
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.MainScope
import kotlinx.coroutines.launch
class ShortPlayHistoryAdapter(
val layout: Int
) : BaseQuickAdapter<ShortPlayHistory, CommonViewHolder>() {
var itemClick: ((shortList: ShortPlay) -> Unit)? = null
override fun onBindViewHolder(holder: CommonViewHolder, position: Int, item: ShortPlayHistory?, payloads: List<Any>) {
super.onBindViewHolder(holder, position, item, payloads)
item ?: return
when (layout) {
R.layout.item_shortplay_style_5 -> {
val binding = ItemShortplayStyle5Binding.bind(holder.itemView)
kotlin.runCatching {
val payload = payloads[0]
when (payload) {
"changeFavorite" -> {
if (item.isFavorite) {
binding.ivFavorite.setImageResource(R.mipmap.shoucang_s)
} else {
binding.ivFavorite.setImageResource(R.mipmap.shoucang_n)
}
saveShortFavorite(item, item.isFavorite)
}
}
}
}
}
}
/**
* 保存短剧收藏
*/
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)
}
}
}
override fun onBindViewHolder(holder: CommonViewHolder, position: Int, item: ShortPlayHistory?) {
item ?: return
val context = holder.itemView.context
when (layout) {
R.layout.item_shortplay_style_5 -> {
val binding = ItemShortplayStyle5Binding.bind(holder.itemView)
Glide.with(context).load(item.shortPlay.coverImage).into(binding.iv)
binding.tvName.text = item.shortPlay.title
val epIndex = "EP." + item.epIndex + " "
val epTotal = "/ EP." + item.shortPlay.total
val fullText = epIndex + epTotal
val spannableString = SpannableString(fullText)
spannableString.setSpan(
ForegroundColorSpan(Color.parseColor("#FF3D71")),
0, epIndex.length, // 从 0 开始到 epIndex.length 结束
SpannableString.SPAN_INCLUSIVE_INCLUSIVE
)
spannableString.setSpan(
ForegroundColorSpan(Color.parseColor("#80FFFFFF")),
epIndex.length, fullText.length, // 从 epIndex.length 开始到 fullText.length 结束
SpannableString.SPAN_INCLUSIVE_INCLUSIVE
)
binding.tvWatchEP.text = spannableString
if (item.isFavorite) {
binding.ivFavorite.setImageResource(R.mipmap.shoucang_s)
} else {
binding.ivFavorite.setImageResource(R.mipmap.shoucang_n)
}
binding.ivFavorite.setOnClickListener {
item.isFavorite = !item.isFavorite
notifyItemChanged(position, "changeFavorite")
}
}
}
}
override fun onCreateViewHolder(context: Context, parent: ViewGroup, viewType: Int): CommonViewHolder {
return CommonViewHolder(layout.inflate(parent))
}
}
\ No newline at end of file
......@@ -113,8 +113,11 @@ class BannerAdapter : BaseQuickAdapter<List<ShortPlay>, CommonViewHolder>() {
// 获取主题色
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)
// 使用这些颜色进行后续操作,例如设置背景色等
paletteMap[coverImage] = mutedColor
paletteMap[coverImage] = newColor
}
}
......
package com.base.appzxhy.ui.main
import android.content.Intent
import android.graphics.drawable.Drawable
import android.os.Build
import androidx.core.view.updatePadding
import androidx.lifecycle.lifecycleScope
import androidx.recyclerview.widget.ConcatAdapter
......@@ -19,6 +21,9 @@ import com.base.appzxhy.utils.LogEx
import com.base.appzxhy.utils.ToastUtils.toast
import com.bytedance.sdk.shortplay.api.ShortPlay
import com.google.gson.Gson
import eightbitlab.com.blurview.BlurAlgorithm
import eightbitlab.com.blurview.RenderEffectBlur
import eightbitlab.com.blurview.RenderScriptBlur
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.flow.collectLatest
import kotlinx.coroutines.launch
......@@ -33,8 +38,8 @@ class HomeFragment : BaseFragment<FragmentHomeBinding>(FragmentHomeBinding::infl
override fun initView() {
super.initView()
val top = BarUtils.getStatusBarHeight()+requireContext().resources.getDimensionPixelSize(R.dimen.dp_6)
binding.flSearch.updatePadding(top = top)
val top = BarUtils.getStatusBarHeight() + requireContext().resources.getDimensionPixelSize(R.dimen.dp_6)
binding.blurView.updatePadding(top = top)
contactAdapter = ConcatAdapter()
binding.rv.adapter = contactAdapter
......@@ -51,6 +56,12 @@ class HomeFragment : BaseFragment<FragmentHomeBinding>(FragmentHomeBinding::infl
}
}
})
runCatching {
val algorithm: BlurAlgorithm = getBlurAlgorithm()
binding.blurView.setupWith(binding.root, algorithm)
.setBlurRadius(5f)
}
}
private val categories = arrayListOf<Long>()
......@@ -87,6 +98,9 @@ class HomeFragment : BaseFragment<FragmentHomeBinding>(FragmentHomeBinding::infl
putExtra("data", Gson().toJson(shortPlay))
})
}
it.paletteCallBack = { color ->
binding.blurView.setOverlayColor(color)
}
contactAdapter?.addAdapter(0, it)
}
......@@ -99,6 +113,14 @@ class HomeFragment : BaseFragment<FragmentHomeBinding>(FragmentHomeBinding::infl
}
private fun getBlurAlgorithm(): BlurAlgorithm {
val algorithm = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
RenderEffectBlur()
} else {
RenderScriptBlur(requireContext())
}
return algorithm
}
override fun onResumeOneShoot() {
super.onResumeOneShoot()
......
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.bean.ShortPlayHistory
import com.base.appzxhy.databinding.FragmentHistoryPageBinding
import com.base.appzxhy.ui.adapter.ShortPlayHistoryAdapter
import com.base.appzxhy.utils.SpJsonUtils
import com.base.appzxhy.utils.SpJsonUtils.KEY_SHORTPLAY_FAVORITE
import com.base.appzxhy.utils.SpJsonUtils.KEY_SHORTPLAY_HISTORY
import com.bytedance.sdk.shortplay.api.ShortPlay
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
class HistoryPageFragment : BaseFragment<FragmentHistoryPageBinding>(FragmentHistoryPageBinding::inflate) {
private val shortPlayAdapter = ShortPlayHistoryAdapter(R.layout.item_shortplay_style_5)
override fun initView() {
super.initView()
binding.rv.adapter = shortPlayAdapter
refreshRv()
}
override fun onResume() {
super.onResume()
}
private fun refreshRv() {
lifecycleScope.launch(Dispatchers.IO) {
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
}
}
launch(Dispatchers.Main) {
binding.llEmpty.isVisible = list.isEmpty()
shortPlayAdapter.submitList(list)
}
}
}
override fun initListener() {
......
......@@ -10,7 +10,7 @@ import com.base.appzxhy.R
import com.base.appzxhy.base.BaseFragment
import com.base.appzxhy.databinding.FragmentMyListBinding
import com.base.appzxhy.utils.BarUtils
import com.base.appzxhy.utils.LogEx
class MyListFragment : BaseFragment<FragmentMyListBinding>(FragmentMyListBinding::inflate) {
......@@ -18,7 +18,7 @@ class MyListFragment : BaseFragment<FragmentMyListBinding>(FragmentMyListBinding
MyListPageFragment()
}
private val historyPage by lazy(LazyThreadSafetyMode.NONE) {
MyListPageFragment()
HistoryPageFragment()
}
private val fragments = arrayOf(myListPage, historyPage)
private var pageAdapter: FragmentStateAdapter? = null
......@@ -70,7 +70,11 @@ class MyListFragment : BaseFragment<FragmentMyListBinding>(FragmentMyListBinding
binding.dslTabLayout.configTabLayoutConfig {
onSelectIndexChange = { fromIndex, selectIndexList, reselect, fromUser ->
if (fromUser) {
val toIndex = selectIndexList.first()
LogEx.logDebug(TAG, "fromUser$fromUser toIndex=$toIndex")
binding.viewPager2.setCurrentItem(toIndex, false)
}
}
}
ViewPager2Delegate.install(binding.viewPager2, binding.dslTabLayout)
......
package com.base.appzxhy.ui.main.mylist
import com.base.appzxhy.R
import com.base.appzxhy.base.BaseFragment
import com.base.appzxhy.databinding.FragmentMyListPageBinding
import com.base.appzxhy.ui.adapter.ShortPlayAdapter
class MyListPageFragment : BaseFragment<FragmentMyListPageBinding>(FragmentMyListPageBinding::inflate) {
private val shortPlayAdapter = ShortPlayAdapter(R.layout.item_shortplay_style_4)
override fun initView() {
super.initView()
binding.rv.adapter = shortPlayAdapter
}
override fun initListener() {
......
......@@ -9,8 +9,10 @@ import android.widget.FrameLayout
import android.widget.TextView
import androidx.activity.addCallback
import androidx.core.content.ContextCompat
import androidx.lifecycle.lifecycleScope
import com.base.appzxhy.R
import com.base.appzxhy.base.BaseActivity
import com.base.appzxhy.bean.ShortPlayHistory
import com.base.appzxhy.databinding.ActivityPlayFullBinding
import com.base.appzxhy.databinding.LayoutOverlayPlayerBinding
import com.base.appzxhy.databinding.PupupMoreBinding
......@@ -22,6 +24,8 @@ import com.base.appzxhy.ui.views.ShortPlayQualityDialog.showShortPlayQualityDial
import com.base.appzxhy.ui.views.ShortPlaySpeedDialog.showShortPlaySpeedDialog
import com.base.appzxhy.utils.KotlinExt.formatSeconds
import com.base.appzxhy.utils.LogEx
import com.base.appzxhy.utils.SpJsonUtils
import com.base.appzxhy.utils.SpJsonUtils.KEY_SHORTPLAY_HISTORY
import com.base.appzxhy.utils.ToastUtils.toast
import com.bytedance.sdk.shortplay.api.PSSDK
import com.bytedance.sdk.shortplay.api.PSSDK.AdCustomProvider
......@@ -32,6 +36,8 @@ import com.bytedance.sdk.shortplay.api.ShortPlayFragment
import com.google.gson.Gson
import com.gyf.immersionbar.ImmersionBar
import com.ss.ttvideoengine.Resolution
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
class PlayFullActivity : BaseActivity<ActivityPlayFullBinding>(ActivityPlayFullBinding::inflate) {
......@@ -44,8 +50,6 @@ class PlayFullActivity : BaseActivity<ActivityPlayFullBinding>(ActivityPlayFullB
private var resolutions: Array<Resolution>? = null
private var currentResolution = Resolution.Auto
// private val playHistory: PlayHistoryHelper.PlayHistory = PlayHistoryHelper.PlayHistory()
private val playControlViewSparseArray = SparseArray<CustomOverlayView>()
override fun initView() {
......@@ -142,15 +146,16 @@ class PlayFullActivity : BaseActivity<ActivityPlayFullBinding>(ActivityPlayFullB
@SuppressLint("SetTextI18n")
override fun onShortPlayPlayed(shortPlay: ShortPlay?, index: Int) {
shortPlay ?: return
this@PlayFullActivity.shortPlay = shortPlay
startFromIndex = index
LogEx.logDebug(TAG, "onShortPlayPlayed index=$index")
playControlViewSparseArray.get(index)?.findViewById<TextView>(R.id.tvTitle)?.text =
"${shortPlay?.title} $index/${shortPlay?.total}"
// playHistory.shortPlay = shortPlay
// playHistory.index = index
// PlayHistoryHelper.savePlayHistory(playHistory)
"${shortPlay.title} $index/${shortPlay.total}"
//保存播放历史
saveShortPlayHistory(shortPlay, index)
}
override fun onItemSelected(position: Int, type: PSSDK.ShortPlayDetailPageListener.ItemType, index: Int) {
......@@ -291,6 +296,21 @@ class PlayFullActivity : BaseActivity<ActivityPlayFullBinding>(ActivityPlayFullB
}
private fun saveShortPlayHistory(shortPlay: ShortPlay, epIndex: Int) = lifecycleScope.launch(Dispatchers.IO) {
val list = SpJsonUtils.getSpJsonList<ShortPlayHistory>(KEY_SHORTPLAY_HISTORY).toMutableList()
val findBean = list.find { it.shortPlay.id == shortPlay.id }
if (findBean == null) {
val newHistory = ShortPlayHistory(shortPlay, epIndex)
list.add(newHistory)
SpJsonUtils.saveJsonBeanList(KEY_SHORTPLAY_HISTORY, list)
} else {
findBean.epIndex = epIndex
SpJsonUtils.saveJsonBeanList(KEY_SHORTPLAY_HISTORY, list)
}
}
private fun bindPlayControlView(playerBinding: LayoutOverlayPlayerBinding) {
playerBinding.niftySlider.addOnValueChangeListener { slider, value, fromUser ->
if (fromUser) {
......
package com.base.appzxhy.utils
import com.google.gson.Gson
import com.google.gson.reflect.TypeToken
object SpJsonUtils {
val TAG = "SpJsonUtils"
val KEY_SHORTPLAY_HISTORY = "key_shortplay_history"
val KEY_SHORTPLAY_FAVORITE = "key_shortplay_favorite"
inline fun <reified T> getSpJsonList(key: String): List<T> {
val sp = AppPreferences.getInstance().getString(key, "")
return if (sp.equals("")) {
listOf()
} else {
val gson = Gson()
val type = object : TypeToken<List<T>>() {}.type
val list: List<T> = gson.fromJson(sp, type)
return list
}
}
fun <T> saveJsonBeanList(key: String, list: List<T>) {
val json = Gson().toJson(list)
AppPreferences.getInstance().put(key, json)
}
inline fun <reified T> addJsonBean(key: String, bean: T) {
val arrayList = arrayListOf<T>()
val list = getSpJsonList<T>(key)
arrayList.addAll(list)
arrayList.add(bean)
saveJsonBeanList(key, arrayList.toList())
}
/**
* 这里保存一定要找到具体的类型,不能用父类
*/
inline fun <reified T> removeJsonBean(key: String, bean: T, crossinline removeIf: (it1: T, it2: T) -> Boolean) {
val list = getSpJsonList<T>(key).toMutableList()
list.removeIf { removeIf(it, bean) }
saveJsonBeanList(key, list)
}
}
\ No newline at end of file
......@@ -21,6 +21,12 @@
android:layout_marginBottom="60dp"
app:layout_constraintBottom_toBottomOf="parent">
<View
android:layout_width="match_parent"
android:layout_height="1dp"
android:layout_gravity="top"
android:background="#33ffffff" />
<com.google.android.material.tabs.TabLayout
android:id="@+id/tab_layout"
android:layout_width="match_parent"
......
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".ui.main.mylist.HistoryPageFragment">
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/rv"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager"
tools:listitem="@layout/item_shortplay_style_5" />
<LinearLayout
android:id="@+id/llEmpty"
android:layout_width="wrap_content"
......
......@@ -18,13 +18,18 @@
app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager" />
<eightbitlab.com.blurview.BlurView
android:id="@+id/flSearch"
android:id="@+id/blurView"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:blurOverlayColor="@color/black"
app:layout_constraintTop_toTopOf="parent">
<FrameLayout
android:id="@+id/flSearch"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingHorizontal="16dp"
android:paddingBottom="6dp"
app:layout_constraintTop_toTopOf="parent">
android:paddingBottom="6dp">
<LinearLayout
android:id="@+id/llSearch"
......@@ -60,6 +65,8 @@
</LinearLayout>
</FrameLayout>
</eightbitlab.com.blurview.BlurView>
......
......@@ -12,26 +12,26 @@
android:layout_width="wrap_content"
android:layout_height="50dp"
android:layout_marginTop="8dp"
app:tab_enable_text_bold="true"
app:tab_select_color="@color/white"
app:tab_deselect_color="#99FFFFFF"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent">
app:layout_constraintTop_toTopOf="parent"
app:tab_deselect_color="#99FFFFFF"
app:tab_enable_text_bold="true"
app:tab_select_color="@color/white">
<TextView
android:textSize="18sp"
android:layout_width="120dp"
android:layout_height="match_parent"
android:gravity="center"
android:text="@string/my_list" />
android:text="@string/my_list"
android:textSize="18sp" />
<TextView
android:textSize="18sp"
android:layout_width="120dp"
android:layout_height="match_parent"
android:gravity="center"
android:text="@string/history" />
android:text="@string/history"
android:textSize="18sp" />
</com.angcyo.tablayout.DslTabLayout>
......@@ -39,6 +39,7 @@
android:id="@+id/viewPager2"
android:layout_width="match_parent"
android:layout_height="0dp"
android:background="@color/black"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintTop_toBottomOf="@id/dslTabLayout" />
......
......@@ -6,7 +6,6 @@
android:layout_height="match_parent"
tools:context=".ui.main.mylist.MyListPageFragment">
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/rv"
android:layout_width="wrap_content"
......@@ -14,7 +13,7 @@
android:layout_gravity="center"
app:layoutManager="androidx.recyclerview.widget.GridLayoutManager"
app:spanCount="3"
tools:listitem="@layout/item_shortplay_style_2" />
tools:listitem="@layout/item_shortplay_style_3" />
<LinearLayout
android:id="@+id/llEmpty"
......
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginVertical="6dp"
tools:background="@color/black">
<androidx.cardview.widget.CardView
android:id="@+id/card"
android:layout_width="108dp"
android:layout_height="142dp"
android:layout_marginStart="14dp"
app:cardCornerRadius="10dp"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent">
<ImageView
android:id="@+id/iv"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:scaleType="centerCrop"
tools:ignore="ContentDescription" />
</androidx.cardview.widget.CardView>
<LinearLayout
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginHorizontal="12dp"
android:orientation="vertical"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toStartOf="@id/ivFavorite"
app:layout_constraintStart_toEndOf="@id/card"
app:layout_constraintTop_toTopOf="parent">
<TextView
android:id="@+id/tvName"
android:layout_width="120dp"
android:layout_height="wrap_content"
android:layout_marginTop="15dp"
android:maxLines="2"
android:textColor="@color/white"
android:textSize="14sp"
tools:ignore="TextSizeCheck"
tools:text="The Quarterback Next Door" />
<TextView
android:id="@+id/tvWatchEP"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginVertical="4dp"
android:layout_marginTop="4dp"
android:singleLine="true"
android:textColor="#FF3D71"
android:textSize="13sp"
tools:text="EP.O / EP.82" />
</LinearLayout>
<ImageView
android:id="@+id/ivFavorite"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginEnd="16dp"
android:src="@mipmap/shoucang_s"
app:layout_constraintBottom_toBottomOf="@id/card"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="@id/card" />
</androidx.constraintlayout.widget.ConstraintLayout>
\ 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