Android實現(xiàn)ViewPager無限循環(huán)效果(一)
本文實例為大家分享了Android實現(xiàn)ViewPager無限循環(huán)的具體代碼,供大家參考,具體內(nèi)容如下
方式一:
實現(xiàn)原理:
假設(shè)有3張圖片,分別是1,2,3,那么就創(chuàng)建5張圖片,這5張圖片的順序為:3,1,2,3,1,其中1,2,3為我們要實現(xiàn)滑動的圖片,最左面的3和最右面的1是我們另外添加的圖片,開始時,顯示圖片1,當圖片向左滑動依次為1,2,3,當從第3張圖片繼續(xù)向左滑動,會出現(xiàn)我們多添加的圖片1,這時,將當前的index設(shè)置為真正的圖片1所在的位置。
package com.xiaomai.myproject.demo; import android.os.Bundle; import android.os.Handler; import android.support.v4.view.ViewPager; import android.view.MotionEvent; import android.view.View; import android.view.ViewGroup; import android.widget.ImageView; import android.widget.LinearLayout; import com.xiaomai.myproject.R; import com.xiaomai.myproject.adapter.LoopViewPagerAdapter; import com.xiaomai.myproject.base.BaseActivity; import com.xiaomai.myproject.utils.Utils; import java.util.ArrayList; import java.util.List; /** * Created by XiaoMai on 2016/10/7 17:19. * */ public class LoopViewPagerDemoActivity extends BaseActivity { /** * 更新圖片的時間 */ private static final int UPDATE_TIME = 3 * 1000; private ViewPager mViewPager; private LoopViewPagerAdapter mLoopViewPager; /** * 圖片資源集合 */ private int[] mImageIds; /** * 圖片集合 */ private List<ImageView> mImageList; /** * 當前廣告的index */ private int mCurrentPageIndex; /** * 指示Point */ private LinearLayout mLinearLayoutPoints; private Handler mHandler = new Handler(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); } @Override protected void onResume() { super.onResume(); mHandler.postDelayed(myRunnable, UPDATE_TIME); } @Override protected void onPause() { super.onPause(); mHandler.removeCallbacks(myRunnable); } Runnable myRunnable = new Runnable() { @Override public void run() { mViewPager.setCurrentItem(mCurrentPageIndex + 1); } }; @Override protected void initVariables() { super.initVariables(); } @Override protected void initViews() { mLinearLayoutPoints = (LinearLayout) findViewById(R.id.activity_ll_container); mViewPager = (ViewPager) findViewById(R.id.activity_loop_viewpager); } @Override protected void loadData() { super.loadData(); mHandler.postDelayed(new Runnable() { @Override public void run() { /** * 初始化圖片的資源id */ mImageIds = new int[]{ R.mipmap.ic_launcher, R.mipmap.ic_launcher, R.drawable.my_toast, R.drawable.my_toast}; /** * 添加ImageView */ mImageList = new ArrayList<>(); //額外添加兩張圖片 int pagerCount = mImageIds.length + 2; ViewGroup.LayoutParams layoutParams = new ViewGroup.LayoutParams( ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT); for (int i = 0; i < pagerCount; i++) { ImageView imageView = new ImageView(mContext); imageView.setLayoutParams(layoutParams); mImageList.add(imageView); } //圓點的直徑 int diameter = Utils.dip2px(mContext,10f); LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(diameter, diameter); int margin = Utils.dip2px(mContext,5f); params.setMargins(margin,margin,margin,margin); mLinearLayoutPoints.removeAllViews(); for (int i = 0; i < mImageList.size(); i++) { View view = new View(mContext); view.setLayoutParams(params); if (i != 0 && i != mImageList.size() - 1) { view.setBackgroundResource(R.drawable.circle_normal); } mLinearLayoutPoints.addView(view); } mLinearLayoutPoints.setVisibility(View.VISIBLE); mViewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() { @Override public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { } @Override public void onPageSelected(int position) { mHandler.removeCallbacks(myRunnable); mHandler.postDelayed(myRunnable, UPDATE_TIME); mCurrentPageIndex = position; if (position == 0) { // 當視圖在第一個時,將頁面號設(shè)置為圖片的最后一張。 mCurrentPageIndex = mImageIds.length; } else if (position == mImageIds.length + 1) { // 當視圖在最后一個時,將頁面號設(shè)置為圖片的第一張。 mCurrentPageIndex = 1; } else { } /** * 當視圖在第一個或者最后一個時,pageIndex和position的值不相等, * 所以要改變viewPager的當前item。 */ if (position != mCurrentPageIndex) { /** * 第二參數(shù)必須設(shè)置為false,意思是立即過渡,不給用戶視覺上的效果。 */ mViewPager.setCurrentItem(mCurrentPageIndex, false); return; } for (int i = 1; i < mLinearLayoutPoints.getChildCount() - 1; i++) { if (i != mCurrentPageIndex){ mLinearLayoutPoints.getChildAt(i).setBackgroundResource(R.drawable.circle_normal); }else { mLinearLayoutPoints.getChildAt(mCurrentPageIndex).setBackgroundResource( R.drawable.circle_select); } } } @Override public void onPageScrollStateChanged(int state) { } }); /** * 當ViewPager被按下的時候,取消自動滾動 * 反之開啟自動滑動。 */ mViewPager.setOnTouchListener(new View.OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { if(event.getAction() == MotionEvent.ACTION_DOWN){ mHandler.removeCallbacks(myRunnable); }else if (event.getAction() == MotionEvent.ACTION_UP){ mHandler.postDelayed(myRunnable, UPDATE_TIME); } return false; } }); mLoopViewPager = new LoopViewPagerAdapter(mImageList, mImageIds); mViewPager.setAdapter(mLoopViewPager); /** * 因為第0個item是另外添加的那張圖片,所以初始化時要把當前item設(shè)置為1。 */ mViewPager.setCurrentItem(1); dissMissProgressDialog(); } }, 3 * 1000); } @Override protected int getContentLayout() { return R.layout.act_loopviewpager; } }
package com.xiaomai.myproject.adapter; import android.support.v4.view.PagerAdapter; import android.view.View; import android.view.ViewGroup; import android.widget.ImageView; import java.util.List; /** * Created by XiaoMai on 2016/10/7 17:23. */ public class LoopViewPagerAdapter extends PagerAdapter { private List<ImageView> mImageList; private int[] mImageIds; public LoopViewPagerAdapter(List<ImageView> mImageList, int[] mImageIds) { this.mImageList = mImageList; this.mImageIds = mImageIds; } @Override public int getCount() { return mImageList == null ? 0 : mImageList.size(); } @Override public boolean isViewFromObject(View view, Object object) { return view == object; } @Override public Object instantiateItem(ViewGroup container, int position) { if (position == 0) { // 如果是第0個item就設(shè)置它的圖片內(nèi)容為最后一個圖片的內(nèi)容 mImageList.get(position).setImageResource(mImageIds[mImageIds.length-1]); } else if (position == (mImageList.size() - 1)) { // 如果是最后一個item就設(shè)置它的圖片內(nèi)容為第一個圖片的內(nèi)容 mImageList.get(position).setImageResource(mImageIds[0]); } else { // 這是正常的圖片 mImageList.get(position).setImageResource(mImageIds[position - 1]); } container.addView(mImageList.get(position)); return mImageList.get(position); } @Override public void destroyItem(ViewGroup container, int position, Object object) { container.removeView(mImageList.get(position)); } }
布局文件
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <include android:id="@+id/titleBar" layout="@layout/my_app_bar" /> <android.support.v4.view.ViewPager android:id="@+id/activity_loop_viewpager" android:layout_width="match_parent" android:layout_height="200dp" android:layout_below="@id/titleBar" /> <LinearLayout android:id="@+id/activity_ll_container" android:layout_width="match_parent" android:orientation="horizontal" android:gravity="center" android:background="@color/toast" android:layout_alignBottom="@id/activity_loop_viewpager" android:visibility="gone" android:layout_height="40dp"/> </RelativeLayout>
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- Android 使用viewpager實現(xiàn)無限循環(huán)(定時+手動)
- Android viewpager中動態(tài)添加view并實現(xiàn)偽無限循環(huán)的方法
- Android ViewPager無限循環(huán)實現(xiàn)底部小圓點動態(tài)滑動
- Android ViewPager無限循環(huán)滑動并可自動滾動完整實例
- Android無限循環(huán)RecyclerView的完美實現(xiàn)方案
- Android ViewPager實現(xiàn)無限循環(huán)效果
- Android實現(xiàn)帶指示點的自動輪播無限循環(huán)效果
- Android實現(xiàn)基于ViewPager的無限循環(huán)自動播放帶指示器的輪播圖CarouselFigureView控件
- Android實戰(zhàn)打飛機游戲之無限循環(huán)的背景圖(2)
- Android TV 3D卡片無限循環(huán)效果
相關(guān)文章
Kotlin+buildSrc更好的管理Gradle依賴譯文
這篇文章主要為大家介紹了Kotlin+buildSrc更好的管理Gradle依賴譯文及示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-06-06Flutter?fluro時報錯type?'String'?is?not?a?subty
這篇文章主要介紹了Flutter使用fluro時報錯type?'String'?is?not?a?subtype?of?type?'Queue<Task>'解決方法詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助2023-12-12android高仿小米時鐘(使用Camera和Matrix實現(xiàn)3D效果)
這篇文章主要介紹了android高仿小米時鐘(使用Camera和Matrix實現(xiàn)3D效果),非常具有實用價值,需要的朋友可以參考下。2017-01-01Android Studio利用AChartEngine制作餅圖的方法
閑來無事,發(fā)現(xiàn)市面上好多app都有餅圖統(tǒng)計的功能,得空自己實現(xiàn)一下,下面這篇文章主要給大家介紹了關(guān)于Android Studio利用AChartEngine制作餅圖的相關(guān)資料,需要的朋友可以參考借鑒,下面來一起看看吧2018-10-10Flutter使用sqflite處理數(shù)據(jù)表變更的方法詳解
了解過數(shù)據(jù)庫的同學(xué)應(yīng)該會知道,數(shù)據(jù)表結(jié)構(gòu)是可能發(fā)生改變的。所以本文為大家介紹了Flutter?使用?sqflite?處理數(shù)據(jù)表變更的版本升級處理方法,感興趣的可以了解一下2023-04-04Flutter學(xué)習(xí)教程之Route跳轉(zhuǎn)以及數(shù)據(jù)傳遞
這篇文章主要給大家介紹了關(guān)于Flutter學(xué)習(xí)教程之Route跳轉(zhuǎn)以及數(shù)據(jù)傳遞的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家學(xué)習(xí)或者使用Flutter具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧2019-08-08淺談Android Studio導(dǎo)出javadoc文檔操作及問題的解決
這篇文章主要介紹了淺談Android Studio導(dǎo)出javadoc文檔操作及問題的解決,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-03-03