Android實(shí)現(xiàn)無(wú)限循環(huán)滾動(dòng)
傳統(tǒng)的ViewPager做循環(huán)滾動(dòng)有兩種思路。
一種是設(shè)置count為Integer.MAX,然后根據(jù)index對(duì)實(shí)際數(shù)量取模
一種是在開頭在開頭添加end,在末尾添加start。簡(jiǎn)單的說就是多兩個(gè),滑動(dòng)到這兩個(gè)的時(shí)候直接setCurrentItem到真正的位置。
在觀察pdd的拼單的循環(huán)滾動(dòng)的時(shí)候,想到幾種實(shí)現(xiàn)方式。
1、通過Recyclerview,同樣跟ViewPager做循環(huán)滾動(dòng)的思路類似,多一點(diǎn)要攔截掉所有的觸摸事件。但是這種方式的話無(wú)法像pdd的效果那樣設(shè)置進(jìn)入和出去的動(dòng)畫。
2、通過改造VerticalViewpager的形式,應(yīng)該也是可以的,但是感覺比較麻煩。
3、通過自定義的方式實(shí)現(xiàn)。(原本以為挺簡(jiǎn)單的,實(shí)現(xiàn)了下,代碼不多但是有些小細(xì)節(jié)需要注意下。)
我選擇了自定義的這里只是一個(gè)demo,提供一種思路。
最核心的就是上面的item滑出屏幕的時(shí)候?qū)⑺黵emove掉然后再加到自定義的ViewGroup的末尾。
public class LoopView extends ViewGroup {
private static final String TAG = "LoopView";
private float dis;
private ObjectAnimator animator;
private int currentIndex = 0;
private Handler handler = new Handler(Looper.getMainLooper());
public LoopView(Context context) {
super(context);
init();
}
public LoopView(Context context, AttributeSet attrs) {
super(context, attrs);
init();
}
public LoopView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
init();
}
void init() {
View view1 = new View(getContext());
view1.setTag("gray");
view1.setBackgroundColor(Color.GRAY);
LayoutParams layoutParams = new LayoutParams(LayoutParams.MATCH_PARENT, 200);
addView(view1, layoutParams);
View view2 = new View(getContext());
view2.setTag("red");
view2.setBackgroundColor(Color.RED);
LayoutParams layoutParams1 = new LayoutParams(LayoutParams.MATCH_PARENT, 200);
addView(view2, layoutParams1);
View view3 = new View(getContext());
view3.setTag("green");
view3.setBackgroundColor(Color.GREEN);
LayoutParams layoutParams2 = new LayoutParams(LayoutParams.MATCH_PARENT, 200);
addView(view3, layoutParams2);
animator = ObjectAnimator.ofFloat(this, "dis", 0, 1);
animator.setDuration(2000);
animator.addListener(new AnimatorListenerAdapter() {
@Override
public void onAnimationEnd(Animator animation) {
currentIndex++;
View first = getChildAt(0);
removeView(first);
addView(first);
handler.postDelayed(new Runnable() {
@Override
public void run() {
animator.clone().start();
}
}, 3000);
}
});
}
public void start() {
animator.start();
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
measureChildren(widthMeasureSpec, heightMeasureSpec);
super.onMeasure(widthMeasureSpec, MeasureSpec.makeMeasureSpec(200, MeasureSpec.EXACTLY));
}
@Override
protected void onLayout(boolean changed, int l, int t, int r, int b) {
int childCount = getChildCount();
int top = currentIndex * getMeasuredHeight();
for (int i = 0; i < childCount; i++) {
View childAt = getChildAt(i);
childAt.layout(l, top, r, top + childAt.getMeasuredHeight());
top += childAt.getMeasuredHeight();
}
}
public float getDis() {
return dis;
}
public void setDis(float dis) {
this.dis = dis;
float disY = dis * getHeight();
scrollTo(0, (int) (currentIndex * getHeight() + disY));
}
}
需要注意的就是onLayout的時(shí)候?qū)τ趖op的取值。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- Android ListView實(shí)現(xiàn)無(wú)限循環(huán)滾動(dòng)
- Android可自定義垂直循環(huán)滾動(dòng)布局
- Android ViewPager無(wú)限循環(huán)滑動(dòng)并可自動(dòng)滾動(dòng)完整實(shí)例
- android水平循環(huán)滾動(dòng)控件使用詳解
- Android使用Recyclerview實(shí)現(xiàn)圖片水平自動(dòng)循環(huán)滾動(dòng)效果
- Android ViewPager實(shí)現(xiàn)智能無(wú)限循環(huán)滾動(dòng)回繞效果
- Android自定義可循環(huán)的滾動(dòng)選擇器CycleWheelView
- Android高仿京東垂直循環(huán)滾動(dòng)新聞欄
- Android 使用ViewPager自動(dòng)滾動(dòng)循環(huán)輪播效果
相關(guān)文章
Android實(shí)現(xiàn)流動(dòng)的漸變色邊框效果
本文將帶大家學(xué)習(xí)一下如何利用toast中的motion_toast組件實(shí)現(xiàn)一個(gè)流動(dòng)的漸變色邊框效果,文中的示例代碼講解詳細(xì),快跟隨小編一起學(xué)習(xí)學(xué)習(xí)吧2022-06-06
安裝android開發(fā)環(huán)境原始版(windows版)
安裝android開發(fā)環(huán)境原始版(windows版)的詳細(xì)步驟2013-03-03
Android實(shí)現(xiàn)3D云標(biāo)簽效果
這篇文章主要為大家詳細(xì)介紹了Android實(shí)現(xiàn)3D云標(biāo)簽效果,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-05-05
Android Broadcast原理分析之registerReceiver詳解
這篇文章主要介紹了Android Broadcast原理分析之registerReceiver詳解,本篇文章通過簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-08-08
Android實(shí)現(xiàn)讀取SD卡下所有TXT文件名并用listView顯示出來(lái)的方法
這篇文章主要介紹了Android實(shí)現(xiàn)讀取SD卡下所有TXT文件名并用listView顯示出來(lái)的方法,涉及Android針對(duì)SD卡的讀取及文件遍歷等相關(guān)操作技巧,需要的朋友可以參考下2017-06-06
Android管理與操作Wifi簡(jiǎn)單實(shí)例源碼
這篇文章主要介紹了Android管理與操作Wifi簡(jiǎn)單實(shí)例源碼的相關(guān)資料,需要的朋友可以參考下2016-02-02
Android自定義View app更新動(dòng)畫詳解
這篇文章給大家分享了Android自定義View app更新動(dòng)畫的相關(guān)代碼以及知識(shí)點(diǎn)內(nèi)容,有興趣的朋友參考學(xué)習(xí)下。2018-07-07

