diff --git a/app_aidl_client/src/main/java/com/phone/aidl/aidl/Book.java b/app_aidl_client/src/main/java/com/phone/aidl/aidl/Book.java
index 964b27b58685ab0d314cdeda1c43991e81443780..d49d38a22e2bf5e69ec4a2842edada96d846e5dd 100644
--- a/app_aidl_client/src/main/java/com/phone/aidl/aidl/Book.java
+++ b/app_aidl_client/src/main/java/com/phone/aidl/aidl/Book.java
@@ -8,7 +8,6 @@ import android.os.Parcelable;
*
* @author Urasaki
* @version 1.0
- * @copyright 亿帆
* @date 2023-01-03$ 21:10:30$
**/
public class Book implements Parcelable {
diff --git a/app_aidl_server/src/main/java/com/phone/aidl/aidl/Book.java b/app_aidl_server/src/main/java/com/phone/aidl/aidl/Book.java
index cc8f96a5ca343fafbc6142bd24a251cf7f964577..0aec04c544ae6f0ba7b9f3f19ef97d8b0768359c 100644
--- a/app_aidl_server/src/main/java/com/phone/aidl/aidl/Book.java
+++ b/app_aidl_server/src/main/java/com/phone/aidl/aidl/Book.java
@@ -8,7 +8,6 @@ import android.os.Parcelable;
*
* @author Urasaki
* @version 1.0
- * @copyright 亿帆
* @date 2023-01-03$ 21:10:30$
**/
public class Book implements Parcelable {
diff --git a/library_base/src/main/cpp/libs/arm64-v8a/libnative-lib.so b/library_base/src/main/cpp/libs/arm64-v8a/libnative-lib.so
index 1db8a17a5782b9971ed16b908f5df211c56bc30c..abf7dfbdc9f192d8f270d1f42c6d2fce721b7b6d 100755
Binary files a/library_base/src/main/cpp/libs/arm64-v8a/libnative-lib.so and b/library_base/src/main/cpp/libs/arm64-v8a/libnative-lib.so differ
diff --git a/library_base/src/main/cpp/libs/arm64-v8a/libreturn-data.so b/library_base/src/main/cpp/libs/arm64-v8a/libreturn-data.so
index 7a02d7f5e1a3ded77bb0e79902ba8a382ebe3923..7868b939698c02c17b6d26dd1885173100a26947 100755
Binary files a/library_base/src/main/cpp/libs/arm64-v8a/libreturn-data.so and b/library_base/src/main/cpp/libs/arm64-v8a/libreturn-data.so differ
diff --git a/library_base/src/main/cpp/libs/armeabi-v7a/libnative-lib.so b/library_base/src/main/cpp/libs/armeabi-v7a/libnative-lib.so
index cb57918086e9b0d437fee7a6bc5ec4caf6300b81..e92de93d9587b1a652d9f0d7b130e5c1ba8dfec2 100755
Binary files a/library_base/src/main/cpp/libs/armeabi-v7a/libnative-lib.so and b/library_base/src/main/cpp/libs/armeabi-v7a/libnative-lib.so differ
diff --git a/library_base/src/main/cpp/libs/armeabi-v7a/libreturn-data.so b/library_base/src/main/cpp/libs/armeabi-v7a/libreturn-data.so
index bd2dd5ce314ade408bfbf9bb24ad402274612792..94fcbb1591fddb10ea909cd206f99c22e4e9c991 100755
Binary files a/library_base/src/main/cpp/libs/armeabi-v7a/libreturn-data.so and b/library_base/src/main/cpp/libs/armeabi-v7a/libreturn-data.so differ
diff --git a/library_base/src/main/java/com/phone/library_base/common/ConstantData.kt b/library_base/src/main/java/com/phone/library_base/common/ConstantData.kt
index 84214f4f32d1e92c726dec02339072ed576e8839..6dce10f481baf99bce054d1e99894ac21e2dfe77 100644
--- a/library_base/src/main/java/com/phone/library_base/common/ConstantData.kt
+++ b/library_base/src/main/java/com/phone/library_base/common/ConstantData.kt
@@ -46,6 +46,7 @@ object ConstantData {
const val ROUTE_SQUARE = "/module_square/ui/square"
+ const val ROUTE_SQUARE_CUSTOM_BANNER = "/module_square/ui/custom_banner"
const val ROUTE_SQUARE_FRAGMENT = "/module_square/fragment/square_fragment"
const val ROUTE_JSBRIDGE = "/module_square/ui/jsbridge"
const val ROUTE_CREATE_USER = "/module_square/ui/create_user"
diff --git a/library_common/src/main/res/values/strings.xml b/library_common/src/main/res/values/strings.xml
index 125777be49e476248c5e076a5b27ab9b773a8db0..6db9945deaca3a0ddb32374970c025af668b9ac3 100644
--- a/library_common/src/main/res/values/strings.xml
+++ b/library_common/src/main/res/values/strings.xml
@@ -115,6 +115,7 @@
jsbridge
三級連動列表
下載文件
+ 自定义Banner
functionToJs
functionToJs2
diff --git a/library_custom_view/src/main/java/com/phone/library_custom_view/custom_view/BannerIndicator.kt b/library_custom_view/src/main/java/com/phone/library_custom_view/custom_view/BannerIndicator.kt
new file mode 100644
index 0000000000000000000000000000000000000000..2bd894d06d4559e743c993eef20e5fa42e189768
--- /dev/null
+++ b/library_custom_view/src/main/java/com/phone/library_custom_view/custom_view/BannerIndicator.kt
@@ -0,0 +1,68 @@
+package com.phone.library_custom_view.custom_view
+
+import android.content.Context
+import android.graphics.Canvas
+import android.graphics.Color
+import android.graphics.Paint
+import android.util.AttributeSet
+import android.view.View
+import com.phone.library_custom_view.R
+
+class BannerIndicator(context: Context, attrs: AttributeSet?) : View(context, attrs) {
+
+ companion object {
+ private const val TAG = "BannerIndicator"
+ }
+
+ private var number = 0
+ private var position = 0
+ private val mPaint = Paint()
+ private var selectColor = 0
+ private var unselectColor = 0
+ private var radius = 0f
+ private var space = 0f
+
+ init {
+ val typedArray = context.obtainStyledAttributes(attrs, R.styleable.BannerIndicator)
+ selectColor = typedArray.getColor(R.styleable.BannerIndicator_selectColor, Color.RED)
+ unselectColor =
+ typedArray.getColor(R.styleable.BannerIndicator_unselectedColor, Color.WHITE)
+ radius = typedArray.getDimension(R.styleable.BannerIndicator_radius, 8f)
+ space = typedArray.getDimension(R.styleable.BannerIndicator_space, 16f)
+ typedArray.recycle()
+
+ mPaint.style = Paint.Style.FILL;
+ mPaint.isAntiAlias = true;
+ mPaint.isFilterBitmap = true;
+ }
+
+ override fun onDraw(canvas: Canvas) {
+ super.onDraw(canvas)
+ val startPosition = width.toFloat() / 2 - (radius * 2 * number + space * (number - 1)) / 2
+ canvas.save()
+ for (i in 0 until number) {
+ if (i == position) {
+ mPaint.color = selectColor
+ } else {
+ mPaint.color = unselectColor
+ }
+ canvas.drawCircle(
+ startPosition + radius * (2 * i + 1) + i * space,
+ height.toFloat() / 2,
+ radius,
+ mPaint
+ )
+ }
+ canvas.restore()
+ }
+
+ fun setNumber(number: Int) {
+ this.number = number
+ }
+
+ fun setPosition(position: Int) {
+ this.position = position
+ invalidate()
+ }
+
+}
\ No newline at end of file
diff --git a/library_custom_view/src/main/res/values/attrs.xml b/library_custom_view/src/main/res/values/attrs.xml
new file mode 100644
index 0000000000000000000000000000000000000000..1aefc69d93beb30bc3393ee10034db34649079b7
--- /dev/null
+++ b/library_custom_view/src/main/res/values/attrs.xml
@@ -0,0 +1,15 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/module_square/build.gradle b/module_square/build.gradle
index 10cccb90f160b99567849c4b829317bafb32c7f2..f3225db9a7e59b1581629d18d6489246f72087b6 100644
--- a/module_square/build.gradle
+++ b/module_square/build.gradle
@@ -125,6 +125,7 @@ dependencies {
implementation 'androidx.appcompat:appcompat:1.4.1'
implementation 'com.google.android.material:material:1.5.0'
implementation 'androidx.constraintlayout:constraintlayout:2.1.3'
+ implementation project(path: ':library_glide')
//Android路由(用于不同app之间的跳转)
// implementation "com.alibaba:arouter-api:$BuildVersions.arouter_api_version"
diff --git a/module_square/src/main/java/com/phone/module_square/adapter/NewBannerAdapter.kt b/module_square/src/main/java/com/phone/module_square/adapter/NewBannerAdapter.kt
new file mode 100644
index 0000000000000000000000000000000000000000..5c67dad8102bfb0021dc79264e850914cb5ca174
--- /dev/null
+++ b/module_square/src/main/java/com/phone/module_square/adapter/NewBannerAdapter.kt
@@ -0,0 +1,52 @@
+package com.phone.module_square.adapter
+
+import android.content.Context
+import android.view.LayoutInflater
+import android.view.View
+import android.view.ViewGroup
+import android.widget.ImageView
+import androidx.recyclerview.widget.RecyclerView
+import com.bumptech.glide.Glide
+import com.phone.module_square.R
+import com.phone.module_square.bean.PictureBean
+
+class NewBannerAdapter(val context: Context?, val list: MutableList) :
+ RecyclerView.Adapter() {
+
+ companion object {
+ private const val TAG = "NewBannerAdapter"
+ }
+
+ override fun onCreateViewHolder(
+ parent: ViewGroup,
+ viewType: Int
+ ): RecyclerView.ViewHolder {
+ val view: View =
+ LayoutInflater.from(parent.context).inflate(R.layout.square_item_image, parent, false)
+ return BodyViewHolder(view)
+ }
+
+ override fun onBindViewHolder(
+ holder: RecyclerView.ViewHolder,
+ position: Int
+ ) {
+ if (holder is BodyViewHolder) {
+ if (list.isNotEmpty() && context != null) {
+ Glide.with(context).load(list[position % list.size].picture).into(holder.imageView)
+ }
+ }
+ }
+
+ override fun getItemCount(): Int {
+ return Int.MAX_VALUE
+ }
+
+ private class BodyViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
+ val imageView: ImageView
+
+ init {
+ imageView = itemView.findViewById(R.id.item_image) as ImageView
+ }
+ }
+
+}
\ No newline at end of file
diff --git a/module_square/src/main/java/com/phone/module_square/bean/PictureBean.java b/module_square/src/main/java/com/phone/module_square/bean/PictureBean.java
new file mode 100644
index 0000000000000000000000000000000000000000..c6f936c6ea3bd08fda6d8f36fea1429cec1ed0a5
--- /dev/null
+++ b/module_square/src/main/java/com/phone/module_square/bean/PictureBean.java
@@ -0,0 +1,47 @@
+package com.phone.module_square.bean;
+
+import android.text.TextUtils;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+
+import java.util.Objects;
+
+/**
+ * 一句话描述该类功能.
+ *
+ * @author Urasaki
+ * @version 1.0
+ * @date 2024-02-24$ 16:42:00$
+ **/
+public class PictureBean implements Cloneable {
+
+ public String id;
+ public int picture;
+
+ public PictureBean(String id, int picture) {
+ this.id = id;
+ this.picture = picture;
+ }
+
+ @NonNull
+ @Override
+ public PictureBean clone() throws CloneNotSupportedException {
+ return (PictureBean) super.clone();
+ }
+
+ @Override
+ public boolean equals(@Nullable Object obj) {
+ if (obj == this) {
+ return true;
+ }
+ // 使用getClass()判断对象是否属于该类
+ if (obj == null || obj.getClass() != getClass()) {
+ return false;
+ }
+
+ PictureBean other = (PictureBean) obj;
+ return Objects.equals(this.id, other.id) && this.picture == other.picture;
+ }
+
+}
diff --git a/module_square/src/main/java/com/phone/module_square/custom/SmoothLinearLayoutManager.kt b/module_square/src/main/java/com/phone/module_square/custom/SmoothLinearLayoutManager.kt
new file mode 100644
index 0000000000000000000000000000000000000000..6794e649153b4d741ae38fa100422e6bf3fb0f3a
--- /dev/null
+++ b/module_square/src/main/java/com/phone/module_square/custom/SmoothLinearLayoutManager.kt
@@ -0,0 +1,27 @@
+package com.phone.module_square.custom
+
+import android.content.Context
+import android.util.DisplayMetrics
+import androidx.recyclerview.widget.LinearLayoutManager
+import androidx.recyclerview.widget.LinearSmoothScroller
+import androidx.recyclerview.widget.RecyclerView
+
+class SmoothLinearLayoutManager(context: Context, orientation: Int, reverseLayout: Boolean) :
+ LinearLayoutManager(context, orientation, reverseLayout) {
+
+ override fun smoothScrollToPosition(
+ recyclerView: RecyclerView,
+ state: RecyclerView.State?,
+ position: Int
+ ) {
+ val linearSmoothScroller: LinearSmoothScroller =
+ object : LinearSmoothScroller(recyclerView.context) {
+ override fun calculateSpeedPerPixel(displayMetrics: DisplayMetrics): Float {
+ return 0.1f //返回0.2 让它滚动不要那么快
+ }
+ }
+ linearSmoothScroller.targetPosition = position
+ startSmoothScroll(linearSmoothScroller)
+ }
+
+}
\ No newline at end of file
diff --git a/module_square/src/main/java/com/phone/module_square/fragment/SquareFragment.kt b/module_square/src/main/java/com/phone/module_square/fragment/SquareFragment.kt
index 4eccd9fd848f9d0a1ed289d7fa598c4fcaa74c11..6f5c88859c02a0b86b67b20ba4ba1a0d1e4ba5d0 100644
--- a/module_square/src/main/java/com/phone/module_square/fragment/SquareFragment.kt
+++ b/module_square/src/main/java/com/phone/module_square/fragment/SquareFragment.kt
@@ -44,7 +44,8 @@ import java.util.concurrent.atomic.AtomicBoolean
* introduce :
*/
@Route(path = ConstantData.Route.ROUTE_SQUARE_FRAGMENT)
-class SquareFragment : BaseMvvmRxFragment(R.layout.square_fragment_square) {
+class SquareFragment :
+ BaseMvvmRxFragment(R.layout.square_fragment_square) {
companion object {
private val TAG: String = SquareFragment::class.java.simpleName
@@ -264,6 +265,11 @@ class SquareFragment : BaseMvvmRxFragment()
+
+ override fun initLayoutId(): Int = R.layout.square_activity_custom_banner
+
+ override fun initData() {
+ // 存入图片
+ pictureList.add(PictureBean("1", R.mipmap.pucture_sunrise1))
+ pictureList.add(PictureBean("2", R.mipmap.pucture_sunrise2))
+ pictureList.add(PictureBean("3", R.mipmap.pucture_sunrise3))
+ pictureList.add(PictureBean("5", R.mipmap.pucture_sunrise5))
+ pictureList.add(PictureBean("6", R.mipmap.pucture_sunrise6))
+ }
+
+ override fun initViews() {
+ toolbar = findViewById(R.id.toolbar) as Toolbar
+ layoutBack = findViewById(R.id.layout_back) as FrameLayout
+ imvBack = findViewById(R.id.imv_back) as ImageView
+ layoutBanner = findViewById(R.id.layout_banner) as FrameLayout
+ layoutIndicator = findViewById(R.id.layout_indicator) as FrameLayout
+
+ setToolbar(false, R.color.library_black)
+ imvBack?.setColorFilter(ResourcesManager.getColor(R.color.library_white))
+ layoutBack?.setOnClickListener {
+ finish()
+ }
+
+ compareData(mutableListOf(), pictureList)
+ }
+
+ override fun initLoadData() {
+ delayedUpdate()
+ }
+
+ private fun addBannerView(list: MutableList) {
+ layoutBanner?.removeAllViews()
+ val recyclerView = RecyclerView(this@CustomBannerActivity)
+ val layoutParams = FrameLayout.LayoutParams(
+ FrameLayout.LayoutParams.MATCH_PARENT, FrameLayout.LayoutParams.MATCH_PARENT
+ )
+ layoutBanner?.addView(recyclerView, layoutParams)
+ val adapter = NewBannerAdapter(this@CustomBannerActivity, list)
+ // LinearLayoutManager 第二个参数表示布局方向,默认是垂直的
+ // 这里轮播广告要用为LinearLayoutManager.HORIZONTAL,水平方向
+ // 使用LinearLayoutManager会让图片滚动太快,我们继承LinearLayoutManager写一个子类重写它的滑动,让它不要太快
+ // LinearLayoutManager layoutManager = new LinearLayoutManager(this@CustomBannerActivity, LinearLayoutManager.HORIZONTAL, false);
+ var smoothLinearLayoutManager: SmoothLinearLayoutManager? = null
+ if (list.size > 1) {
+ smoothLinearLayoutManager = SmoothLinearLayoutManager(
+ this@CustomBannerActivity, LinearLayoutManager.HORIZONTAL, false
+ )
+ recyclerView.layoutManager = smoothLinearLayoutManager
+ } else {
+ val linearLayoutManager: LinearLayoutManager =
+ object : LinearLayoutManager(this@CustomBannerActivity) {
+ override fun canScrollVertically(): Boolean {
+ return false
+ }
+ }
+ recyclerView.layoutManager = linearLayoutManager
+ recyclerView.isNestedScrollingEnabled = false //禁止滑动
+ }
+ recyclerView.setHasFixedSize(true)
+ recyclerView.adapter = adapter
+ // 由于广告是一页一页的划过去,所以我们还需要用SnapHelper的子类PagerSnapHelper。直接追加到上面的recyclerView.setAdapter(adapter) 后面。
+ val snapHelper = PagerSnapHelper()
+ snapHelper.attachToRecyclerView(recyclerView)
+ // recyclerView.scrollToPosition(list.size()*10)这句使RecyclerView一开始位于 list.size()*10 处,避免了一开始position为0不能前滑的尴尬
+ recyclerView.scrollToPosition(list.size * 10)
+ if (list.size > 1) {
+ // 指示器 显示指示器上的红点需要得到当前展示的广告轮播图片的position。RecyclerView有个addOnScrollListener()方法,可以监听当前滑动状态
+ indicator(recyclerView, smoothLinearLayoutManager, list)
+ // 自动轮播
+ autoScroll(recyclerView, smoothLinearLayoutManager)
+ }
+ }
+
+ /**
+ * 比较数据,如果相同则不更新,如果不相同则更新
+ * pictureList 原始数据
+ * list 新的数据
+ */
+ private fun compareData(
+ rawDataList: MutableList, newDatalist: MutableList
+ ) {
+ val rawDataListClone = mutableListOf()
+ for (index in 0 until rawDataList.size) {
+ rawDataListClone.add(rawDataList[index].clone())
+ }
+ val newDatalistClone = mutableListOf()
+ for (index in 0 until newDatalist.size) {
+ newDatalistClone.add(newDatalist[index].clone())
+ }
+
+ if (rawDataListClone.size == newDatalistClone.size) {
+ for (index in rawDataListClone.size - 1 downTo 0) {
+ for (index2 in newDatalistClone.size - 1 downTo 0) {
+ if (rawDataListClone[index] == newDatalistClone[index2]) {
+ rawDataListClone.removeAt(index)
+ newDatalistClone.removeAt(index2)
+ break
+ }
+ }
+ }
+ if (rawDataListClone.size > 0 || newDatalistClone.size > 0) {
+ LogManager.i(TAG, "compareData rawDataListClone.size*****${rawDataListClone.size}")
+ LogManager.i(TAG, "compareData newDatalistClone.size*****${newDatalistClone.size}")
+
+ scheduledExecutorService?.shutdownNow()
+ this.pictureList.clear()
+ this.pictureList.addAll(newDatalist)
+ addBannerView(this.pictureList)
+ } else {
+ LogManager.i(TAG, "compareData 两个List完全相同")
+ }
+ } else {
+ LogManager.i(TAG, "compareData 重新设置数据")
+
+ scheduledExecutorService?.shutdownNow()
+ this.pictureList.clear()
+ this.pictureList.addAll(newDatalistClone)
+ addBannerView(this.pictureList)
+ }
+ }
+
+ private fun delayedUpdate() {
+ scheduledExecutorService2 = Executors.newScheduledThreadPool(1)
+ scheduledExecutorService2?.scheduleAtFixedRate({
+ handler.post {
+ this@CustomBannerActivity.time++
+ LogManager.i(TAG, "delayedUpdate time*****${this@CustomBannerActivity.time}")
+ val list = mutableListOf()
+ if (this@CustomBannerActivity.time == 1) {
+ list.add(PictureBean("1", R.mipmap.pucture_sunrise1))
+ list.add(PictureBean("2", R.mipmap.pucture_sunrise2))
+ list.add(PictureBean("0", R.mipmap.pucture_sunrise3))
+ list.add(PictureBean("5", R.mipmap.pucture_sunrise5))
+ list.add(PictureBean("6", R.mipmap.pucture_sunrise6))
+
+// list.add(PictureBean("7", R.mipmap.picture_fujiyama1))
+// list.add(PictureBean("8", R.mipmap.picture_fujiyama2))
+// list.add(PictureBean("9", R.mipmap.picture_fujiyama3))
+// list.add(PictureBean("10", R.mipmap.picture_fujiyama5))
+// list.add(PictureBean("11", R.mipmap.picture_fujiyama6))
+ } else if (this@CustomBannerActivity.time == 2) {
+ list.add(PictureBean("15", R.mipmap.library_picture_new))
+ list.add(PictureBean("16", R.mipmap.library_picture_new2))
+ list.add(PictureBean("17", R.mipmap.library_picture_new3))
+ } else if (this@CustomBannerActivity.time == 3) {
+ list.add(PictureBean("21", R.mipmap.library_picture24))
+ list.add(PictureBean("22", R.mipmap.library_picture25))
+ list.add(PictureBean("23", R.mipmap.library_picture26))
+ list.add(PictureBean("24", R.mipmap.library_picture27))
+ list.add(PictureBean("25", R.mipmap.library_picture28))
+ list.add(PictureBean("26", R.mipmap.library_picture30))
+ } else {
+ list.add(PictureBean("21", R.mipmap.library_picture24))
+ list.add(PictureBean("22", R.mipmap.library_picture25))
+ list.add(PictureBean("23", R.mipmap.library_picture26))
+ list.add(PictureBean("24", R.mipmap.library_picture27))
+ list.add(PictureBean("25", R.mipmap.library_picture28))
+ list.add(PictureBean("26", R.mipmap.library_picture30))
+ }
+
+ compareData(pictureList, list)
+ }
+ }, 30000, 50000, TimeUnit.MILLISECONDS) // 表示2秒后每过2秒运行一次run()里的程序
+ }
+
+ private fun autoScroll(recyclerView: RecyclerView, layoutManager: LinearLayoutManager?) {
+ scheduledExecutorService = Executors.newScheduledThreadPool(1)
+ scheduledExecutorService?.scheduleAtFixedRate({ // layoutManager.findFirstVisibleItemPosition() 表示得到当前RecyclerView第一个能看到的item的位置。
+ // 由于广告是每次展示一张,所以得到的就是当前图片的position。
+ // recyclerView.smoothScrollToPosition(int position)表示滑动到某个position。
+ // 所以上面的代码就表示每过2秒滑动到下个position,以此来完成自动轮播。
+ handler.post {
+ layoutManager?.let {
+ recyclerView.smoothScrollToPosition(it.findFirstVisibleItemPosition() + 1)
+ }
+ }
+ }, 4000, 4000, TimeUnit.MILLISECONDS) // 表示2秒后每过2秒运行一次run()里的程序
+ }
+
+ private fun indicator(
+ recyclerView: RecyclerView, layoutManager: LinearLayoutManager?, list: List
+ ) {
+ val bannerIndicator = BannerIndicator(this@CustomBannerActivity, null)
+ bannerIndicator.setNumber(list.size)
+ layoutIndicator?.removeAllViews()
+ layoutIndicator?.addView(bannerIndicator)
+ recyclerView.addOnScrollListener(object : RecyclerView.OnScrollListener() {
+ override fun onScrolled(recyclerView: RecyclerView, dx: Int, dy: Int) {
+ super.onScrolled(recyclerView, dx, dy)
+ //dx为横向滚动 dy为竖向滚动
+ //如果为竖向滚动,则isSliding属性为true,横向滚动则为false
+ val isSliding = dx > 0
+ if (isSliding) {
+ scheduledExecutorService?.shutdownNow()
+ autoScroll(recyclerView, layoutManager)
+ }
+ }
+
+ override fun onScrollStateChanged(recyclerView: RecyclerView, newState: Int) {
+ // onScrollStateChangedd的 newState 参数有三种状态:
+ // SCROLL_STATE_IDLE 静止状态
+ // SCROLL_STATE_DRAGGING 拖拽状态
+ // SCROLL_STATE_SETTLING手指离开后的惯性滚动状态
+ // 当RecyclerView的状态为SCROLL_STATE_IDLE时得到当前图片的position,然后与图片列表取余就得到指示器红点的位置。
+ if (newState == RecyclerView.SCROLL_STATE_IDLE && layoutManager != null) {
+ val i = layoutManager.findFirstVisibleItemPosition() % list.size
+ //得到指示器红点的位置
+ bannerIndicator.setPosition(i)
+ }
+ }
+ })
+ }
+
+ override fun onDestroy() {
+ scheduledExecutorService?.shutdownNow()
+ scheduledExecutorService2?.shutdownNow()
+ super.onDestroy()
+ }
+}
\ No newline at end of file
diff --git a/module_square/src/main/java/library/AndroidManifest.xml b/module_square/src/main/java/library/AndroidManifest.xml
index 82bbc189f3a82859b1e74c33ca4672fd8e7ec666..f63641520ccdf8127daef23845788b0f33ae0b95 100644
--- a/module_square/src/main/java/library/AndroidManifest.xml
+++ b/module_square/src/main/java/library/AndroidManifest.xml
@@ -43,6 +43,11 @@
android:exported="false"
android:launchMode="singleTask"
android:screenOrientation="portrait" />
+
\ No newline at end of file
diff --git a/module_square/src/main/java/module/AndroidManifest.xml b/module_square/src/main/java/module/AndroidManifest.xml
index eee59c0f39751bca6b9dba67d55d0f53d8c0d6b2..887647538e009eef17685e51179937b2517ba5d2 100644
--- a/module_square/src/main/java/module/AndroidManifest.xml
+++ b/module_square/src/main/java/module/AndroidManifest.xml
@@ -57,6 +57,11 @@
android:exported="false"
android:launchMode="singleTask"
android:screenOrientation="portrait" />
+
\ No newline at end of file
diff --git a/module_square/src/main/res/layout/square_activity_custom_banner.xml b/module_square/src/main/res/layout/square_activity_custom_banner.xml
new file mode 100644
index 0000000000000000000000000000000000000000..aafb997fc0e35ef772f5cba868c6b8c1d16f89b1
--- /dev/null
+++ b/module_square/src/main/res/layout/square_activity_custom_banner.xml
@@ -0,0 +1,80 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/module_square/src/main/res/layout/square_fragment_square.xml b/module_square/src/main/res/layout/square_fragment_square.xml
index 1ab292652972e96971f913e9d8dae1ae443d2ba9..31cb78b3ab7d895745b96381bf5cdc3673a18165 100644
--- a/module_square/src/main/res/layout/square_fragment_square.xml
+++ b/module_square/src/main/res/layout/square_fragment_square.xml
@@ -415,6 +415,27 @@
android:layout_height="@dimen/base_dp_1"
android:background="@color/library_color_555555" />
+
+
+
+
+
+
+
+
+
diff --git a/module_square/src/main/res/mipmap-xxhdpi/picture_fujiyama1.jpeg b/module_square/src/main/res/mipmap-xxhdpi/picture_fujiyama1.jpeg
new file mode 100644
index 0000000000000000000000000000000000000000..296eecb76509ce20b725db97ae2e8ce5edf7d139
Binary files /dev/null and b/module_square/src/main/res/mipmap-xxhdpi/picture_fujiyama1.jpeg differ
diff --git a/module_square/src/main/res/mipmap-xxhdpi/picture_fujiyama2.jpg b/module_square/src/main/res/mipmap-xxhdpi/picture_fujiyama2.jpg
new file mode 100644
index 0000000000000000000000000000000000000000..81a9b108b28c04eadde02d5c17b7cfe9701e3ac2
Binary files /dev/null and b/module_square/src/main/res/mipmap-xxhdpi/picture_fujiyama2.jpg differ
diff --git a/module_square/src/main/res/mipmap-xxhdpi/picture_fujiyama3.jpeg b/module_square/src/main/res/mipmap-xxhdpi/picture_fujiyama3.jpeg
new file mode 100644
index 0000000000000000000000000000000000000000..a5f8da6b35338ea6cc7e5e5be47ca3056643e605
Binary files /dev/null and b/module_square/src/main/res/mipmap-xxhdpi/picture_fujiyama3.jpeg differ
diff --git a/module_square/src/main/res/mipmap-xxhdpi/picture_fujiyama5.jpeg b/module_square/src/main/res/mipmap-xxhdpi/picture_fujiyama5.jpeg
new file mode 100644
index 0000000000000000000000000000000000000000..892f211257175bc15781a27795662607016ded9f
Binary files /dev/null and b/module_square/src/main/res/mipmap-xxhdpi/picture_fujiyama5.jpeg differ
diff --git a/module_square/src/main/res/mipmap-xxhdpi/picture_fujiyama6.jpeg b/module_square/src/main/res/mipmap-xxhdpi/picture_fujiyama6.jpeg
new file mode 100644
index 0000000000000000000000000000000000000000..2b2eca4e3d27418ecda2d671199e7c6f153f84aa
Binary files /dev/null and b/module_square/src/main/res/mipmap-xxhdpi/picture_fujiyama6.jpeg differ
diff --git a/module_square/src/main/res/mipmap-xxhdpi/pucture_sunrise1.jpeg b/module_square/src/main/res/mipmap-xxhdpi/pucture_sunrise1.jpeg
new file mode 100644
index 0000000000000000000000000000000000000000..3ce0b44e7205cc72499c1d0f8d3d5bb8e98ccccc
Binary files /dev/null and b/module_square/src/main/res/mipmap-xxhdpi/pucture_sunrise1.jpeg differ
diff --git a/module_square/src/main/res/mipmap-xxhdpi/pucture_sunrise2.jpg b/module_square/src/main/res/mipmap-xxhdpi/pucture_sunrise2.jpg
new file mode 100644
index 0000000000000000000000000000000000000000..41b44c59c6867a354e2ad185b14e382c58cddbaf
Binary files /dev/null and b/module_square/src/main/res/mipmap-xxhdpi/pucture_sunrise2.jpg differ
diff --git a/module_square/src/main/res/mipmap-xxhdpi/pucture_sunrise3.jpg b/module_square/src/main/res/mipmap-xxhdpi/pucture_sunrise3.jpg
new file mode 100644
index 0000000000000000000000000000000000000000..7da06bacd95219bf104261f8f00804a8e14c2681
Binary files /dev/null and b/module_square/src/main/res/mipmap-xxhdpi/pucture_sunrise3.jpg differ
diff --git a/module_square/src/main/res/mipmap-xxhdpi/pucture_sunrise5.jpeg b/module_square/src/main/res/mipmap-xxhdpi/pucture_sunrise5.jpeg
new file mode 100644
index 0000000000000000000000000000000000000000..3d3baa4fc7524dd0b4d95199054755eff9c5c247
Binary files /dev/null and b/module_square/src/main/res/mipmap-xxhdpi/pucture_sunrise5.jpeg differ
diff --git a/module_square/src/main/res/mipmap-xxhdpi/pucture_sunrise6.jpg b/module_square/src/main/res/mipmap-xxhdpi/pucture_sunrise6.jpg
new file mode 100644
index 0000000000000000000000000000000000000000..8637803edad6093eab32accecbad3cf63cbddb73
Binary files /dev/null and b/module_square/src/main/res/mipmap-xxhdpi/pucture_sunrise6.jpg differ