From 8b33c7c94caa9489720e25307008910c6d67577a Mon Sep 17 00:00:00 2001 From: Li ZongYing Date: Tue, 20 Feb 2024 20:55:35 +0800 Subject: [PATCH] optimize memu --- .../java/com/lizongying/mytv/CardAdapter.kt | 42 ++++++++++++++----- .../java/com/lizongying/mytv/MainFragment.kt | 11 ++--- 2 files changed, 34 insertions(+), 19 deletions(-) diff --git a/app/src/main/java/com/lizongying/mytv/CardAdapter.kt b/app/src/main/java/com/lizongying/mytv/CardAdapter.kt index 0049828..cb1bd26 100644 --- a/app/src/main/java/com/lizongying/mytv/CardAdapter.kt +++ b/app/src/main/java/com/lizongying/mytv/CardAdapter.kt @@ -2,21 +2,24 @@ package com.lizongying.mytv import android.graphics.Color import android.view.ContextThemeWrapper -import android.view.MotionEvent import android.view.View import android.view.ViewGroup +import android.view.animation.Animation import android.view.animation.ScaleAnimation import android.widget.ImageView import androidx.leanback.widget.ImageCardView import androidx.lifecycle.LifecycleOwner -import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.RecyclerView import com.bumptech.glide.Glide import com.lizongying.mytv.models.TVListViewModel import com.lizongying.mytv.models.TVViewModel -class CardAdapter(private val owner: LifecycleOwner, private var tvListViewModel: TVListViewModel) : +class CardAdapter( + private val recyclerView: RecyclerView, + private val owner: LifecycleOwner, + private var tvListViewModel: TVListViewModel +) : RecyclerView.Adapter() { private var listener: ItemListener? = null @@ -24,22 +27,32 @@ class CardAdapter(private val owner: LifecycleOwner, private var tvListViewModel override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder { val cardView = object : ImageCardView(ContextThemeWrapper(parent.context, R.style.CustomImageCardTheme)) {} - startScaleAnimation(cardView, 1.0f, 0.9f) cardView.isFocusable = true cardView.isFocusableInTouchMode = true return ViewHolder(cardView) } - private fun startScaleAnimation(view: View, fromScale: Float, toScale: Float) { + private fun startScaleAnimation(view: View, fromScale: Float, toScale: Float, duration: Long) { val scaleAnimation = ScaleAnimation( fromScale, toScale, fromScale, toScale, ScaleAnimation.RELATIVE_TO_SELF, 0.5f, ScaleAnimation.RELATIVE_TO_SELF, 0.5f ) - scaleAnimation.duration = 200 + scaleAnimation.duration = duration scaleAnimation.fillAfter = true + scaleAnimation.setAnimationListener(object : Animation.AnimationListener { + override fun onAnimationStart(animation: Animation?) { + } + + override fun onAnimationEnd(animation: Animation?) { + view.tag = toScale + } + + override fun onAnimationRepeat(animation: Animation?) { + } + }) view.startAnimation(scaleAnimation) } @@ -50,12 +63,20 @@ class CardAdapter(private val owner: LifecycleOwner, private var tvListViewModel val tvViewModel = item as TVViewModel val cardView = viewHolder.view as ImageCardView - val onFocusChangeListener = View.OnFocusChangeListener { _, hasFocus -> + startScaleAnimation(cardView, 1.0f, 0.9f, 0) + + val onFocusChangeListener = View.OnFocusChangeListener { view, hasFocus -> listener?.onItemFocusChange(item, hasFocus) + if (hasFocus) { - startScaleAnimation(cardView, 0.9f, 1.0f) - } else { - startScaleAnimation(cardView, 1.0f, 0.9f) + startScaleAnimation(cardView, 0.9f, 1.0f, 200) + + for (i in 0 until recyclerView.childCount) { + val v = recyclerView.getChildAt(i) + if (v != view && v.tag != 0.9f) { + startScaleAnimation(v, 1.0f, 0.9f, 200) + } + } } } @@ -66,7 +87,6 @@ class CardAdapter(private val owner: LifecycleOwner, private var tvListViewModel } cardView.titleText = tvViewModel.title.value - cardView.tag = tvViewModel.videoUrl.value when (tvViewModel.title.value) { "CCTV8K 超高清" -> Glide.with(viewHolder.view.context) diff --git a/app/src/main/java/com/lizongying/mytv/MainFragment.kt b/app/src/main/java/com/lizongying/mytv/MainFragment.kt index b982bcc..678b641 100644 --- a/app/src/main/java/com/lizongying/mytv/MainFragment.kt +++ b/app/src/main/java/com/lizongying/mytv/MainFragment.kt @@ -74,7 +74,8 @@ class MainFragment : Fragment(), CardAdapter.ItemListener { } tvListViewModel.maxNum.add(v.size) - val adapter = CardAdapter(viewLifecycleOwner, tvListViewModelCurrent) + val adapter = + CardAdapter(itemBinding.rowItems, viewLifecycleOwner, tvListViewModelCurrent) rowList.add(itemBinding.rowItems) adapter.setItemListener(this) @@ -86,13 +87,7 @@ class MainFragment : Fragment(), CardAdapter.ItemListener { itemBinding.rowItems.addOnScrollListener(object : RecyclerView.OnScrollListener() { override fun onScrolled(recyclerView: RecyclerView, dx: Int, dy: Int) { -// super.onScrolled(recyclerView, dx, dy) -// val layoutManager = recyclerView.layoutManager as LinearLayoutManager -// val firstVisibleItemPosition = layoutManager.findFirstVisibleItemPosition() -// val firstVisibleViewHolder = recyclerView.findViewHolderForAdapterPosition(firstVisibleItemPosition) -// if (firstVisibleViewHolder != null && !firstVisibleViewHolder.itemView.hasFocus()) { -// firstVisibleViewHolder.itemView.requestFocus() -// } + super.onScrolled(recyclerView, dx, dy) (activity as MainActivity).mainActive() } })