日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

无线轮播android,Android无限轮播Banner的实现

發布時間:2025/3/20 48 豆豆
生活随笔 收集整理的這篇文章主要介紹了 无线轮播android,Android无限轮播Banner的实现 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

概述

應用首頁的廣告輪播Banner,一般都會使用ViewPager來實現,但是ViewPager 沒有輪播效果。

現成有這么幾種實現方案:

1.使用Integer.MAX_VALUE ,理論上很難達到邊界。

2.裝飾adapter方式imbryk/LoopingViewPager@Github。

3.擴展ViewPager方式yanzm/LoopViewPager。

相關庫

輪播效果其實就是一個定時任務,可以用定時器,Handler等。

此庫通過handler定時發送消息實現,用的比較多,使用中感覺切換并非無縫。主要代碼如下:

/**

* scroll only once

*/

public void scrollOnce() {

PagerAdapter adapter = getAdapter();

int currentItem = getCurrentItem();

int totalCount;

if (adapter == null || (totalCount = adapter.getCount()) <= 1) {

return;

}

int nextItem = (direction == LEFT) ? --currentItem : ++currentItem;

if (nextItem < 0) {

if (isCycle) {

setCurrentItem(totalCount - 1, isBorderAnimation);

}

} else if (nextItem == totalCount) {

if (isCycle) {

setCurrentItem(0, isBorderAnimation);

}

} else {

setCurrentItem(nextItem, true);

}

}

這里是在最后或第一頁直接setCurrentItem(),因此,并非無縫輪播效果。

和本文開頭的幾個控件整合一下,即可方便 的實現我們想要無縫 的效果。

基本實現

改變首頁和最后一頁的跳轉設置。

/**

* scroll only once

*/

public void scrollOnce() {

PagerAdapter adapter = getAdapter();

int currentItem = getCurrentItem();

if (adapter == null || adapter.getCount() <= 1) {

return;

}

int nextItem = (direction == LEFT) ? --currentItem : ++currentItem;

setCurrentItem(nextItem, true);

}

2.實現方式選擇

第一種方式其實主要改變了adapter中的index,大體如下:

@Override

public int getCount() {

return Integer.MAX_VALUE;

}

@Override

public Object instantiateItem(ViewGroup container, int position) {

position = position % listviews.size() ;

//....

}

只是理論上的無限,需要自己處理position。

第二種裝飾了adapter,在前后各添加一個Item,當到了我們添加的臨界item的時候,立即設置到正確的 position ,主要方法如下:

LoopPagerAdapterWrapper:

int toRealPosition(int position) {

int realCount = getRealCount();

if (realCount == 0)

return 0;

int realPosition = (position-1) % realCount;

if (realPosition < 0)

realPosition += realCount;

return realPosition;

}

這里,內部封裝position映射,不需要自己處理position,和正常ViewPager使用方式一樣。

第三種,重寫擴展ViewPager 繼承 ViewGroup,使其item無限。需要自己處理position,而且 和 JakeWharton/ViewPagerIndicator@Github搭配使用起來不是很方便,setViewPager方法需要額外處理。

綜上,使用第二種方式 擴展性和 易用性都比較好。

Indicator

JakeWharton/ViewPagerIndicator@Github

這是一個比較全面的indicator,如果我們只需要簡單的CircleIndicator,可以抽取來使用。

優秀相關開源庫:

也可以看看本人站在巨人肩膀上完成的DrawableIndicator@Github:可以實時偏移,切換動畫,drawable資源。

效果圖:

DrawableIndicator

測試

my_banner.xml:

xmlns:app="http://schemas.android.com/apk/res-auto"

android:layout_width="match_parent"

android:layout_height="match_parent">

android:id="@+id/picslooper1"

android:layout_width="match_parent"

android:layout_height="wrap_content" />

android:id="@+id/pageIndexor1"

android:layout_width="match_parent"

android:layout_height="wrap_content"

android:layout_centerVertical="true"

app:indicator_height="15dp"

app:indicator_margin="15dp"

app:indicator_select_src="@drawable/select_drawable"

app:indicator_unselect_src="@drawable/unselect_drawable"

app:indicator_width="15dp" />

MainActivity:

AutoScrollViewPager viewPager = (AutoScrollViewPager) findViewById(R.id.picslooper1);

viewPager.setFocusable(true);

viewPager.setAdapter(new FragmentStateAdapter(getSupportFragmentManager()));

BaseIndicator pageIndex = (BaseIndicator) findViewById(R.id.pageIndexor1);

pageIndex.setViewPager(viewPager);

viewPager.startAutoScroll();

最終效果圖

AutoScrollLoopViewPager

總結

以上是生活随笔為你收集整理的无线轮播android,Android无限轮播Banner的实现的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。