最近做了一個在首頁展示廣告輪播圖,這幾乎是每個應用都會用到的一個功能
在這裡和大家分享一下,代碼都拷上來了,希望對大家有用
首先在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了,希望可以幫到您