圖片來源:CCC創作集
大家平常應該很常看到一些app首頁上方會有一些廣告,用圖片輪播的方式來展示,
我們統稱banner。
今天用的套件叫做bannerViewpager,是個github大大寫的好用banner輪播套件,這裡介紹的是他寫的3.1.5版本。這裡附上他的github連結。
支援手指滑動換頁、特定頁面點擊事件、內建的下方indicator滑塊與其他許多實用功能。
不過今天我們banner下方的綠色滑塊是自己另外寫的就是了。
以下說明食用方法。
allprojects {
repositories {
...
maven { url 'https://jitpack.io' }
}
}
implementation 'com.zhpan.library:bannerview:2.4.3.1'
先寫假資料
class HomePageData{
data class Banner(
val img:Int
)
fun setBannerData():MutableList<Banner>{
val list = mutableListOf<Banner>(
Banner(R.drawable.bn_1),
Banner(R.drawable.bn_2),
Banner(R.drawable.bn_3),
Banner(R.drawable.bn_4),
Banner(R.drawable.bn_5)
)
return list
}
}
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/vg_banner">
<ImageView
android:id="@+id/imgv_banner"
android:layout_width="match_parent"
android:layout_height="0dp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"/>
</androidx.constraintlayout.widget.ConstraintLayout>
需要設定adapter
class BannerAdapter() : BaseBannerAdapter<HomePageData.Banner?, BannerAdapter.BannerViewholder>() {
inner class BannerViewholder(itemView: View) : BaseViewHolder<HomePageData.Banner?>(itemView) {
lateinit var vgBanner: ConstraintLayout
lateinit var imgBanner: ImageView
init {
imgBanner = itemView.findViewById(com.tcb.official.R.id.imgv_banner)
}
override fun bindData(data: HomePageData.Banner?, position: Int, pageSize: Int) {
imgBanner.setImageResource(data!!.img)
}
}
override fun onBind(
holder: BannerViewholder,
data: HomePageData.Banner?,
position: Int,
pageSize: Int
) {
holder.bindData(data, position, pageSize)
}
override fun createViewHolder(itemView: View, viewType: Int): BannerViewholder {
return BannerViewholder(itemView)
}
override fun getLayoutId(viewType: Int): Int {
return R.layout.viewholder_banner
}
}
寫一個selector,設定activated狀態,當狀態被觸發時變綠色。
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_activated="false" android:drawable="@color/color1A000000"/>
<item android:state_activated="true" android:drawable="@color/color64C1BE"/>
</selector>
放入BannerViewPager與自定義綠色滑塊
<com.zhpan.bannerview.BannerViewPager
android:id="@+id/banner_viewpager"
android:layout_width="match_parent"
android:layout_height="0dp"
app:layout_constraintDimensionRatio="2:1"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent">
</com.zhpan.bannerview.BannerViewPager>
<!-- banner下方的5個綠色滑塊 -->
<androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/constraintLayout4"
android:layout_width="match_parent"
android:layout_height="34dp"
android:layout_marginStart="16dp"
android:layout_marginEnd="16dp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/banner_viewpager">
<View
android:id="@+id/v1"
android:layout_width="0dp"
android:layout_height="2dp"
android:layout_marginEnd="4dp"
android:background="@drawable/sl_banner_light"
android:gravity="center"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toStartOf="@id/v2"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<View
android:id="@+id/v2"
android:layout_width="0dp"
android:layout_height="2dp"
android:layout_marginStart="4dp"
android:layout_marginEnd="4dp"
android:background="@drawable/sl_banner_light"
android:gravity="center"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toStartOf="@id/v3"
app:layout_constraintStart_toEndOf="@id/v1"
app:layout_constraintTop_toTopOf="parent" />
<View
android:id="@+id/v3"
android:layout_width="0dp"
android:layout_height="2dp"
android:layout_marginStart="4dp"
android:layout_marginEnd="4dp"
android:background="@drawable/sl_banner_light"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toStartOf="@id/v4"
app:layout_constraintStart_toEndOf="@id/v2"
app:layout_constraintTop_toTopOf="parent" />
<View
android:id="@+id/v4"
android:layout_width="0dp"
android:layout_height="2dp"
android:layout_marginStart="4dp"
android:layout_marginEnd="4dp"
android:background="@drawable/sl_banner_light"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toStartOf="@id/v5"
app:layout_constraintStart_toEndOf="@id/v3"
app:layout_constraintTop_toTopOf="parent" />
<View
android:id="@+id/v5"
android:layout_width="0dp"
android:layout_height="2dp"
android:layout_marginStart="4dp"
android:background="@drawable/sl_banner_light"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toEndOf="@id/v4"
app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
class MainActivity : AppCompatActivity() {
lateinit var bannerViewpager :BannerViewPager<HomePageData.Banner?, BannerAdapter.BannerViewholder>
lateinit var list: MutableList<HomePageData.Banner>
val homePageData = HomePageData()
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
list = homePageData.setBannerData()
bannerViewpager = findViewById(R.id.banner_viewpager)
setupViewPager()
}
private fun setupViewPager() {
bannerViewpager.apply {
adapter = BannerAdapter()
setAutoPlay(true)
setLifecycleRegistry(lifecycle)
setIndicatorVisibility(View.INVISIBLE)
//設定頁面點擊事件
setOnPageClickListener (object :BannerViewPager.OnPageClickListener{
override fun onPageClick(position: Int) {
when(position){
0->{}
1->{}
//.......do something
}
}
})
//監聽banner換頁 設定底下的綠色長條indicator
registerOnPageChangeCallback(object : ViewPager2.OnPageChangeCallback() {
override fun onPageSelected(position: Int) {
BannerUtils.log("position:$position")
when(position){
0-> {
v2.isActivated = false
v1.isActivated = true
v5.isActivated = false
}
1-> {
v1.isActivated = false
v2.isActivated = true
v3.isActivated = false
}
2-> {
v2.isActivated = false
v3.isActivated = true
v4.isActivated = false
}
3-> {
v3.isActivated = false
v4.isActivated = true
v5.isActivated = false
}
4->{
v4.isActivated = false
v5.isActivated = true
v1.isActivated = false
}
}
}
})
}.create(list as List<HomePageData.Banner?>?)
}
}