From b5cfced9150b400f221dd7be96349c8705210067 Mon Sep 17 00:00:00 2001 From: Chirag Prajapati <87471481+chiragmi@users.noreply.github.com> Date: Tue, 24 Aug 2021 18:49:42 +0530 Subject: [PATCH] Development (#3) * Feature/item position fixes (#2) * - Resolved item position issue - Updated library version - Changed version * - Managed manual scroll scenario * - Changed item scale type --- README.md | 2 +- .../autoscrollviewpager/MainActivity.kt | 3 ++ app/src/main/res/layout/activity_main.xml | 2 +- app/src/main/res/layout/item_viewpager.xml | 2 +- autoscrollcircularpagerview/build.gradle | 22 +++++----- .../AutoScrollCircularPagerView.kt | 29 ++++++++----- .../com/mindinventory/CenterItemCallback.kt | 2 +- .../com/mindinventory/CenterItemFinder.kt | 41 ------------------- .../com/mindinventory/OnScrollListener.kt | 23 +++++++++++ build.gradle | 8 ++-- 10 files changed, 63 insertions(+), 71 deletions(-) delete mode 100644 autoscrollcircularpagerview/src/main/java/com/mindinventory/CenterItemFinder.kt create mode 100644 autoscrollcircularpagerview/src/main/java/com/mindinventory/OnScrollListener.kt diff --git a/README.md b/README.md index 3a13522..0c3c4a6 100644 --- a/README.md +++ b/README.md @@ -35,7 +35,7 @@ AutoScrollCircularPagerView is a library to show slider with features of circula ```groovy dependencies { ... - implementation 'com.github.Mindinventory:AutoScrollCircularPagerView:0.0.1' + implementation 'com.github.Mindinventory:AutoScrollCircularPagerView:0.0.2' } ``` diff --git a/app/src/main/java/com/mindinventory/autoscrollviewpager/MainActivity.kt b/app/src/main/java/com/mindinventory/autoscrollviewpager/MainActivity.kt index c4d3959..054f53e 100644 --- a/app/src/main/java/com/mindinventory/autoscrollviewpager/MainActivity.kt +++ b/app/src/main/java/com/mindinventory/autoscrollviewpager/MainActivity.kt @@ -1,6 +1,8 @@ package com.mindinventory.autoscrollviewpager +import android.os.Build import android.os.Bundle +import androidx.annotation.RequiresApi import androidx.appcompat.app.AppCompatActivity import kotlinx.android.synthetic.main.activity_main.* @@ -14,6 +16,7 @@ class MainActivity : AppCompatActivity() { } private val myAdapter by lazy { MyAdapter() } + @RequiresApi(Build.VERSION_CODES.Q) override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index 81088b3..811f78a 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -11,7 +11,7 @@ android:layout_width="0dp" android:layout_height="250dp" android:orientation="horizontal" - app:auto_scroll_delay="5000" + app:auto_scroll_delay="2000" app:dot_margin="20dp" app:dot_gravity="bottom" app:layout_constraintLeft_toLeftOf="parent" diff --git a/app/src/main/res/layout/item_viewpager.xml b/app/src/main/res/layout/item_viewpager.xml index fece9cc..bde48e2 100644 --- a/app/src/main/res/layout/item_viewpager.xml +++ b/app/src/main/res/layout/item_viewpager.xml @@ -7,9 +7,9 @@ setItems(items: ArrayList, clearPreviousElements: Boolean = false) { if (rvAutoScroll.adapter is CircularAdapter<*>) { @@ -137,11 +141,8 @@ class AutoScrollCircularPagerView @JvmOverloads constructor( //scroll and dots are not required for just 1 item in the list if (items.size > 1) { //To manage selection of first item when auto scroll start - centerItemPosition += if (items.size % 2 == 0) { - 1 - } else { - 2 - } + val number: Int = Int.MAX_VALUE / items.size / 2 + centerItemPosition = number * items.size rvAutoScroll.layoutManager?.scrollToPosition(centerItemPosition) setDots(items) } @@ -195,11 +196,13 @@ class AutoScrollCircularPagerView @JvmOverloads constructor( return circularAdapter?.getActualItemCount() ?: 0 > 1 } + @RequiresApi(Build.VERSION_CODES.Q) private fun startAutoScrollIfRequired() { if (requiredAutoScroll() && !scrollHandler.hasCallbacks(runnable) && isAutoScrollEnabled) scrollHandler.postDelayed(runnable, autoScrollDelay) } + @RequiresApi(Build.VERSION_CODES.Q) private fun stopAutoScrollIfRequired() { if (scrollHandler.hasCallbacks(runnable)) { scrollHandler.removeCallbacks(runnable) @@ -209,19 +212,23 @@ class AutoScrollCircularPagerView @JvmOverloads constructor( /** * smooth scroll item to next position */ + @RequiresApi(Build.VERSION_CODES.Q) private fun autoScrollViewpager() { rvAutoScroll.adapter?.let { - rvAutoScroll.smoothScrollToPosition(centerItemPosition + 1) + centerItemPosition += 1 + rvAutoScroll.smoothScrollToPosition(centerItemPosition) } stopAutoScrollIfRequired() startAutoScrollIfRequired() } + @RequiresApi(Build.VERSION_CODES.Q) override fun onDetachedFromWindow() { super.onDetachedFromWindow() stopAutoScrollIfRequired() } + @RequiresApi(Build.VERSION_CODES.Q) override fun onVisibilityAggregated(isVisible: Boolean) { super.onVisibilityAggregated(isVisible) if (isVisible) { diff --git a/autoscrollcircularpagerview/src/main/java/com/mindinventory/CenterItemCallback.kt b/autoscrollcircularpagerview/src/main/java/com/mindinventory/CenterItemCallback.kt index 19be868..12d21bf 100644 --- a/autoscrollcircularpagerview/src/main/java/com/mindinventory/CenterItemCallback.kt +++ b/autoscrollcircularpagerview/src/main/java/com/mindinventory/CenterItemCallback.kt @@ -1,6 +1,6 @@ package com.mindinventory interface CenterItemCallback { - fun onScrollFinished(middleElement: Int) + fun onScrollFinished(visibleItemPosition: Int) fun onScrolled(dx: Int) } \ No newline at end of file diff --git a/autoscrollcircularpagerview/src/main/java/com/mindinventory/CenterItemFinder.kt b/autoscrollcircularpagerview/src/main/java/com/mindinventory/CenterItemFinder.kt deleted file mode 100644 index 31646bd..0000000 --- a/autoscrollcircularpagerview/src/main/java/com/mindinventory/CenterItemFinder.kt +++ /dev/null @@ -1,41 +0,0 @@ -package com.mindinventory - -import android.content.Context -import androidx.recyclerview.widget.LinearLayoutManager -import androidx.recyclerview.widget.RecyclerView -import kotlin.math.abs - -class CenterItemFinder( - private val context: Context, - private val layoutManager: LinearLayoutManager, - private val callback: CenterItemCallback, - private val controlState: Int -) : RecyclerView.OnScrollListener() { - - override fun onScrolled(recyclerView: RecyclerView, dx: Int, dy: Int) { - super.onScrolled(recyclerView, dx, dy) - callback.onScrolled(dx) - } - - override fun onScrollStateChanged(recyclerView: RecyclerView, newState: Int) { - if (newState == controlState) { - val firstVisible = layoutManager.findFirstVisibleItemPosition() - val lastVisible = layoutManager.findLastVisibleItemPosition() - val itemsCount = lastVisible - firstVisible + 1 - val screenCenter = context.resources.displayMetrics.widthPixels / 2 - var minCenterOffset = Int.MAX_VALUE - var middleItemIndex = 0 - for (index in 0 until itemsCount) { - val listItem = layoutManager.getChildAt(index) ?: return - val leftOffset = listItem.left - val rightOffset = listItem.right - val centerOffset = abs(leftOffset - screenCenter) + abs(rightOffset - screenCenter) - if (minCenterOffset > centerOffset) { - minCenterOffset = centerOffset - middleItemIndex = index + firstVisible - } - } - callback.onScrollFinished(middleItemIndex) - } - } -} \ No newline at end of file diff --git a/autoscrollcircularpagerview/src/main/java/com/mindinventory/OnScrollListener.kt b/autoscrollcircularpagerview/src/main/java/com/mindinventory/OnScrollListener.kt new file mode 100644 index 0000000..1dcdeb8 --- /dev/null +++ b/autoscrollcircularpagerview/src/main/java/com/mindinventory/OnScrollListener.kt @@ -0,0 +1,23 @@ +package com.mindinventory + +import androidx.recyclerview.widget.LinearLayoutManager +import androidx.recyclerview.widget.RecyclerView + +class OnScrollListener( + private val layoutManager: LinearLayoutManager, + private val callback: CenterItemCallback, + private val controlState: Int +) : RecyclerView.OnScrollListener() { + + override fun onScrolled(recyclerView: RecyclerView, dx: Int, dy: Int) { + super.onScrolled(recyclerView, dx, dy) + callback.onScrolled(dx) + } + + override fun onScrollStateChanged(recyclerView: RecyclerView, newState: Int) { + if (newState == controlState) { + val visibleItemPosition = layoutManager.findFirstVisibleItemPosition() + callback.onScrollFinished(visibleItemPosition) + } + } +} \ No newline at end of file diff --git a/build.gradle b/build.gradle index 59a9aff..3399feb 100644 --- a/build.gradle +++ b/build.gradle @@ -1,13 +1,13 @@ // Top-level build file where you can add configuration options common to all sub-projects/modules. buildscript { - ext.kotlin_version = "1.4.21" + ext.kotlin_version = "1.5.21" repositories { google() - jcenter() + mavenCentral() maven { url "https://jitpack.io" } } dependencies { - classpath "com.android.tools.build:gradle:4.1.1" + classpath "com.android.tools.build:gradle:4.1.3" classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" classpath 'com.github.dcendents:android-maven-gradle-plugin:2.1' @@ -19,7 +19,7 @@ buildscript { allprojects { repositories { google() - jcenter() + mavenCentral() maven { url "https://jitpack.io" } } }