From 4e78162d7ff25cd83cfa5023c51d283f101e3d19 Mon Sep 17 00:00:00 2001 From: leafwai Date: Mon, 15 Nov 2021 17:27:41 +0800 Subject: [PATCH] =?UTF-8?q?=E3=80=90=E5=85=89=E7=8E=AF=E5=8A=A9=E6=89=8BV5?= =?UTF-8?q?.5.0=E3=80=91=E6=B8=B8=E6=88=8F=E5=8D=95=E5=B9=BF=E5=9C=BA(UI)h?= =?UTF-8?q?ttps://git.ghzs.com/pm/halo-app-issues/-/issues/1598=20?= =?UTF-8?q?=E3=80=90=E5=85=89=E7=8E=AF=E5=8A=A9=E6=89=8BV5.5.0=E3=80=91?= =?UTF-8?q?=E9=A6=96=E9=A1=B5=E9=A1=B6=E9=83=A8tab-=E6=B8=B8=E6=88=8F?= =?UTF-8?q?=E5=8D=95=E5=B9=BF=E5=9C=BA(UI)https://git.ghzs.com/pm/halo-app?= =?UTF-8?q?-issues/-/issues/1599=20=E3=80=90=E5=85=89=E7=8E=AF=E5=8A=A9?= =?UTF-8?q?=E6=89=8BV5.5.0=E3=80=91=E9=A6=96=E9=A1=B5/=E7=89=88=E5=9D=97?= =?UTF-8?q?=E5=86=85=E5=AE=B9=E5=88=97=E8=A1=A8-=E6=B8=B8=E6=88=8F?= =?UTF-8?q?=E5=8D=95=E5=B9=BF=E5=9C=BA(UI)https://git.ghzs.com/pm/halo-app?= =?UTF-8?q?-issues/-/issues/1600?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/AndroidManifest.xml | 8 +- .../com/gh/common/view/StackRecyclerView.kt | 23 + .../view/stacklayoutmanager/StackAnimation.kt | 22 + .../view/stacklayoutmanager/StackLayout.kt | 34 ++ .../stacklayoutmanager/StackLayoutManager.kt | 544 ++++++++++++++++++ .../square/GameCollectionAmwayAdapter.kt | 51 ++ .../square/GameCollectionAmwayViewHolder.kt | 111 ++++ .../square/GameCollectionSquareActivity.kt | 23 + .../square/GameCollectionSquareAdapter.kt | 128 +++++ .../square/GameCollectionSquareFragment.kt | 313 ++++++++++ .../square/GameCollectionSquareViewModel.kt | 31 + .../GameCollectionStackAnimation.kt | 144 +++++ .../GameCollectionStackLayout.kt | 110 ++++ .../HomeGameCollectionAdapter.kt | 65 +++ .../HomeGameCollectionViewHolder.kt | 46 ++ .../game_collection_rg_button_selector.xml | 5 + .../game_collection_square_head.webp | Bin 0 -> 101002 bytes .../ic_game_collection_hot.webp | Bin 0 -> 874 bytes .../ic_game_collection_square_amway_go.webp | Bin 0 -> 10126 bytes .../bg_game_collection_hot_container.xml | 5 + .../drawable/bg_game_collection_square.xml | 7 + .../bg_game_collection_user_container.xml | 5 + .../drawable/progressbar_game_collection.xml | 20 + .../fragment_game_collection_square.xml | 229 ++++++++ .../fragment_game_collection_square_al.xml | 52 ++ .../game_collection_amway_content_item.xml | 38 ++ .../game_collection_square_amway_item.xml | 58 ++ .../layout/game_collection_square_item.xml | 280 +++++++++ .../layout/home_game_collection_card_item.xml | 196 +++++++ ...item.xml => home_game_collection_item.xml} | 17 +- 30 files changed, 2551 insertions(+), 14 deletions(-) create mode 100644 app/src/main/java/com/gh/common/view/StackRecyclerView.kt create mode 100644 app/src/main/java/com/gh/common/view/stacklayoutmanager/StackAnimation.kt create mode 100644 app/src/main/java/com/gh/common/view/stacklayoutmanager/StackLayout.kt create mode 100644 app/src/main/java/com/gh/common/view/stacklayoutmanager/StackLayoutManager.kt create mode 100644 app/src/main/java/com/gh/gamecenter/gamecollection/square/GameCollectionAmwayAdapter.kt create mode 100644 app/src/main/java/com/gh/gamecenter/gamecollection/square/GameCollectionAmwayViewHolder.kt create mode 100644 app/src/main/java/com/gh/gamecenter/gamecollection/square/GameCollectionSquareActivity.kt create mode 100644 app/src/main/java/com/gh/gamecenter/gamecollection/square/GameCollectionSquareAdapter.kt create mode 100644 app/src/main/java/com/gh/gamecenter/gamecollection/square/GameCollectionSquareFragment.kt create mode 100644 app/src/main/java/com/gh/gamecenter/gamecollection/square/GameCollectionSquareViewModel.kt create mode 100644 app/src/main/java/com/gh/gamecenter/home/gamecollection/GameCollectionStackAnimation.kt create mode 100644 app/src/main/java/com/gh/gamecenter/home/gamecollection/GameCollectionStackLayout.kt create mode 100644 app/src/main/java/com/gh/gamecenter/home/gamecollection/HomeGameCollectionAdapter.kt create mode 100644 app/src/main/java/com/gh/gamecenter/home/gamecollection/HomeGameCollectionViewHolder.kt create mode 100644 app/src/main/res/color/game_collection_rg_button_selector.xml create mode 100644 app/src/main/res/drawable-xxxhdpi/game_collection_square_head.webp create mode 100644 app/src/main/res/drawable-xxxhdpi/ic_game_collection_hot.webp create mode 100644 app/src/main/res/drawable-xxxhdpi/ic_game_collection_square_amway_go.webp create mode 100644 app/src/main/res/drawable/bg_game_collection_hot_container.xml create mode 100644 app/src/main/res/drawable/bg_game_collection_square.xml create mode 100644 app/src/main/res/drawable/bg_game_collection_user_container.xml create mode 100644 app/src/main/res/drawable/progressbar_game_collection.xml create mode 100644 app/src/main/res/layout/fragment_game_collection_square.xml create mode 100644 app/src/main/res/layout/fragment_game_collection_square_al.xml create mode 100644 app/src/main/res/layout/game_collection_amway_content_item.xml create mode 100644 app/src/main/res/layout/game_collection_square_amway_item.xml create mode 100644 app/src/main/res/layout/game_collection_square_item.xml create mode 100644 app/src/main/res/layout/home_game_collection_card_item.xml rename app/src/main/res/layout/{game_collection_tag_body_item.xml => home_game_collection_item.xml} (58%) diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index d7c76517d5..e260be198b 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -742,12 +742,12 @@ android:name=".gamecollection.MyGameCollectionActivity" android:screenOrientation="portrait" /> - - - + , + layout: Class) : RecyclerView.LayoutManager() { + private enum class FlingOrientation{NONE, LEFT_TO_RIGHT, RIGHT_TO_LEFT, TOP_TO_BOTTOM, BOTTOM_TO_TOP} + + enum class ScrollOrientation{LEFT_TO_RIGHT, RIGHT_TO_LEFT, TOP_TO_BOTTOM, BOTTOM_TO_TOP} + + private var mVisibleItemCount = visibleCount + + private var mScrollOrientation = scrollOrientation + + private var mScrollOffset: Int + + var isFlinging = false + + private lateinit var mOnScrollListener: OnScrollListener + private lateinit var mOnFlingListener: OnFlingListener + + //做动画的组件,支持自定义 + private var mAnimation: StackAnimation? = null + //做布局的组件,支持自定义 + private var mLayout: StackLayout? = null + + //是否是翻页效果 + private var mPagerMode = true + + //触发翻页效果的最低 Fling速度 + private var mPagerFlingVelocity = 0 + + //标志当前滚动是否是调用scrollToCenter之后触发的滚动 + private var mFixScrolling = false + + //fling的方向,用来判断是前翻还是后翻 + private var mFlingOrientation = FlingOrientation.NONE + + //当前所处item对应的位置 + private var itemPosition = 0 + + //判断item位置是否发生了改变 + private var isItemPositionChanged = false + + //item 位置发生改变的回调 + private var itemChangedListener: ItemChangedListener? = null + + interface ItemChangedListener { + fun onItemChanged(position: Int) + } + + /** + * 设置是否为ViewPager 式翻页模式. + *

