mirror of
https://github.com/recloudstream/cloudstream.git
synced 2024-08-15 01:53:11 +00:00
Add item animation when selected
This commit is contained in:
parent
b69bc9069d
commit
88935b40a6
1 changed files with 41 additions and 7 deletions
|
@ -1,7 +1,10 @@
|
||||||
package com.lagradost.cloudstream3.ui.download
|
package com.lagradost.cloudstream3.ui.download
|
||||||
|
|
||||||
|
import android.animation.AnimatorSet
|
||||||
|
import android.animation.ObjectAnimator
|
||||||
import android.text.format.Formatter.formatShortFileSize
|
import android.text.format.Formatter.formatShortFileSize
|
||||||
import android.view.LayoutInflater
|
import android.view.LayoutInflater
|
||||||
|
import android.view.View
|
||||||
import android.view.ViewGroup
|
import android.view.ViewGroup
|
||||||
import android.widget.CheckBox
|
import android.widget.CheckBox
|
||||||
import androidx.core.content.ContextCompat
|
import androidx.core.content.ContextCompat
|
||||||
|
@ -72,6 +75,8 @@ class DownloadAdapter(
|
||||||
private val selectedIds: HashMap<Int, Boolean> = HashMap()
|
private val selectedIds: HashMap<Int, Boolean> = HashMap()
|
||||||
|
|
||||||
companion object {
|
companion object {
|
||||||
|
private const val PAYLOAD_SELECTION_CHANGED = 0
|
||||||
|
|
||||||
private const val VIEW_TYPE_HEADER = 0
|
private const val VIEW_TYPE_HEADER = 0
|
||||||
private const val VIEW_TYPE_CHILD = 1
|
private const val VIEW_TYPE_CHILD = 1
|
||||||
}
|
}
|
||||||
|
@ -138,6 +143,7 @@ class DownloadAdapter(
|
||||||
deleteCheckbox.setOnCheckedChangeListener { _, isChecked ->
|
deleteCheckbox.setOnCheckedChangeListener { _, isChecked ->
|
||||||
selectedIds[data.id] = isChecked
|
selectedIds[data.id] = isChecked
|
||||||
onItemSelectionChanged.invoke(card, isChecked)
|
onItemSelectionChanged.invoke(card, isChecked)
|
||||||
|
animateSelection(isChecked)
|
||||||
}
|
}
|
||||||
} else deleteCheckbox.setOnCheckedChangeListener(null)
|
} else deleteCheckbox.setOnCheckedChangeListener(null)
|
||||||
|
|
||||||
|
@ -312,6 +318,7 @@ class DownloadAdapter(
|
||||||
deleteCheckbox.setOnCheckedChangeListener { _, isChecked ->
|
deleteCheckbox.setOnCheckedChangeListener { _, isChecked ->
|
||||||
selectedIds[data.id] = isChecked
|
selectedIds[data.id] = isChecked
|
||||||
onItemSelectionChanged.invoke(card, isChecked)
|
onItemSelectionChanged.invoke(card, isChecked)
|
||||||
|
animateSelection(isChecked)
|
||||||
}
|
}
|
||||||
} else deleteCheckbox.setOnCheckedChangeListener(null)
|
} else deleteCheckbox.setOnCheckedChangeListener(null)
|
||||||
|
|
||||||
|
@ -321,6 +328,29 @@ class DownloadAdapter(
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private fun toggleIsChecked(checkbox: CheckBox, item: VisualDownloadCached) {
|
||||||
|
val isChecked = !checkbox.isChecked
|
||||||
|
checkbox.isChecked = isChecked
|
||||||
|
selectedIds[item.data.id] = isChecked
|
||||||
|
onItemSelectionChanged.invoke(item, isChecked)
|
||||||
|
|
||||||
|
val index = currentList.indexOf(item)
|
||||||
|
if (index != -1) {
|
||||||
|
notifyItemChanged(index, PAYLOAD_SELECTION_CHANGED)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fun animateSelection(isSelected: Boolean) {
|
||||||
|
val scaleValue = if (isSelected) 0.95f else 1.0f
|
||||||
|
val scaleX = ObjectAnimator.ofFloat(itemView, View.SCALE_X, scaleValue)
|
||||||
|
val scaleY = ObjectAnimator.ofFloat(itemView, View.SCALE_Y, scaleValue)
|
||||||
|
AnimatorSet().apply {
|
||||||
|
playTogether(scaleX, scaleY)
|
||||||
|
duration = 200
|
||||||
|
start()
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): DownloadViewHolder {
|
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): DownloadViewHolder {
|
||||||
|
@ -337,6 +367,17 @@ class DownloadAdapter(
|
||||||
holder.bind(getItem(position))
|
holder.bind(getItem(position))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
override fun onBindViewHolder(holder: DownloadViewHolder, position: Int, payloads: MutableList<Any>) {
|
||||||
|
if (payloads.isNotEmpty()) {
|
||||||
|
val payload = payloads.firstOrNull() as? Int
|
||||||
|
if (payload == PAYLOAD_SELECTION_CHANGED) {
|
||||||
|
holder.itemView.apply {
|
||||||
|
holder.animateSelection(selectedIds[getItem(position).data.id] == true)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else holder.bind(getItem(position))
|
||||||
|
}
|
||||||
|
|
||||||
override fun getItemViewType(position: Int): Int {
|
override fun getItemViewType(position: Int): Int {
|
||||||
return when (getItem(position)) {
|
return when (getItem(position)) {
|
||||||
is VisualDownloadCached.Child -> VIEW_TYPE_CHILD
|
is VisualDownloadCached.Child -> VIEW_TYPE_CHILD
|
||||||
|
@ -376,13 +417,6 @@ class DownloadAdapter(
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun toggleIsChecked(checkbox: CheckBox, item: VisualDownloadCached) {
|
|
||||||
val isChecked = !checkbox.isChecked
|
|
||||||
checkbox.isChecked = isChecked
|
|
||||||
selectedIds[item.data.id] = isChecked
|
|
||||||
onItemSelectionChanged.invoke(item, isChecked)
|
|
||||||
}
|
|
||||||
|
|
||||||
class DiffCallback : DiffUtil.ItemCallback<VisualDownloadCached>() {
|
class DiffCallback : DiffUtil.ItemCallback<VisualDownloadCached>() {
|
||||||
override fun areItemsTheSame(
|
override fun areItemsTheSame(
|
||||||
oldItem: VisualDownloadCached,
|
oldItem: VisualDownloadCached,
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue