From 17f425a186513b09d3e451018e230df35e2360d2 Mon Sep 17 00:00:00 2001 From: yangyakun Date: Mon, 24 Apr 2023 12:55:05 +0800 Subject: [PATCH] =?UTF-8?q?[bugfix]=20[recycleview=20=E5=B1=85=E4=B8=AD?= =?UTF-8?q?=E9=97=AE=E9=A2=98]?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../och/bus/passenger/ui/M1SoftFragment.kt | 5 +- .../ui/layoutmanage/PagerCenterSnapHelper.kt | 81 +++++++++++++++++++ 2 files changed, 84 insertions(+), 2 deletions(-) create mode 100644 OCH/mogo-och-charter-passenger/src/m1/java/com/mogo/och/bus/passenger/ui/layoutmanage/PagerCenterSnapHelper.kt diff --git a/OCH/mogo-och-charter-passenger/src/m1/java/com/mogo/och/bus/passenger/ui/M1SoftFragment.kt b/OCH/mogo-och-charter-passenger/src/m1/java/com/mogo/och/bus/passenger/ui/M1SoftFragment.kt index 34aff80614..60e3875e57 100644 --- a/OCH/mogo-och-charter-passenger/src/m1/java/com/mogo/och/bus/passenger/ui/M1SoftFragment.kt +++ b/OCH/mogo-och-charter-passenger/src/m1/java/com/mogo/och/bus/passenger/ui/M1SoftFragment.kt @@ -30,6 +30,7 @@ import com.mogo.och.bus.passenger.R import com.mogo.och.bus.passenger.bean.Temperature import com.mogo.och.bus.passenger.presenter.BusPassengerFunctionSoftPresenter import com.mogo.och.bus.passenger.ui.adapter.TemperatureAdapter +import com.mogo.och.bus.passenger.ui.layoutmanage.PagerCenterSnapHelper import com.mogo.och.bus.passenger.view.HorizontalDecoration import com.mogo.och.bus.passenger.view.PickerLayoutManager import com.mogo.och.common.module.utils.SoundPoolHelper @@ -235,12 +236,12 @@ class M1SoftFragment : val data = getData() val adapter = TemperatureAdapter(requireContext(), data, rv_aircondition_temperature) - val snapHelper: SnapHelper = LinearSnapHelper() + val snapHelper = PagerCenterSnapHelper() snapHelper.attachToRecyclerView(rv_aircondition_temperature) rv_aircondition_temperature.layoutManager = pickerLayoutManager rv_aircondition_temperature.adapter = adapter HorizontalDecoration.distance = SharedPrefsMgr.getInstance(requireContext()).getInt(HorizontalDecoration.distancekey,0) - val space = AutoSizeUtils.dp2px(context, 22f) + val space = AutoSizeUtils.dp2px(context, 15f) rv_aircondition_temperature.addItemDecoration(HorizontalDecoration(space,data.size-1)) pickerLayoutManager.setOnScrollStopListener { view -> diff --git a/OCH/mogo-och-charter-passenger/src/m1/java/com/mogo/och/bus/passenger/ui/layoutmanage/PagerCenterSnapHelper.kt b/OCH/mogo-och-charter-passenger/src/m1/java/com/mogo/och/bus/passenger/ui/layoutmanage/PagerCenterSnapHelper.kt new file mode 100644 index 0000000000..f0a3f564db --- /dev/null +++ b/OCH/mogo-och-charter-passenger/src/m1/java/com/mogo/och/bus/passenger/ui/layoutmanage/PagerCenterSnapHelper.kt @@ -0,0 +1,81 @@ +package com.mogo.och.bus.passenger.ui.layoutmanage + +import android.view.View +import androidx.recyclerview.widget.OrientationHelper +import androidx.recyclerview.widget.PagerSnapHelper +import androidx.recyclerview.widget.RecyclerView + +class PagerCenterSnapHelper : PagerSnapHelper() { + private var mHorizontalHelper: OrientationHelper? = null + private var pageScollListener: PageScollListener? = null + override fun findSnapView(layoutManager: RecyclerView.LayoutManager): View? { + if (layoutManager.canScrollVertically()) { + return super.findSnapView(layoutManager) + } else if (layoutManager.canScrollHorizontally()) { + return findCenterView(layoutManager, getHorizontalHelper(layoutManager)) + } + return null + } + + private fun findCenterView( + layoutManager: RecyclerView.LayoutManager, + helper: OrientationHelper + ): View? { + val childCount = layoutManager.childCount + if (childCount == 0) { + return null + } + var closestChild: View? = null + val center = helper.startAfterPadding + helper.totalSpace / 2 + var absClosest = Int.MAX_VALUE + for (i in 0 until childCount) { + val child = layoutManager.getChildAt(i) + val params = child!!.layoutParams as RecyclerView.LayoutParams + var childCenter = 0 + childCenter = if (i == 0) { + helper.getDecoratedStart(child) + helper.getDecoratedMeasurement(child) - layoutManager.getDecoratedMeasuredWidth( + child + ) / 2 - params.rightMargin / 2 + } else if (i == childCount - 1) { + (helper.getDecoratedStart(child) + + (helper.getDecoratedMeasurement(child) - layoutManager.getDecoratedMeasuredWidth( + child + ) / 2 - params.leftMargin / 2 - params.rightMargin)) + } else { + helper.getDecoratedStart(child) + helper.getDecoratedMeasurement(child) / 2 + } + val absDistance = Math.abs(childCenter - center) + /* if child center is closer than previous closest, set it as closest */if (absDistance < absClosest) { + absClosest = absDistance + closestChild = child + } + } + if (pageScollListener != null) { + if (closestChild != null) { + pageScollListener!!.onPageSelected(layoutManager.getPosition(closestChild)) + } + } + return closestChild + } + + private fun getHorizontalHelper( + layoutManager: RecyclerView.LayoutManager + ): OrientationHelper { + if (mHorizontalHelper == null || mHorizontalHelper!!.layoutManager !== layoutManager) { + mHorizontalHelper = OrientationHelper.createHorizontalHelper(layoutManager) + } + return mHorizontalHelper!! + } + + fun setPageScollListener(pageScollListener: PageScollListener?) { + this.pageScollListener = pageScollListener + } + + interface PageScollListener { + fun onPageSelected(i: Int) + } + + companion object { + private const val TAG = "PagerSnapHelper " + } +} \ No newline at end of file