Android之Banner的滾動輪播實現

這次,主要說一下android開發過程中的banner的滾動輪播的實現,並且能夠循環,而且我們還可以手動拖動來實現banner圖片的切換。我自己設計的時候沒有用到圓點,所以大家看到的我也沒有對圓點進行總結。

首先是我們的BannerAdapter:

import android.support.v4.view.PagerAdapter;
import android.widget.ImageView;

import java.util.List;

import android.view.View;
import android.view.ViewGroup;

/**
 * Created by Administrator on 2016/8/9 0009.
 */
public class BannerAdapter extends PagerAdapter {

    //數據源
    private List<ImageView> mList;

    public BannerAdapter(List<ImageView> list) {
        this.mList = list;
    }

    @Override
    public int getCount() {
        //取超大的數,實現無線循環效果
        return Integer.MAX_VALUE;
    }

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

    @Override
    public Object instantiateItem(ViewGroup container, int position) {
        container.addView(mList.get(position % mList.size()));
        return mList.get(position % mList.size());
    }

    @Override
    public void destroyItem(ViewGroup container, int position, Object object) {
        container.removeView(mList.get(position % mList.size()));
    }

}
adapter的註釋上面有標註,這裏注意一下getCount()中的MAX_VALUE,我們去最大值,這樣可以實現無限循環。

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.kegoal.activity.test.IndexActivity">

        <android.support.v4.view.ViewPager
            android:id="@+id/viewpager"
            android:layout_width="match_parent"
            android:layout_height="match_parent">
        </android.support.v4.view.ViewPager>
</RelativeLayout>
這是我們的佈局,banner使用到的佈局,很明顯是使用的ViewPager。

接下來就是我們的主Activity了。IndexActivity.class:

import android.os.SystemClock;
import android.support.v4.view.ViewPager;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.ImageView;
import com.adapter.BannerAdapter;

import java.util.ArrayList;
import java.util.List;

public class IndexActivity extends AppCompatActivity {
    private ViewPager viewPager;
    private List<ImageView> mlist;

    private int[] bannerImages = {R.mipmap.login_bg, R.mipmap.login_btn_qq, R.mipmap.login_bg, R.mipmap.login_btn_qq};
    private BannerAdapter mAdapter;
    private BannerListener bannerListener;
    //線程標誌
    private boolean isStop = false;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_index);
        viewPager = (ViewPager) findViewById(R.id.viewpager);
        initData();
        initAction();

        new Thread(new Runnable() {
            @Override
            public void run() {
                while (!isStop) {
                    SystemClock.sleep(3000);
                    runOnUiThread(new Runnable() {
                        @Override
                        public void run() {
                            viewPager.setCurrentItem(viewPager.getCurrentItem() + 1);
                        }
                    });
                }
            }
        }).start();
    }

    private void initAction() {
        bannerListener = new BannerListener();
        viewPager.setOnPageChangeListener(bannerListener);
        viewPager.setCurrentItem(0);
    }

    private void initData() {
        mlist = new ArrayList<ImageView>();
        for (int i = 0; i < bannerImages.length; i++) {
            ImageView imageView = new ImageView(this);
            imageView.setBackgroundResource(bannerImages[i]);
            mlist.add(imageView);
        }
        mAdapter = new BannerAdapter(mlist);
        viewPager.setAdapter(mAdapter);
    }

    class BannerListener implements ViewPager.OnPageChangeListener {

        @Override
        public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {

        }

        @Override
        public void onPageSelected(int position) {

        }

        @Override
        public void onPageScrollStateChanged(int state) {

        }

    }

    @Override
    protected void onDestroy() {
        //關閉定時器
        isStop = true;
        super.onDestroy();
    }
}

總的來說就這些代碼了,實現三秒一切換,就是讓一張圖片sleep三秒,然後切換。切換的主要邏輯就是viewpager.setCurrentItem()+1 這段代碼。相信大家都可以理解。

這樣就簡單的實現了banner的滾動輪播,banner的圖片一般都是通過網絡請求到的,但是現在沒有進行網絡方面的請求,所以暫時先給大家看一下靜態的數據吧。

後期這邊網絡請求後,會對這方面進行更新以及深入的思考。

發佈了57 篇原創文章 · 獲贊 8 · 訪問量 7萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章