ViewPager輪播圖

ViewPager: 輪播圖

下面的ViewPager由LinearLayout,textView,點的容器組成;
 
ViewPager
頁面切換,定時頁面切換

VP技術點:

一、使用第三方UI類,只須要將完整包名加入就行
二、Timer和ScheduledExecutorService
三、Handler+Message或者runOnUiThread(runnable)更新界面ui
四、ViewPager的適配器類

VP步驟:

一、佈局
##viewpager的使用方法
      注意:
1.首先在XML配置
<android.support.v4.view.ViewPager
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/viewpager" />
 
2. 把須要填充到ViewPager的View,先添加到ArrayList集合內(爲了讓PagerAdapter能夠獲取到須要填充的View)
思惟造成:看到setAdapter就要想到List<數據類型>
ArrayList<View>  list = new ArrayList<View>();
list.add(View.inflate(MainActivity.this, R.layout.layout1null));
list.add(View.inflate(MainActivity.this, R.layout.layout2null));
list.add(View.inflate(MainActivity.this, R.layout.layout3null));
list.add(View.inflate(MainActivity.this, R.layout.layout4null));   
 
ViewPager的步驟
1. 實現一個PagerAdapter的子類MyPagerAdapter。
2. 實現裏面的4個方法。
3. getCount()返回當前的viewpager裏面有幾頁。
4. isViewFromObject()內部優化的邏輯
         return view == object ; //這個方法固定寫法,其實能夠不暴露出來的
 
5. 實現instantiateItem 實例化的邏輯, 根據位置 返回view對象 (不然報異常)
//爲當前頁面添加View
viewpager.addView(list.get(position));
return list.get(position);   
6. 實現destroyItem ,銷燬view對象的邏輯( 把super 刪除,不然也報異常)
//注意集合的數據是不能夠刪除的
viewpager.removeView(list.get(position));   
7. 生成apk的時候 記得配置 export 輸入。

二、將要顯示的圖片,文字分別用int和String數組存起來
三、而後將佈局中的顯示的ImageView和顯示的狀態點分別存到一個ArrayList中去
四、設置viewpager的變化事件
五、在變化頁面 onPageSelected中,將對應的文本標題和狀態的點顯示正確定時切換頁面;
a)使用ScheduledExecutorService而不是Timer,
b)定時的切換,使用handler+Message更新界面
在Activity可見(onStart)時,開啓定時,不可見時(onStop)時,關閉定時
可見時,將當前的item頁面也增長1
@Override
protected void onStart() {
    super.onStart();
    scheduledExecutorService = Executors.newScheduledThreadPool(imageIds.length);
    Runnable command = new Runnable() {
        
        @Override
        public void run() {
            runOnUiThread(new Runnable() {
 
                @Override
                public void run() {
                    // 將當前頁面增長1,而後取餘,爲了保證最後一頁能夠循環到第一頁page
                    currentItem = (currentItem + 1) % imageIds.length;
                    viewPager.setCurrentItem(currentItem);
                }
            });
        }
    };
    scheduledExecutorService.scheduleWithFixedDelay(command , 2, 2, TimeUnit.SECONDS);
}
 
@Override
protected void onStop() {
    super.onStop();
    if (scheduledExecutorService != null) {
        scheduledExecutorService.shutdown();
    }
}

核心代碼:

public class MainActivity extends Activity {
 
    private int imageIds[];
    private String descs[];
 
    private List<ImageView> images;
    private List<View> dots;
 
    private ViewPager viewPager;
    private PagerAdapter pagerAdapter;
 
    private TextView tv_desc;// 圖片描述
 
    private int oldPosition = 0;// 記錄切換頁面前一個頁面的位置
    private int currentItem;// 當前page的位置
 
    private ScheduledExecutorService scheduledExecutorService;
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
 
        // 一、圖片資源id數組
        imageIds = new int[] {
            R.drawable.a,
            R.drawable.b,
            R.drawable.c,
            R.drawable.d,
            R.drawable.e
        };
 
        // 二、圖片描述數組
        descs = new String[] {
            "鞏俐不低俗,我就不能低俗",   
            "撲樹又回來啦!再唱經典老歌引萬人大合唱",   
            "揭祕北京電影如何升級",   
            "樂視網TV版大派送",   
            "熱血屌絲的反殺"
        };
 
