java - 如何添加和删除动画 RecyclerView 的项目
问题描述
我正在制作一个音乐应用程序。我有一个recyclerview,我正在播放点击项目的音乐,同时动画也有效。问题是每当用户更改 recyclerview 的项目位置时,我都需要取消第一个动画并为新位置开始新的动画。我的意思是每次只会存在 1 个动画。
我的 RecyclerViewAdapter
class RecyclerViewAdapter(private val ModelList:List<Musics>,private val listener:
ClickListener) :RecyclerView.Adapter<RecyclerViewAdapter.ViewHolder>(){
class ViewHolder(var binding:GridListBinding):RecyclerView.ViewHolder(binding.root) {
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
val inflater = LayoutInflater.from(parent.context)
val view = DataBindingUtil.inflate<GridListBinding>(inflater,R.layout.grid_list,parent,false)
return ViewHolder(view)
}
override fun onBindViewHolder(holder: RecyclerViewAdapter.ViewHolder, position: Int) {
holder.binding.musics = ModelList[position]
holder.binding.constraint.setOnClickListener{
listener.buttonClicked(holder.binding.constraint,ModelList[position],position)
}
}
override fun getItemCount(): Int {
return ModelList.size
}
}
我的适配器的 ClickListener
interface ClickListener {
fun buttonClicked(view: View,model: Musics,position:Int)
}
recyclerviewAdapter 的 grid_list
<?xml version="1.0" encoding="utf-8"?>
<layout
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"
>
<data>
<variable
name="musics"
type="com.tunahan.musicplayer.model.Musics" />
<variable
name="listener"
type="com.tunahan.musicplayer.adapter.ClickListener" />
</data>
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="125dp"
android:id="@+id/constraint"
android:layout_height="125dp"
android:layout_marginTop="10dp"
android:layout_marginStart="5dp"
tools:layout_editor_absoluteX="52dp"
tools:layout_editor_absoluteY="42dp"
>
<ImageView
android:id="@+id/image"
android:layout_width="0dp"
android:layout_height="0dp"
app:layout_constraintBottom_toTopOf="@+id/linearLayout"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
android:src="@drawable/musical"
tools:ignore="ContentDescription"
/>
<LinearLayout
android:id="@+id/linearLayout"
android:layout_width="match_parent"
android:layout_height="40dp"
android:layout_gravity="bottom"
android:orientation="horizontal"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent">
<TextView
android:id="@+id/gridTextView"
android:layout_width="0dp"
android:layout_height="40dp"
android:layout_weight="1"
android:fontFamily="@font/allerta"
android:gravity="center"
android:paddingStart="5dp"
android:text="@{musics.filename}"
android:textColor="@color/black"
android:textSize="16sp"
tools:ignore="RtlSymmetry" />
</LinearLayout>
</androidx.constraintlayout.widget.ConstraintLayout>
</layout>
以及 gridlist 的 imageView 的脉冲动画
scaleDown = ObjectAnimator.ofPropertyValuesHolder(
view.image,
PropertyValuesHolder.ofFloat("scaleX", 1.1f),
PropertyValuesHolder.ofFloat("scaleY", 1.1f),
)
scaleDown.duration = 500
scaleDown.repeatCount = ObjectAnimator.INFINITE
scaleDown.repeatMode = ObjectAnimator.REVERSE
scaleDown.start()
点击监听器
override fun buttonClicked(view: View, model: Musics, position: Int) {
path = model.filepath
nextMusic = position
positionplus = position
handler.removeCallbacks(runnable)
saveduid = sharedPref.getInt("changed", model.uid)
editor = sharedPref.edit()
editor.putInt("changed", model.uid)
editor.apply()
editor2.putInt("positionplus", positionplus)
editor2.apply()
if (saveduid == model.uid) {
if (mediaPlayer.isPlaying) {
ForegroundService.startService(
this, path = path, action = "ACTION_PAUSE",
positionplus, ModelList[positionplus].filename
)
scaleDown.cancel()
binding.seekbartextend.text = createTimeLabel(mediaPlayer.duration)
binding.playButton.setImageResource(R.drawable.ic_baseline_play_arrow_24)
} else {
ForegroundService.startService(
this, path = path, action = "ACTION_PLAY",
positionplus,ModelList[positionplus].filename
)
binding.seekbartextend.text = createTimeLabel(mediaPlayer.duration)
mediaPlayer.setOnCompletionListener {
nextButton()
}
binding.playButton.setImageResource(R.drawable.circledpause)
runnable = Runnable {
binding.seekBar.max = mediaPlayer.duration
binding.seekBar.progress = mediaPlayer.currentPosition
binding.seekbarTextstart.text = createTimeLabel(mediaPlayer.currentPosition)
binding.seekbartextend.text = createTimeLabel(mediaPlayer.duration)
handler.postDelayed(runnable, 1000)
}
handler.post(runnable)
}
} else {
ForegroundService.startService(
this, path = path, action = "ACTION_RESET",
positionplus,ModelList[positionplus].filename
)
if (positionplus != position)
scaleDown = ObjectAnimator.ofPropertyValuesHolder(
view.image,
PropertyValuesHolder.ofFloat("scaleX", 1.1f),
PropertyValuesHolder.ofFloat("scaleY", 1.1f),
)
scaleDown.duration = 500
scaleDown.repeatCount = ObjectAnimator.INFINITE
scaleDown.repeatMode = ObjectAnimator.REVERSE
scaleDown.start()
binding.seekbartextend.text = createTimeLabel(mediaPlayer.duration)
mediaPlayer.setOnCompletionListener {
nextButton()
}
binding.playButton.setImageResource(R.drawable.circledpause)
runnable = Runnable {
binding.seekBar.max = mediaPlayer.duration
binding.seekBar.progress = mediaPlayer.currentPosition
binding.seekbarTextstart.text = createTimeLabel(mediaPlayer.currentPosition)
binding.seekbartextend.text = createTimeLabel(mediaPlayer.duration)
handler.postDelayed(runnable, 1000)
}
handler.post(runnable)
}
}
解决方案
推荐阅读
- vue.js - Vue devServer 代理没有帮助,我仍然收到 CORS 错误
- c - Accessing enum value in memcpy
- php - How I compare a string of a file, and if it does not exist, I write it in the file in PHP?
- azure - 通过 Azure 从 c# 后端推送通知是使用 GCM 而不是 FCM 发送的
- ios - libRNLaunchNavigator 的 React 本机链接器命令失败
- laravel - Voyager 管理面板链接已损坏
- php - 如何通过索引 $sheet->getRowIterator() 获取行?
- bash - 将“tail -f”输出重定向到 COPY 命令
- html - 背景颜色拒绝在 Outlook 中应用
- javascript - Html 未按预期呈现 javascript 断线