**請大家關注下我的微信公衆號:哦哦猿
QQ羣:552123831**
在開發中,我們會遇見很多問題,比如我現在說的這個問題,就是經常遇見的。
那就是動態加載ViewPager,根據服務器的值去定有多少個ViewPager,
ViewPager是支持左右滑動的效果很好。
廢話不說,直接代碼。
新建類:
BitmapData.java
package com.anzh.viewpager;
import android.graphics.Bitmap;
import android.os.Parcel;
import android.os.Parcelable;
import android.widget.ImageView;
public class BitmapData implements Parcelable{
public Bitmap bitmap;
public ImageView imageView;
public BitmapData(Bitmap bitmap,ImageView imageView){
this.bitmap = bitmap;
this.imageView = imageView;
}
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel dest, int flags) {
}
}
新建類:
GetBitMap.java
package com.anzh.viewpager;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
import android.widget.ImageView;
import org.apache.http.HttpResponse;
import org.apache.http.client.methods.HttpPost;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.List;
/**
*
*/
@SuppressWarnings("unused")
public class GetBitMap implements Runnable {
private List<BitMapMsg> mQueue = new ArrayList<BitMapMsg>();
private static boolean running = false;
private static GetBitMap mGetBitmap = null;
private Bitmap bitmap;
private GetBitMap(){
}
public static GetBitMap instance(){
if(mGetBitmap == null){
mGetBitmap = new GetBitMap();
}
return mGetBitmap;
}
public void add(Context context,Handler handler,String path, int mCode){
add(context, handler, path, mCode,null);
}
public void add(Context context,Handler handler,String path, int mCode,ImageView imageView){
BitMapMsg msg = new BitMapMsg();
msg.mConext = context;
msg.mHandler = handler;
msg.path = path;
msg.mCode = mCode;
msg.mImgView = imageView;
mQueue.add(msg);
if(!running){
new Thread(this).start();
}
}
public void run() {
running = true;
while(mQueue.size() > 0 ){
BitMapMsg msg = null;
synchronized (mQueue) {
msg = mQueue.remove(0);
}
if(msg != null && !msg.path.equals("")){
Message message = new Message();
message.what = msg.mCode;
if(msg.mImgView != null){
BitmapData bitmapData = new BitmapData(getBitmap(msg,msg.path),msg.mImgView);
message.getData().putParcelable("bitmap", bitmapData);
msg.mHandler.sendMessage(message);
}
}
}
running = false;
}
/**
* 以最小內存獲取資源圖片
* @param resId
* @return
*/
private Bitmap getBitmap(BitMapMsg msg,String path){
try {
InputStream is = msg.mConext.getResources().getAssets().open(path);
BitmapFactory.Options opt = new BitmapFactory.Options();
opt.inJustDecodeBounds = true;
BitmapFactory.decodeStream(is, null, opt);
opt.inSampleSize = computeSampleSize(opt, -1, 480*800);
opt.inJustDecodeBounds = false;
opt.inPreferredConfig = Bitmap.Config.RGB_565;
opt.inPurgeable = true;
opt.inInputShareable = true;
bitmap = BitmapFactory.decodeStream(is, null, opt);
} catch (IOException e) {
e.printStackTrace();
}
return bitmap;
}
/**
* 動態計算inSampleSize
* @param options
* @param minSideLength
* @param maxNumOfPixels
* @return
*/
public static int computeSampleSize(BitmapFactory.Options options,
int minSideLength, int maxNumOfPixels) {
int initialSize = computeInitialSampleSize(options, minSideLength,
maxNumOfPixels);
int roundedSize;
if (initialSize <= 8) {
roundedSize = 1;
while (roundedSize < initialSize) {
roundedSize <<= 1;
}
} else {
roundedSize = (initialSize + 7) / 8 * 8;
}
return roundedSize;
}
private static int computeInitialSampleSize(BitmapFactory.Options options,
int minSideLength, int maxNumOfPixels) {
double w = options.outWidth;
double h = options.outHeight;
int lowerBound = (maxNumOfPixels == -1) ? 1 : (int) Math.ceil(Math
.sqrt(w * h / maxNumOfPixels));
int upperBound = (minSideLength == -1) ? 128 : (int) Math.min(Math
.floor(w / minSideLength), Math.floor(h / minSideLength));
if (upperBound < lowerBound) {
// return the larger one when there is no overlapping zone.
return lowerBound;
}
if ((maxNumOfPixels == -1) && (minSideLength == -1)) {
return 1;
} else if (minSideLength == -1) {
return lowerBound;
} else {
return upperBound;
}
}
public static class BitMapMsg{
public Context mConext;
public Handler mHandler;
public String path = "";
public int mCode;
public ImageView mImgView;
public BitMapMsg(){
}
}
}
新建類:
ViewPagerAdapter.java
package com.anzh.viewpager;
import java.util.List;
import android.os.Parcelable;
import android.support.v4.view.PagerAdapter;
import android.support.v4.view.ViewPager;
import android.view.View;
public class ViewPagerAdapter extends PagerAdapter {
//界面列表
private List<View> views;
public ViewPagerAdapter (List<View> views){
this.views = views;
}
//銷燬arg1位置的界面
@Override
public void destroyItem(View arg0, int arg1, Object arg2) {
((ViewPager) arg0).removeView(views.get(arg1));
}
@Override
public void finishUpdate(View arg0) {
arg0.postInvalidate();
}
//獲得當前界面數
@Override
public int getCount() {
if (views != null)
{
return views.size();
}
return 0;
}
//初始化arg1位置的界面
@Override
public Object instantiateItem(View arg0, int arg1) {
((ViewPager) arg0).addView(views.get(arg1), 0);
return views.get(arg1);
}
//判斷是否由對象生成界面
@Override
public boolean isViewFromObject(View arg0, Object arg1) {
return (arg0 == arg1);
}
@Override
public void restoreState(Parcelable arg0, ClassLoader arg1) {
}
@Override
public Parcelable saveState() {
return null;
}
@Override
public void startUpdate(View arg0) {
}
}
這個是MainActivity 裏面的代碼: (圖片資源在assets文件夾下面,當然你可以把它換成你從服務器或者的圖片)
package com.anzh.viewpager;
import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.support.v4.view.ViewPager;
import android.support.v4.view.ViewPager.OnPageChangeListener;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.Toast;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
public class MainActivity extends Activity implements OnClickListener, OnPageChangeListener{
private ViewPager vp;
private ViewPagerAdapter vpAdapter;
private List<View> views;
private int lastValue = -1;
//引導圖片資源
private String[] pics;
//底部小點圖片
private ImageView[] dots ;
//記錄當前選中位置
private int currentIndex;
private final int UPDATEDATA = 1;
Handler mHandler = new Handler(){
public void handleMessage(Message msg) {
switch (msg.what) {
case UPDATEDATA:
BitmapData bitmapData = msg.getData().getParcelable("bitmap");
bitmapData.imageView.setImageBitmap(bitmapData.bitmap);
break;
}
};
};
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
views = new ArrayList<View>();
initImage();
vp = (ViewPager) findViewById(R.id.viewpager);
//初始化Adapter
vpAdapter = new ViewPagerAdapter(views);
vp.setAdapter(vpAdapter);
//綁定回調
vp.setOnPageChangeListener(this);
//初始化底部小點
initDots();
}
private void initImage(){
try {
pics = this.getResources().getAssets().list("guide");
LinearLayout.LayoutParams mParams = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT,
LinearLayout.LayoutParams.WRAP_CONTENT);
//初始化引導圖片列表
for(int i=0; i<pics.length; i++) {
ImageView iv = new ImageView(this);
iv.setLayoutParams(mParams);
GetBitMap.instance().add(this, mHandler,"guide/"+pics[i], UPDATEDATA,iv);
views.add(iv);
}
} catch (IOException e) {
e.printStackTrace();
}
}
private void initDots() {
LinearLayout.LayoutParams mLayoutParams = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT,
LinearLayout.LayoutParams.WRAP_CONTENT);
mLayoutParams.setMargins(3, 0, 3, 0);
LinearLayout ll = (LinearLayout) findViewById(R.id.ll);
dots = new ImageView[pics.length];
//循環取得小點圖片
for (int i = 0; i < pics.length; i++) {
dots[i] = new ImageView(this);
dots[i].setLayoutParams(mLayoutParams);
dots[i].setBackgroundResource(R.drawable.dot);
dots[i].setEnabled(true);//都設爲灰色
dots[i].setOnClickListener(this);
dots[i].setTag(i);//設置位置tag,方便取出與當前位置對應
ll.addView(dots[i]);
}
currentIndex = 0;
dots[currentIndex].setEnabled(false);//設置爲白色,即選中狀態״̬
}
/**
*設置當前的引導頁
*/
private void setCurView(int position)
{
if (position < 0 || position >= pics.length) {
return;
}
vp.setCurrentItem(position);
}
/**
*這隻當前引導小點的選中
*/
private void setCurDot(int positon)
{
if (positon < 0 || positon > pics.length - 1 || currentIndex == positon) {
return;
}
dots[positon].setEnabled(false);
dots[currentIndex].setEnabled(true);
currentIndex = positon;
}
//當滑動狀態改變時調用
@Override
public void onPageScrollStateChanged(int arg0) {
if(arg0 == 0){
if(lastValue == pics.length-1){
Toast.makeText(this, "已經是最後一張了", Toast.LENGTH_SHORT).show();
}
}
}
//當前頁面被滑動時調用
@Override
public void onPageScrolled(int arg0, float arg1, int arg2) {
lastValue = arg0;
}
//當新的頁面被選中時調用
@Override
public void onPageSelected(int arg0) {
//設置底部小點選中狀態״̬
setCurDot(arg0);
}
@Override
public void onClick(View v) {
int position = (Integer)v.getTag();
setCurView(position);
setCurDot(position);
}
}
這個是佈局代碼:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout 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="fill_parent"
/>
<LinearLayout
android:id="@+id/ll"
android:orientation="horizontal"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginBottom="24.0dip"
android:layout_alignParentBottom="true"
android:layout_centerHorizontal="true">
</LinearLayout>
</RelativeLayout>
很簡單,有什麼不懂的可以來QQ羣找我
**請大家關注下我的微信公衆號:哦哦猿
QQ羣:552123831**