        // 三、要顯示的ImageView集合
        images = new ArrayList<ImageView>();
        for (int imageId : imageIds) {
            ImageView iv = new ImageView(this);
            iv.setImageResource(imageId);
            images.add(iv);
        }
        // 四、要顯示的狀態點dot集合
        dots = new ArrayList<View>();
        dots.add(this.findViewById(R.id.dt1));
        dots.add(this.findViewById(R.id.dt2));
        dots.add(this.findViewById(R.id.dt3));
        dots.add(this.findViewById(R.id.dt4));
        dots.add(this.findViewById(R.id.dt5));
 
        // 初始化數據完畢----------------------
 
        tv_desc = (TextView) this.findViewById(R.id.tv_desc);
        tv_desc.setText(descs[0]);
 
        viewPager = (ViewPager) this.findViewById(R.id.view_pager);
        pagerAdapter = new MyPagerAdapter();
        viewPager.setAdapter(pagerAdapter);
        // viewPager.setCurrentItem(oldPosition);//設置當前顯示的item
 
        // 設置viewPager的page改變事件
        viewPager.setOnPageChangeListener(new OnPageChangeListener() {
 
            // 另一張page被徹底展現的時候,調用,參數表明當前page的位置,從0開始
            @Override
            public void onPageSelected(int position) {
                // System.out.println("onPageSelected:" + i);
 
                // 文字title改變
                tv_desc.setText(descs[position]);
 
                // 點dot改變,前一個位置變成normal,當前變成enabled
                dots.get(oldPosition).setBackgroundResource(R.drawable.dot_normal);
                dots.get(position).setBackgroundResource(R.drawable.dot_enable);
 
                // 更新上一個位置爲當前位置
                oldPosition = position;
                currentItem = position;
            }
 
            // page在拖動的過程當中,調用該方法
            @Override
            public void onPageScrolled(int i, float f, int j) {
                // System.out.println("onPageScrolled:");
            }
 
            // 只要狀態一變化就調用,page滾動開始和結束時會調用,狀態變化:1-2-0
            @Override
            public void onPageScrollStateChanged(int i) {
                // System.out.println("onPageScrollStateChanged:" + i);
            }
        });
    }
 

 pageadapter適配器

    private class MyPagerAdapter extends PagerAdapter {
        /**
         * viewpager的長度
         */

        @Override
        public int getCount() {
            return imageIds.length;
        }
 
        // 判斷是同一個view
        /**
         * 判斷滑動的控件和將要顯示的控件是否爲同一個 true 直接複用 false 會調用instantiateItem() 獲得一個新的對象
         */
        @Override
        public boolean isViewFromObject(View view, Object object) {
            return view == object;
        }
 
        /**
         * 移除ImageView對象
         */
        @Override
        public void destroyItem(ViewGroup container, int position, Object object) {
            // super.destroyItem(container, position, object);//這個要註釋掉
            // View view = container.getChildAt(position);
            // container.removeView(view);
            // container.removeViewAt(position);
            container.removeView(images.get(position));
        }
 
        /**
         * 獲得一個Object對象就是ImageView
         */

        @Override
        public Object instantiateItem(ViewGroup container, int position) {
            container.addView(images.get(position));
            return images.get(position);
        }
  }
 
    @Override
    protected void onStart() {
        super.onStart();
        scheduledExecutorService = Executors.newScheduledThreadPool(imageIds.length);
        Runnable command = new Runnable() {
 
            @Override
            public void run() {
                runOnUiThread(new Runnable() {
 
                    @Override
                    public void run() {
                        // 將當前頁面增長1,而後取餘,爲了保證最後一頁能夠循環到第一頁page
                        currentItem = (currentItem + 1% imageIds.length;
                        viewPager.setCurrentItem(currentItem);
                    }
                });
            }
        };
        scheduledExecutorService.scheduleWithFixedDelay(command , 22, TimeUnit.SECONDS);
    }
 
    @Override
    protected void onStop() {
        super.onStop();
        if (scheduledExecutorService != null) {
            scheduledExecutorService.shutdown();
        }
    }
}
 
 
 



相關文章
相關標籤/搜索