天天看點

android輪播圖,viewpager加載廣告圖檔

最近做了一個在首頁展示廣告輪播圖,這幾乎是每個應用都會用到的一個功能

在這裡和大家分享一下,代碼都拷上來了,希望對大家有用

首先在MAinActivity裡

package com.example.bbb;

import java.util.ArrayList;

import java.util.List;

import java.util.concurrent.Executors;

import java.util.concurrent.ScheduledExecutorService;

import java.util.concurrent.TimeUnit;

import java.util.concurrent.atomic.AtomicInteger;

import android.os.Bundle;

import android.os.Handler;

import android.os.Message;

import android.app.Activity;

import android.content.Context;

import android.support.v4.view.ViewPager;

import android.util.DisplayMetrics;

import android.view.Menu;

import android.view.View;

import android.widget.FrameLayout;

import android.widget.ImageView;

import android.widget.LinearLayout;

public class MainActivity extends Activity {

    public Context mContext;

    private FrameLayout frameLayout;

    private ViewPager vp_ad;

    private double advertWidth = 0;

    private double advertHeight = 0;

    private ImageView[] mImageViews;

    List<CarouselList> carouselLists = new ArrayList<CarouselList>();

    private int currentPosition = 0;

    private boolean iscontinue = true;

    DisplayMetrics dm;

    // 定時任務

    private ScheduledExecutorService scheduledExecutorService;

    private AtomicInteger what = new AtomicInteger(0);

    public Handler loginHandler = new Handler() {

        @Override

        public void handleMessage(Message msg) {

            super.handleMessage(msg);

            switch (msg.what) {

            case 999:

                carouselLists = (List<CarouselList>) msg.obj;//接收服務端傳來輪播圖資訊

                createPoint();

                getTitleView();

                break;

            }

        }

    };

    @Override

    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_main);

        mContext = MainActivity.this;

        // 擷取螢幕像素相關資訊

        dm = new DisplayMetrics();

        getWindowManager().getDefaultDisplay().getMetrics(dm);

        advertWidth = dm.widthPixels;

        advertHeight = (double) dm.widthPixels / 640 * 280;//輪播圖的寬高比

        initView();

        InitDate();

    }

    private void initView(){

        frameLayout = (FrameLayout) findViewById(R.id.frameLayout);

        LinearLayout.LayoutParams ff = new LinearLayout.LayoutParams((int)advertWidth, (int)advertHeight);

        frameLayout.setLayoutParams(ff);

        vp_ad = (ViewPager) findViewById(R.id.vp_ad);

    }

    private void InitDate(){

        CarouselList carouselList;

        for(int i=0; i<5; i++){

            carouselList = new CarouselList();

            carouselList.setImg("");//服務端的圖檔路徑

            carouselLists.add(carouselList);

        }

        loginHandler.sendMessage(loginHandler.obtainMessage(999, carouselLists));

    }

    private void createPoint() {

        // six index round point

        LinearLayout ll = (LinearLayout) findViewById(R.id.llayout);

        if (ll != null) {

            ll.removeAllViews();

        }

        if (mImageViews != null) {

            mImageViews = null;

        }

        LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams( LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT);

        lp.setMargins(0, 0, 12, 0);

        mImageViews = new ImageView[carouselLists.size()];

        for (int i = 0; i < mImageViews.length; i++) {

            mImageViews[i] = new ImageView(mContext);

            mImageViews[i].setImageResource(R.drawable.guide_round);

            mImageViews[i].setEnabled(true);

            mImageViews[i].setLayoutParams(lp);

            ll.addView(mImageViews[i]);

        }

//        mImageViews[currentPosition].setEnabled(false);

        startPlay();

    }

    public void getTitleView() {

        vp_ad.setAdapter(new ViewPagerAdvAdapter(mContext, carouselLists));

        vp_ad.setOnPageChangeListener(new ViewPager.OnPageChangeListener() {

            @Override

            public void onPageSelected(int pos) {

                // TODO Auto-generated method stub

                currentPosition = pos;

                for (int i = 0; i < mImageViews.length; i++) {

                    if (i == pos) {

                        ((View) mImageViews[pos]).setBackgroundResource(R.drawable.guide_round_current);

                    } else {

                        ((View) mImageViews[i]).setBackgroundResource(R.drawable.guide_round_default);

                    }

                }

            }

            @Override

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

                // TODO Auto-generated method stub

            }

            @Override

            public void onPageScrollStateChanged(int arg0) {

                // TODO Auto-generated method stub

                switch (arg0) {

                case 1:

                    iscontinue = false;

                    break;

                case 2:

                    iscontinue = true;

                case 0:

                    if (vp_ad.getCurrentItem() == vp_ad.getAdapter().getCount() - 1

                            && !iscontinue) {

                        vp_ad.setCurrentItem(0);

                    } else if (vp_ad.getCurrentItem() == 0 && !iscontinue) {

                        vp_ad.setCurrentItem(vp_ad.getAdapter().getCount() - 1);

                    }

                default:

                    break;

                }

            }

        });

    }

    private void startPlay() {

        scheduledExecutorService = Executors.newSingleThreadScheduledExecutor();

        scheduledExecutorService.scheduleAtFixedRate(new SlideShowTask(), 1, 4, TimeUnit.SECONDS);

    }

    private void stopPlay() {

        if(scheduledExecutorService != null){

            scheduledExecutorService.shutdown();

        }

    }

    private class SlideShowTask implements Runnable {

        @Override

        public void run() {

            // TODO Auto-generated method stub

            synchronized (vp_ad) {

                currentPosition = (currentPosition + 1) % mImageViews.length;

                handler.obtainMessage().sendToTarget();

            }

        }

    }

    private Handler handler = new Handler() {

        @Override

        public void handleMessage(Message msg) {

            // TODO Auto-generated method stub

            super.handleMessage(msg);

            vp_ad.setCurrentItem(currentPosition);

        }

    };

    private final Handler viewHandler = new Handler() {

        public void handleMessage(Message msg) {

            vp_ad.setCurrentItem(msg.what);

            super.handleMessage(msg);

        }

    };

    Runnable runnable = new Runnable() {

        @Override

        public void run() {

            // TODO Auto-generated method stub

            while (true) {

                // if (iscontinue) {

                viewHandler.sendEmptyMessage(what.get());

                whatOption();

                // }

            }

        }

    };

    private void setCurPoint(int index) {

        if (index < 0 || index > mImageViews.length || index == currentPosition) {

            return;

        }

        mImageViews[currentPosition].setEnabled(true);

        mImageViews[index].setEnabled(false);

        // set tv title

        currentPosition = index;

    }

    public void whatOption() {

        if (carouselLists != null) {

            what.incrementAndGet();

            if (what.get() > carouselLists.size() - 1) {

                what.getAndAdd(-carouselLists.size());

            }

            try {

                Thread.sleep(3000);

            } catch (Exception e) {

                // TODO: handle exception

            }

        }

    }

    @Override

    public boolean onCreateOptionsMenu(Menu menu) {

        // Inflate the menu; this adds items to the action bar if it is present.

        getMenuInflater().inflate(R.menu.main, menu);

        return true;

    }

}