+ * 当设置为 true 的时候,可以配合[StackLayoutManager.setPagerFlingVelocity]设置触发翻页的最小速度. + * @param isPagerMode 这个值默认是 false,当设置为 true 的时候,会有 viewPager 翻页效果. + */ + fun setPagerMode(isPagerMode: Boolean) { + mPagerMode = isPagerMode + } + + /** + * @return 当前是否为ViewPager翻页模式. + */ + fun getPagerMode(): Boolean { + return mPagerMode + } + + /** + * 设置触发ViewPager翻页效果的最小速度. + *

+ * 该值仅在 [StackLayoutManager.getPagerMode] == true的时候有效. + * @param velocity 默认值是2000. + */ + fun setPagerFlingVelocity(@androidx.annotation.IntRange(from = 0, to = Int.MAX_VALUE.toLong()) velocity: Int) { + mPagerFlingVelocity = Int.MAX_VALUE.coerceAtMost(0.coerceAtLeast(velocity)) + } + + /** + * @return 当前触发翻页的最小 fling 速度. + */ + fun getPagerFlingVelocity(): Int { + return mPagerFlingVelocity + } + + /** + * 设置recyclerView 静止时候可见的itemView 个数. + * @param count 可见 itemView,默认为3 + */ + fun setVisibleItemCount(@androidx.annotation.IntRange(from = 1, to = Long.MAX_VALUE)count: Int) { + mVisibleItemCount = (itemCount - 1).coerceAtMost(1.coerceAtLeast(count)) + mAnimation?.setVisibleCount(mVisibleItemCount) + } + + /** + * 获取recyclerView 静止时候可见的itemView 个数. + * @return 静止时候可见的itemView 个数,默认为3. + */ + fun getVisibleItemCount(): Int { + return mVisibleItemCount + } + + /** + * 设置 item 偏移值,即第 i 个 item 相对于 第 i-1个 item 在水平方向的偏移值,默认是40px. + * @param offset 每个 item 相对于前一个的偏移值. + */ + fun setItemOffset(offset: Int) { + mLayout?.setItemOffset(offset) + } + + /** + * 获取每个 item 相对于前一个的水平偏移值. + * @return 每个 item 相对于前一个的水平偏移值. + */ + fun getItemOffset(): Int { + return if (mLayout == null) { + 0 + } else { + mLayout!!.getItemOffset() + } + } + + /** + * 设置item 移动动画. + * @param animation item 移动动画. + */ + fun setAnimation(animation: StackAnimation) { + mAnimation = animation + } + + /** + * 获取 item 移动动画. + * @return item 移动动画. + */ + fun getAnimation(): StackAnimation? { + return mAnimation + } + + /** + * 获取StackLayoutManager 的滚动方向. + * @return StackLayoutManager 的滚动方向. + */ + fun getScrollOrientation(): ScrollOrientation { + return mScrollOrientation + } + + /** + * 返回第一个可见 itemView 的位置. + * @return 返回第一个可见 itemView 的位置. + */ + fun getFirstVisibleItemPosition(): Int { + if (width == 0 || height == 0) { + return 0 + } + return when(mScrollOrientation) { + ScrollOrientation.RIGHT_TO_LEFT -> floor((mScrollOffset * 1.0 / width)).toInt() + ScrollOrientation.LEFT_TO_RIGHT -> itemCount - 1 - ceil((mScrollOffset * 1.0 / width)).toInt() + ScrollOrientation.BOTTOM_TO_TOP -> floor((mScrollOffset * 1.0 / height)).toInt() + ScrollOrientation.TOP_TO_BOTTOM -> itemCount - 1 - ceil((mScrollOffset * 1.0 / height)).toInt() + } + } + + /** + * 设置 item 位置改变时触发的回调 + */ + fun setItemChangedListener(listener: ItemChangedListener) { + itemChangedListener = listener + } + +// constructor(scrollOrientation: ScrollOrientation) : this(scrollOrientation, 3, DefaultAnimation::class.java, DefaultLayout::class.java) +// +// constructor(scrollOrientation: ScrollOrientation, visibleCount: Int) : this(scrollOrientation, visibleCount, DefaultAnimation::class.java, DefaultLayout::class.java) + +// constructor() : this(ScrollOrientation.RIGHT_TO_LEFT) + + init { + mScrollOffset = when(mScrollOrientation) { + ScrollOrientation.RIGHT_TO_LEFT, ScrollOrientation.BOTTOM_TO_TOP -> 0 + else -> Int.MAX_VALUE + } + + if (StackAnimation::class.java.isAssignableFrom(animation)) { + try { + val cla = animation.getDeclaredConstructor(ScrollOrientation::class.java, Int::class.javaPrimitiveType) + mAnimation = cla.newInstance(scrollOrientation, visibleCount) as StackAnimation + } catch (e: Exception) { + e.printStackTrace() + } + } + if (StackLayout::class.java.isAssignableFrom(layout)) { + try { + val cla = layout.getDeclaredConstructor(ScrollOrientation::class.java, Int::class.javaPrimitiveType, Int::class.javaPrimitiveType) + mLayout = cla.newInstance(scrollOrientation, visibleCount, 30) as StackLayout + } catch (e: Exception) { + e.printStackTrace() + } + } + } + + override fun generateDefaultLayoutParams(): LayoutParams { + return LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, + ViewGroup.LayoutParams.WRAP_CONTENT) + } + + override fun onAttachedToWindow(view: RecyclerView) { + super.onAttachedToWindow(view) + mOnFlingListener = object : OnFlingListener() { + override fun onFling(velocityX: Int, velocityY: Int): Boolean { + if (mPagerMode) { + when(mScrollOrientation) { + ScrollOrientation.RIGHT_TO_LEFT, ScrollOrientation.LEFT_TO_RIGHT -> { + mFlingOrientation = when { + velocityX > mPagerFlingVelocity -> FlingOrientation.RIGHT_TO_LEFT + velocityX < -mPagerFlingVelocity -> FlingOrientation.LEFT_TO_RIGHT + else -> FlingOrientation.NONE + } + if (mScrollOffset in 1 until width * (itemCount - 1)) { //边界不需要滚动 + mFixScrolling = true + } + } + else -> { + mFlingOrientation = when { + velocityY > mPagerFlingVelocity -> FlingOrientation.BOTTOM_TO_TOP + velocityY < -mPagerFlingVelocity -> FlingOrientation.TOP_TO_BOTTOM + else -> FlingOrientation.NONE + } + if (mScrollOffset in 1 until width * (itemCount - 1)) { //边界不需要滚动 + mFixScrolling = true + } + } + } + calculateAndScrollToTarget(view) + } + else { + Utils.log("$velocityX $velocityY") + } + return mPagerMode + } + } + view.onFlingListener = mOnFlingListener + + mOnScrollListener = object : OnScrollListener() { + override fun onScrollStateChanged(recyclerView: RecyclerView, newState: Int) { + if (newState == SCROLL_STATE_IDLE) { + isFlinging = false + if (!mFixScrolling) { + mFixScrolling = true + calculateAndScrollToTarget(view) + } else { + //表示此次 IDLE 是由修正位置结束触发的 + mFixScrolling = false + } + } else if (newState == SCROLL_STATE_DRAGGING) { + mFixScrolling = false + isFlinging = false + } else if (newState == SCROLL_STATE_SETTLING) { + isFlinging = true + } + } + } + view.addOnScrollListener(mOnScrollListener) + } + + override fun onDetachedFromWindow(view: RecyclerView?, recycler: RecyclerView.Recycler?) { + super.onDetachedFromWindow(view, recycler) + if (view?.onFlingListener == mOnFlingListener) { + view.onFlingListener = null + } + view?.removeOnScrollListener(mOnScrollListener) + } + + override fun canScrollHorizontally(): Boolean { + if (itemCount == 0) { + return false + } + return when (mScrollOrientation) { + ScrollOrientation.LEFT_TO_RIGHT, ScrollOrientation.RIGHT_TO_LEFT -> true + else -> false + } + } + + override fun canScrollVertically(): Boolean { + if (itemCount == 0) { + return false + } + return when (mScrollOrientation) { + ScrollOrientation.TOP_TO_BOTTOM, ScrollOrientation.BOTTOM_TO_TOP -> true + else -> false + } + } + + override fun onLayoutChildren(recycler: RecyclerView.Recycler, state: State) { + + mLayout?.requestLayout() + + removeAndRecycleAllViews(recycler) + + if (itemCount > 0) { + mScrollOffset = getValidOffset(mScrollOffset) + loadItemView(recycler) + } + } + + override fun scrollHorizontallyBy(dx: Int, recycler: RecyclerView.Recycler, state: State): Int { + return handleScrollBy(dx, recycler) + } + + override fun scrollVerticallyBy(dy: Int, recycler: RecyclerView.Recycler, state: State?): Int { + return handleScrollBy(dy, recycler) + } + + override fun scrollToPosition(position: Int) { + if (position < 0 || position >= itemCount) { + throw ArrayIndexOutOfBoundsException("$position is out of bound [0..$itemCount-1]") + } + if (position < 0) { + throw ArrayIndexOutOfBoundsException("$position is out of bound [0..$itemCount-1]") + } + mScrollOffset = getPositionOffset(position) + requestLayout() + } + + override fun smoothScrollToPosition(recyclerView: RecyclerView, state: State?, position: Int) { + if (position < 0 || position >= itemCount) { + throw ArrayIndexOutOfBoundsException("$position is out of bound [0..$itemCount-1]") + } + if (position < 0) { + throw ArrayIndexOutOfBoundsException("$position is out of bound [0..$itemCount-1]") + } + mFixScrolling = true + scrollToCenter(position, recyclerView, true) + } + + private fun updatePositionRecordAndNotify(position: Int) { + if (itemChangedListener == null) { + return + } + if (position != itemPosition) { + isItemPositionChanged = true + itemPosition = position + itemChangedListener?.onItemChanged(itemPosition) + } else { + isItemPositionChanged = false + } + } + + private fun handleScrollBy(offset: Int, recycler: RecyclerView.Recycler): Int { + //期望值,不得超过最大最小值,所以期望值不一定等于实际值 + val expectOffset = mScrollOffset + offset + //实际值 + mScrollOffset = getValidOffset(expectOffset) + + //实际偏移,超过最大最小值之后的偏移都应该是0,该值作为返回值,否则在极限位置进行滚动的时候不会出现弹性阴影 + val exactMove = mScrollOffset - expectOffset + offset + + if (exactMove == 0) { + //itemViews 位置都不会改变,直接 return + return 0 + } + + detachAndScrapAttachedViews(recycler) + + loadItemView(recycler) + + return offset + } + + private fun loadItemView(recycler: RecyclerView.Recycler) { + val firstVisiblePosition = getFirstVisibleItemPosition() + val lastVisiblePosition = getLastVisibleItemPosition() + + //位移百分比 + val movePercent = getFirstVisibleItemMovePercent() + + for (i in lastVisiblePosition downTo firstVisiblePosition) { + val view = recycler.getViewForPosition(i) + view.layoutParams = view.layoutParams.apply { width = DisplayUtils.getScreenWidth() - 50F.dip2px() } + //添加到recycleView 中 + addView(view) + //测量 + measureChild(view, 0, 0) + //布局 + mLayout?.doLayout(this, mScrollOffset, movePercent, view, i - firstVisiblePosition) + //做动画 + mAnimation?.doAnimation(movePercent, view, i - firstVisiblePosition) + } + + //尝试更新当前item的位置并通知外界 + updatePositionRecordAndNotify(firstVisiblePosition) + + //重用 + if (firstVisiblePosition - 1 >= 0) { + val view = recycler.getViewForPosition(firstVisiblePosition - 1) + resetViewAnimateProperty(view) + removeAndRecycleView(view, recycler) + } + if (lastVisiblePosition + 1 < itemCount) { + val view = recycler.getViewForPosition(lastVisiblePosition + 1) + resetViewAnimateProperty(view) + removeAndRecycleView(view, recycler) + } + } + + private fun resetViewAnimateProperty(view: View) { + view.rotationY = 0f + view.rotationX = 0f + view.scaleX = 1f + view.scaleY = 1f + view.alpha = 1f + } + + private fun calculateAndScrollToTarget(view: RecyclerView) { + val targetPosition = calculateCenterPosition(getFirstVisibleItemPosition()) + scrollToCenter(targetPosition, view, true) + } + + private fun scrollToCenter(targetPosition: Int, recyclerView: RecyclerView, animation: Boolean) { + val targetOffset = getPositionOffset(targetPosition) + when(mScrollOrientation) { + ScrollOrientation.LEFT_TO_RIGHT, ScrollOrientation.RIGHT_TO_LEFT -> { + if (animation) { + recyclerView.smoothScrollBy(targetOffset - mScrollOffset, 0) + } else { + recyclerView.scrollBy(targetOffset - mScrollOffset, 0) + } + } + else -> { + if (animation) { + recyclerView.smoothScrollBy(0, targetOffset - mScrollOffset) + } else { + recyclerView.scrollBy(0, targetOffset - mScrollOffset) + } + } + } + } + + private fun getValidOffset(expectOffset: Int): Int { + val offset = (width * (itemCount - 1)).coerceAtMost(expectOffset).coerceAtLeast(0) + return when(mScrollOrientation) { + ScrollOrientation.RIGHT_TO_LEFT, ScrollOrientation.LEFT_TO_RIGHT -> offset + else -> (height * (itemCount - 1)).coerceAtMost(expectOffset).coerceAtLeast(0) + } + } + + private fun getPositionOffset(position: Int): Int { + return when(mScrollOrientation) { + ScrollOrientation.RIGHT_TO_LEFT -> position * width + ScrollOrientation.LEFT_TO_RIGHT -> (itemCount - 1 - position) * width + ScrollOrientation.BOTTOM_TO_TOP -> position * height + ScrollOrientation.TOP_TO_BOTTOM -> (itemCount - 1 - position) * height + } + } + + private fun getLastVisibleItemPosition(): Int { + val firstVisiblePosition = getFirstVisibleItemPosition() + return if (firstVisiblePosition + mVisibleItemCount > itemCount - 1) { + itemCount - 1 + } else { + firstVisiblePosition + mVisibleItemCount + } + } + + private fun getFirstVisibleItemMovePercent(): Float { + if (width == 0 || height == 0) { + return 0f + } + return when (mScrollOrientation) { + ScrollOrientation.RIGHT_TO_LEFT -> (mScrollOffset % width) * 1.0f / width + ScrollOrientation.LEFT_TO_RIGHT -> { + val targetPercent = 1 - (mScrollOffset % width) * 1.0f / width + return if (targetPercent == 1f) { + 0f + } else { + targetPercent + } + } + ScrollOrientation.BOTTOM_TO_TOP -> (mScrollOffset % height) * 1.0f / height + ScrollOrientation.TOP_TO_BOTTOM -> { + val targetPercent = 1 - (mScrollOffset % height) * 1.0f / height + return if (targetPercent == 1f) { + 0f + } else { + targetPercent + } + } + } + } + + private fun calculateCenterPosition(position: Int): Int { + //当是 Fling 触发的时候 + val triggerOrientation = mFlingOrientation + mFlingOrientation = FlingOrientation.NONE + when(mScrollOrientation) { + ScrollOrientation.RIGHT_TO_LEFT -> { + if (triggerOrientation == FlingOrientation.RIGHT_TO_LEFT) { + return position + 1 + } else if (triggerOrientation == FlingOrientation.LEFT_TO_RIGHT) { + return position + } + } + ScrollOrientation.LEFT_TO_RIGHT -> { + if (triggerOrientation == FlingOrientation.LEFT_TO_RIGHT) { + return position + 1 + } else if (triggerOrientation == FlingOrientation.RIGHT_TO_LEFT) { + return position + } + } + ScrollOrientation.BOTTOM_TO_TOP -> { + if (triggerOrientation == FlingOrientation.BOTTOM_TO_TOP) { + return position + 1 + } else if (triggerOrientation == FlingOrientation.TOP_TO_BOTTOM) { + return position + } + } + ScrollOrientation.TOP_TO_BOTTOM -> { + if (triggerOrientation == FlingOrientation.TOP_TO_BOTTOM) { + return position + 1 + } else if (triggerOrientation == FlingOrientation.BOTTOM_TO_TOP) { + return position + } + } + } + + //当不是 fling 触发的时候 + val percent = getFirstVisibleItemMovePercent() + //向左移动超过50% position(firstVisibleItemPosition)++ + //否 position不变 + return if (percent < 0.5) { + position + } else { + position + 1 + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/gh/gamecenter/gamecollection/square/GameCollectionAmwayAdapter.kt b/app/src/main/java/com/gh/gamecenter/gamecollection/square/GameCollectionAmwayAdapter.kt new file mode 100644 index 0000000000..dd8ec0761b --- /dev/null +++ b/app/src/main/java/com/gh/gamecenter/gamecollection/square/GameCollectionAmwayAdapter.kt @@ -0,0 +1,51 @@ +package com.gh.gamecenter.gamecollection.square + +import android.content.Context +import android.view.ViewGroup +import androidx.recyclerview.widget.RecyclerView +import com.gh.gamecenter.databinding.GameCollectionAmwayContentItemBinding +import com.gh.gamecenter.entity.AmwayCommentEntity +import com.lightgame.adapter.BaseRecyclerAdapter + +class GameCollectionAmwayAdapter(context: Context) : + BaseRecyclerAdapter(context) { + + private var mAmwayList = ArrayList() + + fun setAmwayList(amwayList: ArrayList) { + mAmwayList = amwayList + notifyDataSetChanged() + } + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int) = + GameCollectionAmwayContentItemViewHolder(GameCollectionAmwayContentItemBinding.inflate(mLayoutInflater, parent, false)) + + override fun getItemCount(): Int = if (getRealCount() > 1) getRealCount() + INCREASE_COUNT else getRealCount() + + override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) { + if (holder is GameCollectionAmwayContentItemViewHolder) { + holder.binding.entity = mAmwayList[getRealPosition(position)] + } + } + + class GameCollectionAmwayContentItemViewHolder(var binding: GameCollectionAmwayContentItemBinding) : + RecyclerView.ViewHolder(binding.root) + + fun getRealCount(): Int = mAmwayList.size + + fun getRealPosition(position: Int) = when (position) { + 0 -> { + getRealCount() - 1 + } + getRealCount() + 1 -> { + 0 + } + else -> { + position - 1 + } + } + + companion object{ + const val INCREASE_COUNT = 2 + } +} \ No newline at end of file diff --git a/app/src/main/java/com/gh/gamecenter/gamecollection/square/GameCollectionAmwayViewHolder.kt b/app/src/main/java/com/gh/gamecenter/gamecollection/square/GameCollectionAmwayViewHolder.kt new file mode 100644 index 0000000000..479a51ad92 --- /dev/null +++ b/app/src/main/java/com/gh/gamecenter/gamecollection/square/GameCollectionAmwayViewHolder.kt @@ -0,0 +1,111 @@ +package com.gh.gamecenter.gamecollection.square + +import android.animation.Animator +import android.animation.TimeInterpolator +import android.animation.ValueAnimator +import android.view.animation.AccelerateDecelerateInterpolator +import androidx.recyclerview.widget.RecyclerView +import androidx.viewpager2.widget.ViewPager2 +import com.gh.common.util.DirectUtils +import com.gh.gamecenter.databinding.GameCollectionSquareAmwayItemBinding +import java.lang.ref.WeakReference + +class GameCollectionAmwayViewHolder(var binding: GameCollectionSquareAmwayItemBinding) : RecyclerView.ViewHolder(binding.root) { + val mAdapter = GameCollectionAmwayAdapter(binding.root.context).apply { registerAdapterDataObserver(object : RecyclerView.AdapterDataObserver() { + override fun onChanged() { + if (itemCount <= 1) { + stop() + } else { + start() + } + } + }) } + val mLoopTask = object : Runnable { + private val reference: WeakReference = WeakReference(binding.amwayVp) + override fun run() { + val vp: ViewPager2? = reference.get() + if (vp != null) { + val count = mAdapter.itemCount + if (count == 0) return + val next = (vp.currentItem + 1) % count + vp.setCurrentItem(next, 1000) + vp.postDelayed(this, GameCollectionSquareAdapter.AMWAY_LOOP_TIME) + } + } + } + + + fun bindAmway() { + binding.amwayVp.run { + if (adapter is GameCollectionAmwayAdapter) return + isUserInputEnabled = false + adapter = mAdapter + orientation = ViewPager2.ORIENTATION_VERTICAL + registerOnPageChangeCallback(object : ViewPager2.OnPageChangeCallback() { + private var mTempPosition = GameCollectionSquareAdapter.INVALID_VALUE + private var isScrolled = false + + override fun onPageSelected(position: Int) { + if (isScrolled) { + mTempPosition = position + } + } + + override fun onPageScrollStateChanged(state: Int) { + //手势滑动中,代码执行滑动中 + if (state == ViewPager2.SCROLL_STATE_DRAGGING || state == ViewPager2.SCROLL_STATE_SETTLING) { + isScrolled = true + } else if (state == ViewPager2.SCROLL_STATE_IDLE) { + //滑动闲置或滑动结束 + isScrolled = false + if (mTempPosition != GameCollectionSquareAdapter.INVALID_VALUE) { + if (mTempPosition == 0) { + setCurrentItem(mAdapter.getRealCount(), false) + } else if (mTempPosition == mAdapter.itemCount - 1) { + setCurrentItem(1, false) + } + } + } + } + }) + setCurrentItem(1, false) + postDelayed(mLoopTask, GameCollectionSquareAdapter.AMWAY_LOOP_TIME) + } + binding.root.setOnClickListener { DirectUtils.directToAmway(binding.root.context) } + } + + fun start() { + stop() + binding.amwayVp.postDelayed(mLoopTask, GameCollectionSquareAdapter.AMWAY_LOOP_TIME) + } + + fun stop() { + binding.amwayVp.removeCallbacks(mLoopTask) + } + + fun ViewPager2.setCurrentItem( + item: Int, + duration: Long, + interpolator: TimeInterpolator = AccelerateDecelerateInterpolator(), + pagePxHeight: Int = height + ) { + val pxToDrag: Int = pagePxHeight * (item - currentItem) + val animator = ValueAnimator.ofInt(0, pxToDrag) + var previousValue = 0 + animator.addUpdateListener { valueAnimator -> + val currentValue = valueAnimator.animatedValue as Int + val currentPxToDrag = (currentValue - previousValue).toFloat() + fakeDragBy(-currentPxToDrag) + previousValue = currentValue + } + animator.addListener(object : Animator.AnimatorListener { + override fun onAnimationStart(animation: Animator?) { beginFakeDrag() } + override fun onAnimationEnd(animation: Animator?) { endFakeDrag() } + override fun onAnimationCancel(animation: Animator?) { } + override fun onAnimationRepeat(animation: Animator?) { } + }) + animator.interpolator = interpolator + animator.duration = duration + animator.start() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/gh/gamecenter/gamecollection/square/GameCollectionSquareActivity.kt b/app/src/main/java/com/gh/gamecenter/gamecollection/square/GameCollectionSquareActivity.kt new file mode 100644 index 0000000000..d61d327fba --- /dev/null +++ b/app/src/main/java/com/gh/gamecenter/gamecollection/square/GameCollectionSquareActivity.kt @@ -0,0 +1,23 @@ +package com.gh.gamecenter.gamecollection.square + +import android.os.Bundle +import com.gh.base.BaseActivity +import com.gh.common.util.DisplayUtils +import com.gh.gamecenter.R + +class GameCollectionSquareActivity : BaseActivity() { + override fun getLayoutId(): Int { + return R.layout.activity_amway + } + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + + DisplayUtils.transparentStatusBar(this) + + val containerFragment = supportFragmentManager.findFragmentByTag( + GameCollectionSquareFragment::class.java.simpleName) + ?: GameCollectionSquareFragment().with(intent.extras) + supportFragmentManager.beginTransaction().replace(R.id.placeholder, containerFragment, GameCollectionSquareFragment::class.java.simpleName).commitAllowingStateLoss() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/gh/gamecenter/gamecollection/square/GameCollectionSquareAdapter.kt b/app/src/main/java/com/gh/gamecenter/gamecollection/square/GameCollectionSquareAdapter.kt new file mode 100644 index 0000000000..98d2c8e3df --- /dev/null +++ b/app/src/main/java/com/gh/gamecenter/gamecollection/square/GameCollectionSquareAdapter.kt @@ -0,0 +1,128 @@ +package com.gh.gamecenter.gamecollection.square + +import android.content.Context +import android.view.ViewGroup +import androidx.core.content.ContextCompat +import androidx.recyclerview.widget.RecyclerView +import com.gh.common.constant.ItemViewType +import com.gh.common.exposure.ExposureEvent +import com.gh.common.exposure.ExposureSource +import com.gh.common.exposure.IExposable +import com.gh.common.util.DisplayUtils +import com.gh.common.util.toDrawable +import com.gh.gamecenter.R +import com.gh.gamecenter.adapter.viewholder.FooterViewHolder +import com.gh.gamecenter.baselist.ListAdapter +import com.gh.gamecenter.databinding.GameCollectionSquareAmwayItemBinding +import com.gh.gamecenter.databinding.GameCollectionSquareItemBinding +import com.gh.gamecenter.entity.GamesCollectionEntity + +class GameCollectionSquareAdapter( + context: Context, + private val isHome: Boolean = false, + private val mViewModel: GameCollectionSquareViewModel, + private var basicExposureSource: List +) : + ListAdapter(context), IExposable { + + override fun getItemViewType(position: Int): Int { + return if (isHome && position == 0) ItemViewType.ITEM_HEADER else if (position == itemCount - 1) ItemViewType.ITEM_FOOTER else ItemViewType.ITEM_BODY + } + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder { + return when (viewType) { + ItemViewType.ITEM_HEADER -> { + GameCollectionAmwayViewHolder( + GameCollectionSquareAmwayItemBinding.bind( + mLayoutInflater.inflate( + R.layout.game_collection_square_amway_item, + parent, + false + ) + ) + ) + } + + ItemViewType.ITEM_BODY -> { + GameCollectionSquareItemViewHolder( + GameCollectionSquareItemBinding.bind( + mLayoutInflater.inflate( + R.layout.game_collection_square_item, + parent, + false + ) + ) + ) + } + + ItemViewType.ITEM_FOOTER -> FooterViewHolder( + mLayoutInflater.inflate( + R.layout.refresh_footerview, + parent, + false + ) + ) + + else -> GameCollectionSquareItemViewHolder( + GameCollectionSquareItemBinding.bind( + mLayoutInflater.inflate( + R.layout.game_collection_square_item, + parent, + false + ) + ) + ) + } + } + + override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) { + when (holder) { + is GameCollectionAmwayViewHolder -> { + holder.bindAmway() + } + is GameCollectionSquareItemViewHolder -> { + val realPosition = if (isHome) position - 1 else position + holder.bindGameCollection(mEntityList[realPosition]) + } + is FooterViewHolder -> { + holder.initItemPadding() + holder.initFooterViewHolder(mViewModel, mIsLoading, mIsNetworkError, mIsOver) + holder.hint.setTextColor(ContextCompat.getColor(mContext, R.color.text_B3B3B3)) + val lp = holder.itemView.layoutParams as RecyclerView.LayoutParams + lp.height = DisplayUtils.dip2px(48F) + lp.width = ViewGroup.LayoutParams.MATCH_PARENT + holder.itemView.layoutParams = lp + } + } + } + + override fun getItemCount() = if (mEntityList.isNullOrEmpty()) 0 else if (isHome) mEntityList.size + 2 else mEntityList.size + 1 + + class GameCollectionSquareItemViewHolder(var binding: GameCollectionSquareItemBinding) : + RecyclerView.ViewHolder(binding.root) { + fun bindGameCollection(gamesCollectionEntity: GamesCollectionEntity) { + binding.run { + entity = gamesCollectionEntity + stampIv.setImageDrawable(if (gamesCollectionEntity.stamp == "offical") R.drawable.ic_official.toDrawable() else R.drawable.ic_chosen.toDrawable()) + } + } + } + + companion object { + const val INVALID_VALUE = -1 + + // 安利墙卡片轮播时间 + const val AMWAY_LOOP_TIME = 5000L + } + + override fun getEventByPosition(pos: Int): ExposureEvent? { +// return mEntityList[pos].exposureEvent + return null + } + + override fun getEventListByPosition(pos: Int): List? { +// return mEntityList[pos].exposureEventList + return null + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/gh/gamecenter/gamecollection/square/GameCollectionSquareFragment.kt b/app/src/main/java/com/gh/gamecenter/gamecollection/square/GameCollectionSquareFragment.kt new file mode 100644 index 0000000000..f662d4c641 --- /dev/null +++ b/app/src/main/java/com/gh/gamecenter/gamecollection/square/GameCollectionSquareFragment.kt @@ -0,0 +1,313 @@ +package com.gh.gamecenter.gamecollection.square + +import android.content.Intent +import android.os.Bundle +import android.view.View +import android.view.ViewGroup +import androidx.core.view.ViewCompat +import androidx.recyclerview.widget.RecyclerView +import com.gh.common.TimeElapsedHelper +import com.gh.common.exposure.ExposureListener +import com.gh.common.exposure.ExposureSource +import com.gh.common.util.* +import com.gh.common.view.VerticalItemDecoration +import com.gh.download.DownloadManager +import com.gh.gamecenter.R +import com.gh.gamecenter.baselist.LazyListFragment +import com.gh.gamecenter.baselist.ListAdapter +import com.gh.gamecenter.databinding.FragmentGameCollectionSquareAlBinding +import com.gh.gamecenter.databinding.FragmentGameCollectionSquareBinding +import com.gh.gamecenter.entity.GamesCollectionEntity +import com.gh.gamecenter.eventbus.EBDownloadStatus +import com.gh.gamecenter.eventbus.EBPackage +import com.gh.gamecenter.eventbus.EBReuse +import com.gh.gamecenter.gamecollection.publish.GameCollectionEditActivity +import com.gh.gamecenter.gamecollection.tag.GameCollectionTagSelectActivity +import com.gh.gamecenter.personal.PersonalFragment +import com.google.android.material.appbar.AppBarLayout +import com.lightgame.download.DataWatcher +import com.lightgame.download.DownloadEntity +import org.greenrobot.eventbus.Subscribe +import org.greenrobot.eventbus.ThreadMode +import kotlin.math.abs + +class GameCollectionSquareFragment : LazyListFragment() { + private lateinit var mViewModel: GameCollectionSquareViewModel + private val mElapsedHelper by lazy { TimeElapsedHelper() } + private lateinit var mExposureListener: ExposureListener + + private lateinit var mDefaultBinding: FragmentGameCollectionSquareBinding + private lateinit var mAlternativeBinding: FragmentGameCollectionSquareAlBinding + + private var mAdapter: GameCollectionSquareAdapter? = null + + private var mUseAlternativeLayout = false + + private val dataWatcher = object : DataWatcher() { + override fun onDataChanged(downloadEntity: DownloadEntity) { +// mAdapter?.notifyItemByDownload(downloadEntity) + +// if (downloadEntity.meta[XapkInstaller.XAPK_UNZIP_STATUS] == XapkUnzipStatus.FAILURE.name) { +// showUnzipFailureDialog(downloadEntity) +// } + } + } + + override fun onCreate(savedInstanceState: Bundle?) { + mUseAlternativeLayout = arguments?.getBoolean(EntranceUtils.KEY_IS_HOME, false) ?: false + super.onCreate(savedInstanceState) + } + + override fun getLayoutId() = R.layout.fragment_stub + + override fun getRealLayoutId(): Int { + return if (mUseAlternativeLayout) R.layout.fragment_game_collection_square_al else R.layout.fragment_game_collection_square + } + + override fun onFragmentFirstVisible() { + super.onFragmentFirstVisible() + mViewModel.initData() + mViewModel.entrance = mEntrance + } + + override fun onRealLayoutInflated(inflatedView: View) { + super.onRealLayoutInflated(inflatedView) + if (mUseAlternativeLayout) { + mAlternativeBinding = FragmentGameCollectionSquareAlBinding.bind(inflatedView) + } else { + mDefaultBinding = FragmentGameCollectionSquareBinding.bind(inflatedView) + } + } + + override fun initRealView() { + super.initRealView() + + mExposureListener = ExposureListener(this, mAdapter!!) + mListRv.addOnScrollListener(mExposureListener) + + if (!mUseAlternativeLayout) { + initDefaultLayout() + } else { + initAlternativeLayout() + } + } + + override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { + super.onActivityResult(requestCode, resultCode, data) + if (requestCode == REQUEST_SELECT_TAG) { + val tagName = data?.getStringExtra("tagName") + mDefaultBinding.tagTv.text = tagName ?: "标签筛选" + } + } + + override fun provideListViewModel(): GameCollectionSquareViewModel { + mViewModel = viewModelProvider() + return mViewModel + } + + override fun getItemDecoration() = VerticalItemDecoration(context, 16F, false, R.color.white) + + override fun provideListAdapter(): ListAdapter<*> { + if (mAdapter == null) { + val basicExposureSource = arrayListOf().apply { + arguments?.getParcelable(EntranceUtils.KEY_EXPOSURE_SOURCE)?.let { + add(it) + } + add(ExposureSource("游戏单广场", "")) + } + mAdapter = GameCollectionSquareAdapter(requireContext(), mUseAlternativeLayout, mViewModel, basicExposureSource) + } + return mAdapter!! + } + + override fun isAutomaticLoad() = false + + private fun initDefaultLayout() { + // toolbar 消费 fitsSystemWindows 避免在 collapsingToolbar 下面出现多出来的 padding + // [https://stackoverflow.com/questions/48137666/viewgroup-inside-collapsingtoolbarlayout-show-extra-bottom-padding-when-set-fits] + ViewCompat.setOnApplyWindowInsetsListener(mDefaultBinding.appbar) { _, insets -> + (mDefaultBinding.toolbar.layoutParams as ViewGroup.MarginLayoutParams).topMargin = insets.systemWindowInsetTop + insets.consumeSystemWindowInsets() + } + + val collapsingTrigger = 66F.dip2px() + DisplayUtils.getStatusBarHeight(context?.resources) + + mDefaultBinding.toolbar.setNavigationOnClickListener { requireActivity().finish() } + + mDefaultBinding.collapsingToolbar.scrimVisibleHeightTrigger = collapsingTrigger + mDefaultBinding.collapsingToolbar.scrimShownAction = { + DisplayUtils.setLightStatusBar(requireActivity(), it) + if (it) { + mDefaultBinding.titleTv.alpha = 1F + mDefaultBinding.titleTv.visibility = View.VISIBLE + mDefaultBinding.titleTv.setTextColor(R.color.black.toColor()) + mDefaultBinding.toolbar.navigationIcon = R.drawable.ic_bar_back.toDrawable() + } else { + mDefaultBinding.titleTv.visibility = View.GONE + mDefaultBinding.toolbar.navigationIcon = R.drawable.ic_bar_back_light.toDrawable() + } + } + + mDefaultBinding.titleTv.setOnClickListener { + if (ClickUtils.isFastDoubleClick(mDefaultBinding.titleTv.id, 300)) { + scrollToTop() + } + } + + mDefaultBinding.appbar.addOnOffsetChangedListener(AppBarLayout.OnOffsetChangedListener { _, verticalOffset -> + val absOffset = abs(verticalOffset) + val invisibleOffset = DisplayUtils.dip2px(30F) + + if (absOffset <= invisibleOffset) { + mDefaultBinding.titleTv.alpha = 1 - (absOffset.toFloat() / invisibleOffset) + } else { + mDefaultBinding.titleTv.alpha = 0F + } + + mListRefresh?.isEnabled = absOffset <= 2 + }) + + mDefaultBinding.orderRg.setOnCheckedChangeListener { _, checkedId -> + if (checkedId == R.id.hotRb) { + // 热门排序 + // TODO 热门排序 + } else { + // 最新排序 + // TODO 最新排序 + } + } + + mDefaultBinding.fab.setOnClickListener { + // 创建游戏单 + ifLogin(mEntrance) { + showRegulationTestDialogIfNeeded { + startActivity(GameCollectionEditActivity.getIntent(requireContext())) + } + } + } + + mDefaultBinding.tagFilter.setOnClickListener { + startActivityForResult(GameCollectionTagSelectActivity.getIntent(requireContext(), true), REQUEST_SELECT_TAG) + } + + mListRefresh?.setProgressViewOffset(false, 0, 118F.dip2px() + DisplayUtils.getStatusBarHeight(requireContext().resources)) +// mSkeletonScreen = Skeleton.bind(mDefaultBinding?.skeletonPlaceholder).shimmer(false).load(R.layout.fragment_amway_skeleton).show() + } + + private fun initAlternativeLayout() { + mAlternativeBinding.fab.setOnClickListener { + // 创建游戏单 + ifLogin(mEntrance) { + showRegulationTestDialogIfNeeded { + startActivity(GameCollectionEditActivity.getIntent(requireContext())) + } + } + } +// mAlternativeBinding.listRv.addOnScrollListener(object : RecyclerView.OnScrollListener() { +// override fun onScrolled(recyclerView: RecyclerView, dx: Int, dy: Int) { +// super.onScrolled(recyclerView, dx, dy) +// val scrollY = recyclerView.computeVerticalScrollOffset() +// } +// }) + +// mSkeletonScreen = Skeleton.bind(mAlternativeBinding?.skeletonPlaceholder).shimmer(false).load( +// R.layout.fragment_amway_skeleton_al).show() + } + + override fun onFragmentPause() { + super.onPause() + DownloadManager.getInstance(context).removeObserver(dataWatcher) + +// mElapsedHelper.pauseCounting() + } + + override fun onResume() { +// if (isEverPause) mAdapter?.notifyDataSetChanged() + super.onResume() + } + + override fun onFragmentResume() { + super.onFragmentResume() + DownloadManager.getInstance(context).addObserver(dataWatcher) + +// mElapsedHelper.resetCounting() +// mElapsedHelper.resumeCounting() + } + + override fun onLoadEmpty() { + super.onLoadEmpty() + if (!mUseAlternativeLayout) mDefaultBinding.tagFilterContainer.visibility = View.GONE + } + + override fun onLoadDone() { + super.onLoadDone() + if (!mUseAlternativeLayout) mDefaultBinding.tagFilterContainer.visibility = View.VISIBLE + } + + override fun onLoadError() { + super.onLoadError() + if (!mUseAlternativeLayout) mDefaultBinding.tagFilterContainer.visibility = View.GONE + } + + override fun onLoadRefresh() { + super.onLoadRefresh() + if (!mUseAlternativeLayout) mDefaultBinding.tagFilterContainer.visibility = View.GONE + } + + private fun scrollToTop() { + val firstItemPosition = mLayoutManager.findFirstVisibleItemPosition() + if (firstItemPosition >= 10) { + mListRv.scrollToPosition(6) + } + mListRv.smoothScrollToPosition(0) + mDefaultBinding.appbar.setExpanded(true) + } + + + //下载被删除事件 + @Subscribe(threadMode = ThreadMode.MAIN) + fun onEventMainThread(status: EBDownloadStatus) { + if ("delete" == status.status) { +// mAdapter?.notifyItemAndRemoveDownload(status) + } + } + + //安装、卸载事件 + @Subscribe(threadMode = ThreadMode.MAIN) + fun onEventMainThread(busFour: EBPackage) { +// val data = mAdapter?.getGameEntityByPackage(busFour.packageName) ?: arrayListOf() +// for (gameAndPosition in data) { +// mAdapter?.notifyChildItem(gameAndPosition.position) +// } + } + + @Subscribe(threadMode = ThreadMode.MAIN) + fun onEventMainThread(reuse: EBReuse) { + if ("Refresh" == reuse.type) { +// mAdapter?.notifyDataSetChanged() + } else if (reuse.type == PersonalFragment.LOGIN_TAG) { // 登入 + scrollToTop() + onRefresh() +// mViewModel.initData(false) + } + } + + fun showUnzipFailureDialog(downloadEntity: DownloadEntity) { +// val data = mAdapter?.getGameEntityByPackage(downloadEntity.packageName) ?: return +// for (gameAndPosition in data) { +// val targetView = mLayoutManager.findViewByPosition(gameAndPosition.position) +// if (targetView != null) { +// if (targetView is RecyclerView) { +// // todo 如果时竖向专题该怎么判断? +// } else { +// DialogUtils.showUnzipFailureDialog(requireContext(), downloadEntity) +// return +// } +// } +// } + } + + companion object { + const val REQUEST_SELECT_TAG = 100 + } +} \ No newline at end of file diff --git a/app/src/main/java/com/gh/gamecenter/gamecollection/square/GameCollectionSquareViewModel.kt b/app/src/main/java/com/gh/gamecenter/gamecollection/square/GameCollectionSquareViewModel.kt new file mode 100644 index 0000000000..82d5a8ce9a --- /dev/null +++ b/app/src/main/java/com/gh/gamecenter/gamecollection/square/GameCollectionSquareViewModel.kt @@ -0,0 +1,31 @@ +package com.gh.gamecenter.gamecollection.square + +import android.app.Application +import com.gh.gamecenter.baselist.ListViewModel +import com.gh.gamecenter.entity.GamesCollectionEntity +import com.gh.gamecenter.retrofit.RetrofitManager +import io.reactivex.Observable +import io.reactivex.Single + +class GameCollectionSquareViewModel(application: Application) : + ListViewModel(application) { + + var entrance: String? = null + + init { + initData() + } + + fun initData() { + + } + +// override fun provideDataSingle(page: Int): Single> = RetrofitManager.getInstance(getApplication()) +// .api.getGameCollectionSquareList(page) + + override fun mergeResultLiveData() { + mResultLiveData.addSource(mListLiveData) { mResultLiveData.postValue(it) } + } + + override fun provideDataObservable(page: Int): Observable>? = null +} \ No newline at end of file diff --git a/app/src/main/java/com/gh/gamecenter/home/gamecollection/GameCollectionStackAnimation.kt b/app/src/main/java/com/gh/gamecenter/home/gamecollection/GameCollectionStackAnimation.kt new file mode 100644 index 0000000000..010e20c8b3 --- /dev/null +++ b/app/src/main/java/com/gh/gamecenter/home/gamecollection/GameCollectionStackAnimation.kt @@ -0,0 +1,144 @@ +package com.gh.gamecenter.home.gamecollection + +import android.view.View +import com.gh.common.util.DisplayUtils +import com.gh.common.view.stacklayoutmanager.StackAnimation +import com.gh.common.view.stacklayoutmanager.StackLayoutManager +import com.gh.gamecenter.R +import com.halo.assistant.HaloApp +import com.lightgame.utils.Utils +import kotlin.math.pow + +class GameCollectionStackAnimation( + scrollOrientation: StackLayoutManager.ScrollOrientation, + visibleCount: Int +) : StackAnimation(scrollOrientation, visibleCount) { + private var mScale = 0.9F + private var mOutScale = 1.0F + private var mOutRotation = 0 + + /** + * 设置 item 缩放比例. + * @param scale 缩放比例 + */ + fun setItemScaleRate(scale: Float) { + mScale = scale + } + + /** + * 获取item缩放比例. + * @return item缩放比例 + */ + fun getItemScaleRate(): Float { + return mScale + } + + /** + * 设置 itemView 离开屏幕时候的缩放比例. + * @param scale 缩放比例 + */ + fun setOutScale(scale: Float) { + mOutScale = scale + } + + /** + * 获取 itemView 离开屏幕时候的缩放比例. + * @return 缩放比例 + */ + fun getOutScale(): Float { + return mOutScale + } + + /** + * 设置 itemView 离开屏幕时候的旋转角度. + * @param rotation 旋转角度 + */ + fun setOutRotation(rotation: Int) { + mOutRotation = rotation + } + + /** + * 获取 itemView 离开屏幕时候的旋转角度 + * @return 旋转角度 + */ + fun getOutRotation(): Int { + return mOutRotation + } + + override fun doAnimation(firstMovePercent: Float, itemView: View, position: Int) { + val cover = itemView.findViewById(R.id.cover) + val content = itemView.findViewById(R.id.content) + val scale: Float + var alpha = 1.0F + val rotation: Float + if (position == 0) { + // 顶层item透明度变化 + cover.alpha = 0F + content.alpha = 1F + if (firstMovePercent > 0.5) alpha = 1F - 2 * (firstMovePercent - 0.5F) + scale = 1 - ((1 - mOutScale) * firstMovePercent) + rotation = mOutRotation * firstMovePercent + } else { + val minScale = (mScale.toDouble().pow(position.toDouble())).toFloat() + val maxScale = (mScale.toDouble().pow((position - 1).toDouble())).toFloat() + scale = minScale + (maxScale - minScale) * firstMovePercent + when (position) { + 1 -> { + cover.alpha = 0.3F - 0.3F * firstMovePercent + content.alpha = firstMovePercent + } + 2 -> cover.alpha = 0.6F - 0.3F * firstMovePercent + 3 -> { + cover.alpha = 1F - 0.4F * firstMovePercent + // 如果不改变会出现残留边框 +// alpha = if (firstMovePercent == 0F) 0F else 1F + } + } + rotation = 0F + } + + setItemPivotXY(mScrollOrientation, itemView) + rotationFirstVisibleItem(mScrollOrientation, itemView, rotation) + itemView.scaleX = scale + itemView.scaleY = scale + itemView.alpha = alpha + } + + private fun setItemPivotXY( + scrollOrientation: StackLayoutManager.ScrollOrientation, + view: View + ) { + when (scrollOrientation) { + StackLayoutManager.ScrollOrientation.RIGHT_TO_LEFT -> { + view.pivotX = view.measuredWidth.toFloat() + view.pivotY = view.measuredHeight.toFloat() / 2 + } + StackLayoutManager.ScrollOrientation.LEFT_TO_RIGHT -> { + view.pivotX = 0F + view.pivotY = view.measuredHeight.toFloat() / 2 + } + StackLayoutManager.ScrollOrientation.BOTTOM_TO_TOP -> { + view.pivotX = view.measuredWidth.toFloat() / 2 + view.pivotY = view.measuredHeight.toFloat() + } + StackLayoutManager.ScrollOrientation.TOP_TO_BOTTOM -> { + view.pivotX = view.measuredWidth.toFloat() / 2 + view.pivotY = 0F + } + } + } + + private fun rotationFirstVisibleItem( + scrollOrientation: StackLayoutManager.ScrollOrientation, + view: View, + rotation: Float + ) { + when (scrollOrientation) { + StackLayoutManager.ScrollOrientation.RIGHT_TO_LEFT -> view.rotationY = rotation + StackLayoutManager.ScrollOrientation.LEFT_TO_RIGHT -> view.rotationY = -rotation + StackLayoutManager.ScrollOrientation.BOTTOM_TO_TOP -> view.rotationX = -rotation + StackLayoutManager.ScrollOrientation.TOP_TO_BOTTOM -> view.rotationX = rotation + } + } + +} diff --git a/app/src/main/java/com/gh/gamecenter/home/gamecollection/GameCollectionStackLayout.kt b/app/src/main/java/com/gh/gamecenter/home/gamecollection/GameCollectionStackLayout.kt new file mode 100644 index 0000000000..67fd5e3bfc --- /dev/null +++ b/app/src/main/java/com/gh/gamecenter/home/gamecollection/GameCollectionStackLayout.kt @@ -0,0 +1,110 @@ +package com.gh.gamecenter.home.gamecollection + +import android.view.View +import com.gh.common.util.dip2px +import com.gh.common.view.stacklayoutmanager.StackLayout +import com.gh.common.view.stacklayoutmanager.StackLayoutManager + +class GameCollectionStackLayout( + scrollOrientation: StackLayoutManager.ScrollOrientation, + visibleCount: Int, + perItemOffset: Int +) : StackLayout(scrollOrientation, visibleCount, perItemOffset) { + + private var mHasMeasureItemSize = false + private var mWidthSpace = 0 + private var mHeightSpace = 0 + private var mStartMargin = 0 + + private var mWidth = 0 + private var mHeight = 0 + private var mScrollOffset = 0 + + override fun doLayout( + stackLayoutManager: StackLayoutManager, + scrollOffset: Int, + firstMovePercent: Float, + itemView: View, + position: Int + ) { + mWidth = stackLayoutManager.width + mHeight = stackLayoutManager.height + mScrollOffset = scrollOffset + if (!mHasMeasureItemSize) { + mWidthSpace = + mWidth - stackLayoutManager.getDecoratedMeasuredWidth(itemView) - 18F.dip2px() + mHeightSpace = mHeight - stackLayoutManager.getDecoratedMeasuredHeight(itemView) + mStartMargin = 16F.dip2px() + mHasMeasureItemSize = true + } + val left: Int + val top: Int + if (position == 0) { + left = getFirstVisibleItemLeft() + top = getFirstVisibleItemTop() + } else { + left = getAfterFirstVisibleItemLeft(position, firstMovePercent) + top = getAfterFirstVisibleItemTop(position, firstMovePercent) + } + + val right = left + stackLayoutManager.getDecoratedMeasuredWidth(itemView) + val bottom = top + stackLayoutManager.getDecoratedMeasuredHeight(itemView) + + stackLayoutManager.layoutDecorated(itemView, left, top, right, bottom) + } + + override fun requestLayout() { + mHasMeasureItemSize = false //表示尺寸可能发生了改变 + } + + private fun getFirstVisibleItemLeft(): Int { + return when (mScrollOrientation) { + StackLayoutManager.ScrollOrientation.RIGHT_TO_LEFT -> mStartMargin - mScrollOffset % mWidth + StackLayoutManager.ScrollOrientation.LEFT_TO_RIGHT -> { + return if (mScrollOffset % mWidth == 0) { + mStartMargin + } else { + mStartMargin + (mWidth - mScrollOffset % mWidth) + } + } + else -> mWidthSpace / 2 + } + } + + private fun getFirstVisibleItemTop(): Int { + return when (mScrollOrientation) { + StackLayoutManager.ScrollOrientation.BOTTOM_TO_TOP -> mStartMargin - mScrollOffset % mHeight + StackLayoutManager.ScrollOrientation.TOP_TO_BOTTOM -> { + return if (mScrollOffset % mHeight == 0) { + mStartMargin + } else { + mStartMargin + (mHeight - mScrollOffset % mHeight) + } + } + else -> mHeightSpace / 2 + } + } + + private fun getAfterFirstVisibleItemLeft(visiblePosition: Int, movePercent: Float): Int { + return when (mScrollOrientation) { + StackLayoutManager.ScrollOrientation.RIGHT_TO_LEFT -> (mStartMargin + mPerItemOffset * (visiblePosition - movePercent)).toInt() + StackLayoutManager.ScrollOrientation.LEFT_TO_RIGHT -> (mStartMargin - mPerItemOffset * (visiblePosition - movePercent)).toInt() + else -> mWidthSpace / 2 + } + } + + private fun getAfterFirstVisibleItemTop(visiblePosition: Int, movePercent: Float): Int { + return when (mScrollOrientation) { + StackLayoutManager.ScrollOrientation.BOTTOM_TO_TOP -> (mStartMargin + mPerItemOffset * (visiblePosition - movePercent)).toInt() + StackLayoutManager.ScrollOrientation.TOP_TO_BOTTOM -> (mStartMargin - mPerItemOffset * (visiblePosition - movePercent)).toInt() + else -> mHeightSpace / 2 + } + } + + private fun getStartMargin(): Int { + return when (mScrollOrientation) { + StackLayoutManager.ScrollOrientation.RIGHT_TO_LEFT, StackLayoutManager.ScrollOrientation.LEFT_TO_RIGHT -> mWidthSpace / 2 + else -> mHeightSpace / 2 + } + } +} diff --git a/app/src/main/java/com/gh/gamecenter/home/gamecollection/HomeGameCollectionAdapter.kt b/app/src/main/java/com/gh/gamecenter/home/gamecollection/HomeGameCollectionAdapter.kt new file mode 100644 index 0000000000..52c3f38716 --- /dev/null +++ b/app/src/main/java/com/gh/gamecenter/home/gamecollection/HomeGameCollectionAdapter.kt @@ -0,0 +1,65 @@ +package com.gh.gamecenter.home.gamecollection + +import android.content.Context +import android.view.ViewGroup +import androidx.recyclerview.widget.RecyclerView +import com.gh.gamecenter.R +import com.gh.gamecenter.databinding.HomeGameCollectionCardItemBinding +import com.gh.gamecenter.entity.GamesCollectionEntity +import com.lightgame.adapter.BaseRecyclerAdapter + +class HomeGameCollectionAdapter(context: Context) : + BaseRecyclerAdapter(context) { + + private var mGameCollectionList = ArrayList() + + fun setGameCollectionList(gameCollectionList: ArrayList) { + mGameCollectionList = gameCollectionList + notifyDataSetChanged() + } + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int) = HomeGameCollectionCardViewHolder( + HomeGameCollectionCardItemBinding.bind( + mLayoutInflater.inflate( + R.layout.home_game_collection_card_item, + parent, + false + ) + ) + ) + + override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) { + if (holder is HomeGameCollectionCardViewHolder) { + var realPosition: Int + when (position) { + 0 -> { + realPosition = getRealCount() - 2 + } + 1 -> { + realPosition = getRealCount() - 1 + } + itemCount - 2 -> { + realPosition = 0 + } + itemCount - 1 -> { + realPosition = 1 + } + else -> { + realPosition = position - 2 + } + } + holder.bindGameListCard(position, mGameCollectionList[realPosition]) + } + } + + override fun getItemCount() = getRealCount() + 4 + + fun getRealCount() = mGameCollectionList.size + + class HomeGameCollectionCardViewHolder(val binding: HomeGameCollectionCardItemBinding) : + RecyclerView.ViewHolder(binding.root) { + fun bindGameListCard(itemPosition: Int, entity: GamesCollectionEntity) { + binding.entity = entity + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/gh/gamecenter/home/gamecollection/HomeGameCollectionViewHolder.kt b/app/src/main/java/com/gh/gamecenter/home/gamecollection/HomeGameCollectionViewHolder.kt new file mode 100644 index 0000000000..167ebfc8d1 --- /dev/null +++ b/app/src/main/java/com/gh/gamecenter/home/gamecollection/HomeGameCollectionViewHolder.kt @@ -0,0 +1,46 @@ +package com.gh.gamecenter.home.gamecollection + +import com.gh.base.BaseRecyclerViewHolder +import com.gh.common.util.dip2px +import com.gh.common.view.stacklayoutmanager.StackLayoutManager +import com.gh.gamecenter.databinding.HomeGameCollectionItemBinding +import com.gh.gamecenter.entity.GamesCollectionEntity + +class HomeGameCollectionViewHolder(val binding: HomeGameCollectionItemBinding) : + BaseRecyclerViewHolder(binding.root) { + fun bindGameCollectionList(gameCollectionList: ArrayList) { + if (binding.recyclerView.adapter is HomeGameCollectionAdapter) { + return + } + val adapter = HomeGameCollectionAdapter(binding.root.context) + val manager = StackLayoutManager( + StackLayoutManager.ScrollOrientation.RIGHT_TO_LEFT, + 3, + GameCollectionStackAnimation::class.java, + GameCollectionStackLayout::class.java + ) + manager.setItemOffset(9F.dip2px()) + manager.setItemChangedListener(object : StackLayoutManager.ItemChangedListener { + override fun onItemChanged(position: Int) { + when (position) { + 0 -> binding.recyclerView.scrollToPosition(adapter.itemCount - 3) + // 最后一个item跳转 + adapter.itemCount - 3 -> binding.recyclerView.scrollToPosition(1) + } + } + }) + binding.recyclerView.layoutManager = manager + binding.recyclerView.adapter = adapter + binding.recyclerView.isNestedScrollingEnabled = false + + adapter.setGameCollectionList(gameCollectionList) + binding.recyclerView.post { + // 定位到实际的第一个item + manager.scrollToPosition(FIRST_ITEM_POSITION) + } + } + + companion object { + const val FIRST_ITEM_POSITION = 2 + } +} \ No newline at end of file diff --git a/app/src/main/res/color/game_collection_rg_button_selector.xml b/app/src/main/res/color/game_collection_rg_button_selector.xml new file mode 100644 index 0000000000..948223d8e9 --- /dev/null +++ b/app/src/main/res/color/game_collection_rg_button_selector.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable-xxxhdpi/game_collection_square_head.webp b/app/src/main/res/drawable-xxxhdpi/game_collection_square_head.webp new file mode 100644 index 0000000000000000000000000000000000000000..5ad47779859f52f0fb5cbef83db48424fc298174 GIT binary patch literal 101002 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 literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xxxhdpi/ic_game_collection_hot.webp b/app/src/main/res/drawable-xxxhdpi/ic_game_collection_hot.webp new file mode 100644 index 0000000000000000000000000000000000000000..1ac9abd47de6f62e65b4d2ee8e132fc1c24ff831 GIT binary patch literal 874 zcmWIYbaP8$W?%?+bqWXzusjua zciZfG&$N%mALcPKfB*->41R^21N+10Gzjo4PBAe0k?hCG7T)-`TCiMJ@sGkYgBTX> zBaR|$ZR?mf`aWP#ne5BZuubLmvRv){+}qo7r^)y!zv8{nT$2xiRuZ(dXaa zns@M7kkH3_SKi&Ze))F_!#bUnKXM$e%ls&H&i8%HRrK-fqrNp+x9(ot!FcjVU7-28 zyi>L2E$PbF>%H$d+->{NJ@ro9ysmfGM0NG=OI=&~;#E}TRQIg&^3Qd0e?NLF8zH|# zw!nLBK}-Lwq}q9>nYPZK_GTT=J(&ZhxqGZN&N|y}f90;Xj^$gzpY^$g7H5Au&UN|U zaL{()>RT!IPCVOCZ)|hTKsbyN*Qrjm>mmOI3 zVUyD~wcC21W+hzV?v(!H_GGK(&)$Q}ek?aXTz0?i^(?Wq-O6Gq$K5t4Pm1DJc2hg5 zw{q*hQ|~^m(B9l@tS&Hn>SZb64BIJrclfh5&b3@!$rybpCa&9d(q^lW=vrHgvmN@c zc={0++>+1V! tAM@G&xqI?F%jw@Ig(nBIUq82eLF#Y)eJ}t0&foXsz$eG&8{cO!0swbUvWfrz literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xxxhdpi/ic_game_collection_square_amway_go.webp b/app/src/main/res/drawable-xxxhdpi/ic_game_collection_square_amway_go.webp new file mode 100644 index 0000000000000000000000000000000000000000..650b241e801ea5793bb4cb0df9b8e6a72a6768aa GIT binary patch literal 10126 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 literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable/bg_game_collection_hot_container.xml b/app/src/main/res/drawable/bg_game_collection_hot_container.xml new file mode 100644 index 0000000000..ed2cefd0ca --- /dev/null +++ b/app/src/main/res/drawable/bg_game_collection_hot_container.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_game_collection_square.xml b/app/src/main/res/drawable/bg_game_collection_square.xml new file mode 100644 index 0000000000..3349ffadb0 --- /dev/null +++ b/app/src/main/res/drawable/bg_game_collection_square.xml @@ -0,0 +1,7 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_game_collection_user_container.xml b/app/src/main/res/drawable/bg_game_collection_user_container.xml new file mode 100644 index 0000000000..4bfcfd216a --- /dev/null +++ b/app/src/main/res/drawable/bg_game_collection_user_container.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/progressbar_game_collection.xml b/app/src/main/res/drawable/progressbar_game_collection.xml new file mode 100644 index 0000000000..f36ccf6bc0 --- /dev/null +++ b/app/src/main/res/drawable/progressbar_game_collection.xml @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_game_collection_square.xml b/app/src/main/res/layout/fragment_game_collection_square.xml new file mode 100644 index 0000000000..1c49ee7234 --- /dev/null +++ b/app/src/main/res/layout/fragment_game_collection_square.xml @@ -0,0 +1,229 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_game_collection_square_al.xml b/app/src/main/res/layout/fragment_game_collection_square_al.xml new file mode 100644 index 0000000000..08a4f98669 --- /dev/null +++ b/app/src/main/res/layout/fragment_game_collection_square_al.xml @@ -0,0 +1,52 @@ + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/game_collection_amway_content_item.xml b/app/src/main/res/layout/game_collection_amway_content_item.xml new file mode 100644 index 0000000000..68fbd48317 --- /dev/null +++ b/app/src/main/res/layout/game_collection_amway_content_item.xml @@ -0,0 +1,38 @@ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/game_collection_square_amway_item.xml b/app/src/main/res/layout/game_collection_square_amway_item.xml new file mode 100644 index 0000000000..2bc937e1b9 --- /dev/null +++ b/app/src/main/res/layout/game_collection_square_amway_item.xml @@ -0,0 +1,58 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/game_collection_square_item.xml b/app/src/main/res/layout/game_collection_square_item.xml new file mode 100644 index 0000000000..79781dbb6c --- /dev/null +++ b/app/src/main/res/layout/game_collection_square_item.xml @@ -0,0 +1,280 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/home_game_collection_card_item.xml b/app/src/main/res/layout/home_game_collection_card_item.xml new file mode 100644 index 0000000000..3cc9a68141 --- /dev/null +++ b/app/src/main/res/layout/home_game_collection_card_item.xml @@ -0,0 +1,196 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/game_collection_tag_body_item.xml b/app/src/main/res/layout/home_game_collection_item.xml similarity index 58% rename from app/src/main/res/layout/game_collection_tag_body_item.xml rename to app/src/main/res/layout/home_game_collection_item.xml index 402bc80584..b81cada242 100644 --- a/app/src/main/res/layout/game_collection_tag_body_item.xml +++ b/app/src/main/res/layout/home_game_collection_item.xml @@ -1,20 +1,17 @@ + android:paddingTop="16dp"> - - \ No newline at end of file