Android實(shí)現(xiàn)無限循環(huán)滾動(dòng)
傳統(tǒng)的ViewPager做循環(huán)滾動(dòng)有兩種思路。
一種是設(shè)置count為Integer.MAX,然后根據(jù)index對實(shí)際數(shù)量取模
一種是在開頭在開頭添加end,在末尾添加start。簡單的說就是多兩個(gè),滑動(dòng)到這兩個(gè)的時(shí)候直接setCurrentItem到真正的位置。
在觀察pdd的拼單的循環(huán)滾動(dòng)的時(shí)候,想到幾種實(shí)現(xiàn)方式。
1、通過Recyclerview,同樣跟ViewPager做循環(huán)滾動(dòng)的思路類似,多一點(diǎn)要攔截掉所有的觸摸事件。但是這種方式的話無法像pdd的效果那樣設(shè)置進(jìn)入和出去的動(dòng)畫。
2、通過改造VerticalViewpager的形式,應(yīng)該也是可以的,但是感覺比較麻煩。
3、通過自定義的方式實(shí)現(xià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的取值。
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- Android ListView實(shí)現(xiàn)無限循環(huán)滾動(dòng)
- Android可自定義垂直循環(huán)滾動(dòng)布局
- Android ViewPager無限循環(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)智能無限循環(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邊播放邊緩存視頻框架AndroidVideoCache詳解
這篇文章主要為大家介紹了Android邊播放邊緩存視頻框架AndroidVideoCache詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-09-09Android時(shí)分秒計(jì)時(shí)器的兩種實(shí)現(xiàn)方法
這篇文章主要介紹了Android時(shí)分秒計(jì)時(shí)器的兩種實(shí)現(xiàn)方法,分別是Chronometer控件和handler+timer+timerTask方式,非常不錯(cuò),感興趣的朋友一起看下吧2016-08-08Adapter模式實(shí)戰(zhàn)之重構(gòu)鴻洋集團(tuán)的Android圓形菜單建行
這篇文章主要介紹了Adapter模式實(shí)戰(zhàn)之重構(gòu)鴻洋集團(tuán)的Android圓形菜單建行的相關(guān)資料,需要的朋友可以參考下2016-03-03Android開發(fā)之OkHttpUtils的具體使用方法
這篇文章主要介紹了Android開發(fā)之OkHttpUtils的具體使用方法,非常具有實(shí)用價(jià)值,需要的朋友可以參考下2017-08-08Android編程之殺毒的實(shí)現(xiàn)原理及具體實(shí)例
這篇文章主要介紹了Android編程之殺毒的實(shí)現(xiàn)原理及具體實(shí)例,結(jié)合實(shí)例形式分析了Android殺毒功能的原理與簡單實(shí)現(xiàn)技巧,需要的朋友可以參考下2015-12-12Android String資源文件插入值實(shí)例詳解
這篇文章主要介紹了Android String資源文件插入值實(shí)例詳解的相關(guān)資料,需要的朋友可以參考下2017-06-06跨平臺(tái)移動(dòng)WEB應(yīng)用開發(fā)框架iMAG入門教程
這篇文章主要介紹了跨平臺(tái)移動(dòng)WEB應(yīng)用開發(fā)框架iMAG入門教程,iMAG最大的特點(diǎn)是生成各移動(dòng)平臺(tái)的原生代碼,需要的朋友可以參考下2014-07-07Android WebView實(shí)現(xiàn)網(wǎng)頁滾動(dòng)截圖
這篇文章主要為大家詳細(xì)介紹了Android WebView實(shí)現(xiàn)網(wǎng)頁滾動(dòng)截圖,對整個(gè)網(wǎng)頁進(jìn)行截屏,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-05-05