對應的activity_main.xml檔案布局

<LinearLayout 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"

    android:background="#FFFFFF"

    android:orientation="vertical" >

    <FrameLayout

        android:id="@+id/frameLayout"

        android:layout_width="match_parent"

        android:layout_height="300px" >

        <android.support.v4.view.ViewPager

            android:id="@+id/vp_ad"

            android:layout_width="match_parent"

            android:layout_height="match_parent" />

        <LinearLayout

            android:layout_width="match_parent"

            android:layout_height="30dp"

            android:layout_gravity="bottom"

            android:gravity="center_vertical" >

            <TextView

                android:id="@+id/tv_title"

                android:layout_width="wrap_content"

                android:layout_height="wrap_content"

                android:layout_marginLeft="2dp"

                android:layout_weight="1" />

            <LinearLayout

                android:id="@+id/llayout"

                android:layout_width="wrap_content"

                android:layout_height="wrap_content"

                android:layout_gravity="right|bottom"

                android:layout_marginBottom="2dp"

                android:layout_marginRight="10dip"

                android:orientation="horizontal" >

            </LinearLayout>

        </LinearLayout>

    </FrameLayout>

</LinearLayout>

加載viewpager的适配:

package com.example.bbb;

import java.io.IOException;

import java.io.InputStream;

import java.util.ArrayList;

import java.util.List;

import android.app.Activity;

import android.content.Context;

import android.content.Intent;

import android.graphics.Bitmap;

import android.graphics.BitmapFactory;

import android.os.Bundle;

import android.support.v4.view.PagerAdapter;

import android.support.v4.view.ViewPager;

import android.util.Log;

import android.view.View;

import android.view.View.OnClickListener;

import android.widget.ImageView;

public class ViewPagerAdvAdapter extends PagerAdapter implements OnClickListener{

    private List<CarouselList> mDatas;

    private List<ImageView> mViews;

    private ImageView mImageView;

    private Context mContext;

    private Bundle mBundle;

    private Intent mIntent;

    public ViewPagerAdvAdapter(Context mContext,List<CarouselList> mDatas)

    {

        mIntent = new Intent();

        mBundle = new Bundle();

        this.mContext = mContext;

        mViews = new ArrayList<ImageView>();

        this.mDatas = mDatas;

        int length = mDatas == null ? 0 : mDatas.size();

        for(int i=0;i<length;i++)

        {

            ImageView mImageView = new ImageView(mContext);

            mViews.add(mImageView);

        }

        length = 0;

    }

    @Override

    public int getCount() {

        return mDatas == null ? 0 : mDatas.size();

    }

    @Override

    public boolean isViewFromObject(View arg0, Object arg1) {

        return arg0==(arg1);

    }

