ViewPager自動無限循環滑動

**

ViewPager自動無限循環滑動

通過handler發送消息,實現自動無限循環,代碼拿過來就可以用.
**
先上GIF圖
自定循環,無限循環,雖然圖片是醜了點,但是對於一個程序員來說,功能出來了才考慮其他的.
當然,這裏採用的無限循環,網絡上大部分都是這樣做的.不算是真正的循環,但是是循環效果

好了,廢話不多說,代碼來了
佈局文件的xml文件

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"  
    android:layout_width="fill_parent"  
    android:layout_height="fill_parent"  
    android:orientation="vertical" >  

   <android.support.v4.view.ViewPager    
        android:id="@+id/viewPager"    
        android:layout_width="fill_parent"    
        android:layout_height="wrap_content" />   

    <RelativeLayout    
        android:layout_width="fill_parent"    
        android:layout_height="wrap_content"   
        android:orientation="vertical" >    

        <LinearLayout    
            android:id="@+id/viewGroup"    
            android:layout_width="fill_parent"    
            android:layout_height="wrap_content"    
            android:layout_alignParentBottom="true"   
            android:layout_marginBottom="30dp"    
            android:gravity="center_horizontal"    
            android:orientation="horizontal" >    
        </LinearLayout>    
    </RelativeLayout>    

</FrameLayout>  

佈局文件嘛,仁者見仁智者見智,一切方便爲主

下面是代碼塊:是在MainActivity裏面的.反正就是一個佈局文件,一個代碼文件.

package com.wangjun.viewpager;
import android.app.Activity;  
import android.os.Bundle;
import android.os.Handler;
import android.support.v4.view.PagerAdapter;  
import android.support.v4.view.ViewPager;  
import android.support.v4.view.ViewPager.OnPageChangeListener;  
import android.view.View;  
import android.view.ViewGroup;  
import android.view.ViewGroup.LayoutParams;  
import android.widget.ImageView;  
import android.widget.LinearLayout;  

public class MainActivity extends Activity implements OnPageChangeListener{  
    /** 
     * ViewPager 
     */  
    private ViewPager viewPager;  

    /** 
     * 裝點點的ImageView數組 
     */  
    private ImageView[] tips;  

    /** 
     * 裝ImageView數組 
     */  
    private ImageView[] mImageViews;  

    /** 
     * 圖片資源id 
     */  
    private int[] imgIdArray ;  

    @Override  
    protected void onCreate(Bundle savedInstanceState) {  
        super.onCreate(savedInstanceState);  
        setContentView(R.layout.activity_main); 

        handler.sendEmptyMessageDelayed(0, 2000);


        ViewGroup group = (ViewGroup)findViewById(R.id.viewGroup);  
        viewPager = (ViewPager) findViewById(R.id.viewPager);  

        //載入圖片資源ID  
        imgIdArray = new int[]{
                R.drawable.png_01,
                R.drawable.png_02,
                R.drawable.png_03,
                R.drawable.png_04,
                };  


        //將點點加入到ViewGroup中  
        tips = new ImageView[imgIdArray.length];  
        for(int i=0; i<tips.length; i++){  
            ImageView imageView = new ImageView(this);  
            imageView.setLayoutParams(new LayoutParams(10,10));  
            tips[i] = imageView;  
            if(i == 0){  
                tips[i].setBackgroundResource(R.drawable.ic_unread);  
            }else{  
                tips[i].setBackgroundResource(R.drawable.ic_unread_2);  
            }  

            LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(new ViewGroup.LayoutParams(LayoutParams.WRAP_CONTENT,    
                    LayoutParams.WRAP_CONTENT));  
            layoutParams.leftMargin = 5;  
            layoutParams.rightMargin = 5;  
            group.addView(imageView, layoutParams);  
        }  


        //將圖片裝載到數組中  
        mImageViews = new ImageView[imgIdArray.length];  
        for(int i=0; i<mImageViews.length; i++){  
            ImageView imageView = new ImageView(this);  
            mImageViews[i] = imageView;  
            imageView.setBackgroundResource(imgIdArray[i]);  
        }  

        //設置Adapter  
        viewPager.setAdapter(new MyAdapter());  
        //設置監聽,主要是設置點點的背景  
        viewPager.setOnPageChangeListener(this);  
        //設置ViewPager的默認項, 設置爲長度的100倍,這樣子開始就能往左滑動  
        viewPager.setCurrentItem((mImageViews.length) * 100);  

    }  

