A carousel widget for Android based on ViewPager2.
dependencies {
implementation 'io.github.vejei.carouselview:carouselview:1.0.0-alpha'
}
Add CarouselView
to your layout:
<io.github.vejei.carouselview.CarouselView
android:id="@+id/carousel_view"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:carouselMode="preview"
app:carouselPreviewSide="sides"
app:carouselPreviewOffset="30dp"
app:carouselPreviewSideBySideStyle="scale"
app:carouselMargin="10dp"
android:layout_marginTop="8dp"/>
Or add it programmatically:
addButton.setOnClickListener {
val carouselView = CarouselView(context).apply {
mode = CarouselView.Mode.PREVIEW
previewSide = CarouselView.PreviewSide.SIDE_BY_SIDE
sideBySideStyle = CarouselView.PreviewSideBySideStyle.SCALE
previewOffset = offset
itemMargin = pageMargin
}
carouselView.layoutParams = LinearLayout.LayoutParams(MATCH_PARENT, WRAP_CONTENT)
carouselView.adapter = PageAdapter().apply {
setData((activity as MainActivity).adapterData)
}
view.findViewById<LinearLayout>(R.id.container).addView(carouselView)
}
And setup in your Fragment
or Activity
:
val carouselView = view.findViewById<CarouselView>(R.id.carousel_view)
val pageAdapter = PageAdapter()
carouselView.adapter = pageAdapter
// Calling the start method to start carousel by passing in the interval.
carouselView.start(3, TimeUnit.SECONDS)
PageAdapter
example:
class PageAdapter : CarouselAdapter<PageAdapter.ViewHolder>() {
private var data = mutableListOf<Page>()
fun setData(data: MutableList<Page>) {
this.data.clear()
this.data.addAll(data)
notifyDataSetChanged()
}
data class Page(val imageRes: Int, val content: String)
inner class ViewHolder(view: View) : RecyclerView.ViewHolder(view) {
private val backgroundImageView = itemView.findViewById<ImageView>(R.id.view_background)
private val contentTextView = itemView.findViewById<TextView>(R.id.text_view_content)
fun bind(page: Page) {
backgroundImageView.clipToOutline = true
backgroundImageView.setImageResource(page.imageRes)
contentTextView.text = page.content
}
}
override fun onCreatePageViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
return ViewHolder(
LayoutInflater.from(parent.context).inflate(R.layout.item_page, parent, false)
)
}
override fun onBindPageViewHolder(holder: ViewHolder, position: Int) {
holder.bind(data[position])
}
override fun getPageCount(): Int {
return data.size
}
}
If you need to set indicator for CarouselView
, you can use ViewPagerIndicator, the example:
val carouselView = view.findViewById<CarouselView>(R.id.carousel_view)
val indicator = view.findViewById<RectIndicator>(R.id.indicator)
val pageAdapter = PageAdapter()
carouselView.adapter = pageAdapter
indicator.setWithViewPager2(carouselView.viewPager2, false)
pageAdapter.setData((activity as MainActivity).adapterData)
indicator.itemCount = pageAdapter.pageCount
Attribute | Description | Type | Example Value |
---|---|---|---|
carouselMode |
Set the carousel view mode. The accepted values include snap and preview , the default value is snap . |
enum |
snap or preview |
carouselPreviewSide |
Set the carousel view preview side. | enum |
sides or right |
carouselPreviewSideBySideStyle |
Set the side by side preview style. | enum |
normal or scale |
carouselPreviewScaleFactor |
Set the side by side preview scale factor. | float |
0.2 |
carouselPreviewOffset |
Set carousel preview offset. | Dimension |
30dp |
carouselMargin |
Set carousel item margin. | Dimension |
10dp |