    @Override

    public Object instantiateItem(View container, int position) {

        final CarouselList pos = mDatas.get(position);

        mImageView = mViews.get(position);

        mImageView.setAdjustViewBounds(true);

        mImageView.setScaleType(ImageView.ScaleType.FIT_XY);

        mImageView.setImageResource(R.drawable.banner);

//        mImageView.setTag(pos);

        mImageView.setOnClickListener(new OnClickListener() {

            @Override

            public void onClick(View v) {

                // TODO Auto-generated method stub

                Log.e("111111111111111111", pos.getNeedToken());

                String a = pos.getNeedToken();

//                if(pos.getNeedToken().equals("true")){//點選輪播圖跳轉廣告頁面時,是否需要token

//                    if (StaticValues.token == null) {//如果token為空,則去登陸

//                    Intent i = new Intent(mContext, LoginActivity.class);

//                    ((Activity) mContext).startActivityForResult(i, 999);

//                    }else{//不為空,則用webview加載網頁

//                        Intent intent = new Intent();

//                        intent.setClass(mContext, WebViewActivity.class);

//                        intent.putExtra("url", pos.getDetail());

//                        intent.putExtra("needToken", "true");

//                        mContext.startActivity(intent);

//                    }

//                }else{

//                    Intent intent = new Intent();

//                    intent.setClass(mContext, WebViewActivity.class);

//                    intent.putExtra("url", pos.getDetail());

//                    mContext.startActivity(intent);

//                }

            }

        });

//        AsyncImageLoader.getInstance(mContext).displayBitmap(mContext,  mImageView, pos.getImg(), true);//異步加載來自服務端的圖檔

        //這裡隻固定從assets檔案裡重複加載一張圖檔

        Bitmap bm = getBitmapFromAssets("logo.png", mContext);

        mImageView.setImageBitmap(bm);

        ((ViewPager)container).addView(mImageView,0);

        return mImageView;

    }

    public Bitmap getBitmapFromAssets(String filename, Context mContext) {

        Bitmap bitmap = null;

        InputStream is = null;

        // 從assets中取

            if (null != mContext) {

                try {

                    is = mContext.getResources().getAssets().open(filename);

                    bitmap = BitmapFactory.decodeStream(is);

                    is.close();

                } catch (IOException e) {

                    e.printStackTrace();

                    if (null != bitmap && !bitmap.isRecycled()) {

                        bitmap.recycle();

                        bitmap = null;

                    }

                }

            }

        return bitmap;

    }

    @Override

    public void destroyItem(View container, int position, Object object) {

        mImageView = mViews.get(position);

        ((ViewPager)container).removeView(mImageView);

    }

    @Override

    public void onClick(View v) {

        // TODO Auto-generated method stub

    }

}

儲存服務端傳來的輪播圖資料資訊類:

package com.example.bbb;

import java.io.Serializable;

public class CarouselList implements Serializable {

    private static final long serialVersionUID = -2019212597207279145L;

    private String id;

    private String type;

    private String detail;//點選後要跳轉的連結

    private String displayindex;

    private String isshow;

    private String citycode;

    private String img;

    private String clientAct;//用戶端動作:webview或者原生頁面

    private String needToken;//點選輪播圖跳轉廣告頁面時,是否需要token

    public String getNeedToken() {

        return needToken;

    }

    public void setNeedToken(String needToken) {

        this.needToken = needToken;

    }

    public String getId() {

        return id;

    }

    public void setId(String id) {

        this.id = id;

    }

    public String getType() {

        return type;

    }

    public void setType(String type) {

        this.type = type;

    }

    public String getDetail() {

        return detail;

    }

    public void setDetail(String detail) {

        this.detail = detail;

    }

    public String getDisplayindex() {

        return displayindex;

    }

    public void setDisplayindex(String displayindex) {

        this.displayindex = displayindex;

    }

    public String getIsshow() {

        return isshow;

    }

    public void setIsshow(String isshow) {

        this.isshow = isshow;

    }

    public String getCitycode() {

        return citycode;

    }

    public void setCitycode(String citycode) {

        this.citycode = citycode;

    }

    public String getImg() {

        return img;

    }

    public void setImg(String img) {

        this.img = img;

    }

    public String getClientAct() {

        return clientAct;

    }

    public void setClientAct(String clientAct) {

        this.clientAct = clientAct;

    }

}

在assets檔案直接放一個圖檔檔案logo.png,在drawable裡直接放banner.png,guide_round_current.png,guide_round_default.png,guide_round.xml

guide_round.xml這個xml檔案内容:

<?xml version="1.0" encoding="UTF-8"?>

<selector xmlns:android="http://schemas.android.com/apk/res/android">

    <item android:drawable="@drawable/guide_round_default" android:state_enabled="true"/>

    <item android:drawable="@drawable/guide_round_current" android:state_enabled="false"/>

</selector>

之後直接運作就OK了,希望可以幫到您

繼續閱讀