    /** 
     *  
     * @author xiaanming 
     * 
     */  
    public class MyAdapter extends PagerAdapter{  

        @Override  
        public int getCount() {  
            return Integer.MAX_VALUE;  
        }  

        @Override  
        public boolean isViewFromObject(View arg0, Object arg1) {  
            return arg0 == arg1;  
        }  

        @Override  
        public void destroyItem(View container, int position, Object object) {  
            ((ViewPager)container).removeView(mImageViews[position % mImageViews.length]);  

        }  

        /** 
         * 載入圖片進去,用當前的position 除以 圖片數組長度取餘數是關鍵 
         */  
        @Override  
        public Object instantiateItem(View container, int position) {  
            ((ViewPager)container).addView(mImageViews[position % mImageViews.length], 0);  
            return mImageViews[position % mImageViews.length];  
        }  



    }  

    @Override  
    public void onPageScrollStateChanged(int arg0) {  

    }  

    @Override  
    public void onPageScrolled(int arg0, float arg1, int arg2) {  

    }  

    @Override  
    public void onPageSelected(int arg0) {  
        setImageBackground(arg0 % mImageViews.length);  
    }  

    /** 
     * 設置選中的tip的背景 
     * @param selectItems 
     */  
    private void setImageBackground(int selectItems){  
        for(int i=0; i<tips.length; i++){  
            if(i == selectItems){  
                tips[i].setBackgroundResource(R.drawable.ic_unread);  
            }else{  
                tips[i].setBackgroundResource(R.drawable.ic_unread_2);  
            }  
        }  
    }  


    /**
     * 上面的代碼中,當只有3張圖片或者2張圖片的時候,滑動存在BUG問題的修改如下
     *destroyItem(View container, int position, Object object)方法中不removeView 
     *  也就是將下面這句註銷了就OK .繼續完成下面的那個設置,也就是增加異常捕捉
     *  //((ViewPager)container).removeView(mImageViews[position % mImageViews.length]);  
     **/


    /**
     * instantiateItem(View container, int position)增加異常撲捉
     *[java] view plain copy 在CODE上查看代碼片派生到我的代碼片
     *@Override  
     * public Object instantiateItem(View container, int position) {  
     *  try {    
     *     ((ViewPager)container).addView(mImageViews[position % mImageViews.length], 0);  
     *   }catch(Exception e){  
     *       //handler something  
     *  }  
     *   return mImageViews[position % mImageViews.length];  
     *}  
     * 
     * */

    /*
     * 自動循環有多種實現方式:
     * 1、定時器:Timer
     * 2、開子線程 while  true 循環
     * 3、ColckManager 
     * 4、 用handler 發送延時信息,實現循環
     */
    //這裏我們用第四種,比較高效:
    //<span style="white-space:pre">    </span>//判斷是否自動滾動的標誌
        private boolean isrunning = true;
        /**
         * 自動滑動的Handler
         * 利用 Handler.sendEmptyMessageDelayed方法,實現定時滾動
         *
         */
        Handler handler = new Handler(){
            public void handleMessage(android.os.Message msg) {
                //讓ViewPager滑到下一頁
                viewPager.setCurrentItem(viewPager.getCurrentItem()+1);
                //延時,循環調用handler
                if(isrunning){
                    handler.sendEmptyMessageDelayed(0, 2000);
                }
            };
        };

        /**
         * Activity生命週期結束時終止定時,否則可能一直進行下去
         */
        protected void onDestroy() {
            super.onDestroy();
            isrunning = false;
        };
    //在onCreate()方法中發送一個消息啓動Handler。



}  

注意:注意:注意:
1)圖片嘛,你自己找哈,此處是廢話
2)你點擊下面的小圓點,是不會發生跳轉的.它只是一個圖片.你可以添加點擊事件,或者,你也可以用RadioGroup裏放RadioButton來做.這裏我就不做具體的演示了.
3)這代碼也是從網上找了的.謝謝那些大神的分享,所以我也願意分享出去.記得收藏哦

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章