Android網絡加載圖片并滾動顯示

fydxdk 9年前發布 | 35K 次閱讀 Android Android開發 移動開發

  android應用app離不開服務器端的數據,我們裝在手機上的app應用都是通過http相關協議及方法從對應的服務器上取下來的。幾乎所有的app 都少不了從網絡加載圖片并展示在手機上,今天我寫的就是把網絡圖片加載到本地并用ViewPager展示出來,可以實現圖片自動滾動播放,當然可以手動翻頁。借助了網絡圖片開源框架ImageLoader,其在github開源地址是:https://github.com/nostra13/Android-Universal-Image-Loader,如果想知道這開源框架的具體使用方法可以參考http://blog.csdn.net/wwj_748/article/details/10079311這篇博客。

   下面直接貼代碼:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="#fff0f0ed"
    android:orientation="vertical" >

        <android.support.v4.view.AutoScrollViewPager
            android:id="@+id/advertisementVp"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:background="#ffa1a1a1" />
        <LinearLayout
            android:id="@+id/advertisement_dotLl"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_alignParentBottom="true"
            android:gravity="center"
            android:orientation="horizontal"
            android:paddingBottom="4.5dp"
            android:paddingTop="4.5dp" >
        </LinearLayout>
</RelativeLayout><!--實際項目布局不是這樣,這只是個舉例-->

下面這個類是我們在實際項目中把V4包中的AutoScrollViewPager做了修改:

public class AutoScrollViewPager<T extends PagerData> extends ViewPager {
public interface OnPageItemClickListener<T extends PagerData> {
void onPageItemClickListener(T pd);
}
private int mScrollTime = 0;
private int oldIndex = 0;
private int curIndex = 0;
private List<T> mPagerData = new ArrayList<T>();
private PagerAdapter pagerAdapter;
private LinearLayout indicatorView;
private int focusedDrawable, normalDrawable;
private LayoutInflater inflater;
private OnPageItemClickListener<T> pageItemClickListener;
private boolean isFakeCycle = false;// 是否是假的循環
private boolean isStartScroll;
public AutoScrollViewPager(Context context, AttributeSet attrs) {
super(context, attrs);
inflater = LayoutInflater.from(context);
focusedDrawable = R.drawable.common_dot_selected;
normalDrawable = R.drawable.common_dot_normal;
setInternalPageChangeListener(new OnPageChangeListener() {
public void onPageSelected(int i) {
if (mPagerData.isEmpty() || indicatorView == null || indicatorView.getChildCount() == 0)
return;
curIndex = i % mPagerData.size();
// 取消圓點選中
indicatorView.getChildAt(oldIndex).setBackgroundResource(normalDrawable);
// 圓點選中
indicatorView.getChildAt(curIndex).setBackgroundResource(focusedDrawable);
oldIndex = curIndex;
}

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

});

// 設置滑動動畫時間 ,如果用默認動畫時間可不用 ,反射技術實現
new FixedSpeedScroller(getContext()).setDuration(this, 700);
pagerAdapter = new MyPagerAdapter();
setAdapter(pagerAdapter);
setOffscreenPageLimit(2);
requestDisallowInterceptTouchEvent(true);
options = new DisplayImageOptions.Builder()

                                .showImageOnLoading(R.drawable.index_advert_default) //加載中顯示的默認圖片
.showImageForEmptyUri(R.drawable.index_advert_default) //加載錯誤默認圖片
.showImageOnFail(R.drawable.index_advert_default)//加載錯誤時的默認圖片
.cacheInMemory(true)// 開啟內存緩存
.cacheOnDisk(true) // 開啟硬盤緩存
.resetViewBeforeLoading(false).build());
}
@Override
protected void onAttachedToWindow() {
super.onAttachedToWindow();
if (isStartScroll) {
start(mScrollTime);
}
}
@Override
protected void onDetachedFromWindow() {
super.onDetachedFromWindow();
if (isStartScroll)
handler.removeCallbacksAndMessages(null);
}
/** 構建內部索引父view */
private void initInnerIndicator() {
indicatorView = new IndicatorView(getContext());
indicatorView.setGravity(Gravity.CENTER);
indicatorView.setBackgroundColor(0x0fFF00FF);
indicatorView.setOrientation(LinearLayout.HORIZONTAL);
LayoutParams params = new LayoutParams();
params.width = ViewGroup.LayoutParams.MATCH_PARENT;
params.height = 40;
params.gravity = Gravity.BOTTOM;
addView(indicatorView, params);
}
public void setDatas(List<T> imgUrls, LinearLayout outIndicator, boolean needInnerIndicator, boolean isFakeCycle) {
this.isFakeCycle = isFakeCycle;
setDatas(imgUrls, outIndicator, needInnerIndicator);
}
/**重復調用可能會anr*/
public void setDatas(List<T> imgUrls, LinearLayout outIndicator, boolean needInnerIndicator) {
if (outIndicator != null) {
indicatorView = outIndicator;
} else if (needInnerIndicator) {
initInnerIndicator();
}
mPagerData.clear();
mPagerData.addAll(imgUrls);
pagerAdapter.notifyDataSetChanged();
}
/**重新加載圖片數據,刷新vp內容*/
public void refreshDatas(List<T> imgUrls, LinearLayout outIndicator, boolean needInnerIndicator, boolean isFakeCycle) {
this.isFakeCycle = isFakeCycle;
if (outIndicator != null) {
indicatorView = outIndicator;
} else if (needInnerIndicator) {
initInnerIndicator();
}
mPagerData.clear();
mPagerData.addAll(imgUrls);
pagerAdapter = new MyPagerAdapter();
setAdapter(pagerAdapter);
pagerAdapter.notifyDataSetChanged();
}
@Override
void dataSetChanged() {
super.dataSetChanged();
setUpIndicator();
}

// 設置圓點
private void setUpIndicator() {
if (indicatorView != null) {
indicatorView.removeAllViews();
if (mPagerData.isEmpty()) {
indicatorView.setVisibility(View.GONE);
return;
} else {
indicatorView.setVisibility(View.VISIBLE);
}
for (int i = 0; i < mPagerData.size(); i++) {
View v = inflater.inflate(R.layout.auto_scrollpage_dot, indicatorView, false);
v.setBackgroundResource(normalDrawable);
indicatorView.addView(v);
}
indicatorView.getChildAt(0).setBackgroundResource(focusedDrawable);
}
curIndex = oldIndex = 0;
if (mPagerData.size() > 1 && isFakeCycle) {
setCurrentItem(15 - 15 % mPagerData.size());// 設置選中為中間/圖片為和第0張一樣
} else {
setCurrentItem(0);
}
}
/** 獲取真實的當前位置 */
public int getCurrentPosition() {
return curIndex;
}

/** 獲取真實的當前位置的數據 */
public T getCurrentData() throws IndexOutOfBoundsException {
return mPagerData.get(curIndex);
}

@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
if (ev.getAction() == MotionEvent.ACTION_UP || ev.getAction() == MotionEvent.ACTION_CANCEL) {
start();
} else {
handler.removeCallbacksAndMessages(null);
}
return super.onInterceptTouchEvent(ev);
}

@Override
public boolean onTouchEvent(MotionEvent ev) {
if (ev.getAction() == MotionEvent.ACTION_UP || ev.getAction() == MotionEvent.ACTION_CANCEL) {
start();
} else {
handler.removeCallbacksAndMessages(null);
}
return super.onTouchEvent(ev);
}

/** 開始廣告滾動 */
private void start() {
start(mScrollTime);
}
public void start(int scrollTime) {
// handler.removeCallbacksAndMessages(null);
mScrollTime = scrollTime;
isStartScroll = false;
if (mScrollTime > 0 && !mPagerData.isEmpty()) {
isStartScroll = true;
handler.sendMessageDelayed(handler.obtainMessage(), mScrollTime);
}
}
private Handler handler = new Handler() {
public void handleMessage(android.os.Message msg) {
handler.removeCallbacksAndMessages(null);
if (isFakeCycle) {
setCurrentItem(getCurrentItem() + 1);
} else {
if (getCurrentItem() == mPagerData.size() - 1) {
setCurrentItem(0, true);
} else {
setCurrentItem(getCurrentItem() + 1);
}
}
handler.sendMessageDelayed(handler.obtainMessage(), mScrollTime);
};
};
private DisplayImageOptions options;
public void setImageOptions(DisplayImageOptions options) {
this.options = options;
}
// 適配器 //循環設置
private class MyPagerAdapter extends PagerAdapter {

@Override
public int getCount() {
if (mPagerData.size() == 1) {
return 1;
} else if (mPagerData.size() > 1) { return isFakeCycle ? Integer.MAX_VALUE : mPagerData.size(); }
return 0;
}

@Override
public Object instantiateItem(ViewGroup container, int position) {
final int realP = position % mPagerData.size();
final ImageView netImgView = (ImageView) inflater.inflate(R.layout.auto_scrollpage_img, container, false);
ImageLoader.getInstance().displayImage(mPagerData.get(realP).getImageUrl(), netImgView, options);
netImgView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (pageItemClickListener != null) {
pageItemClickListener.onPageItemClickListener(mPagerData.get(realP));
}
}
});
container.addView(netImgView);
return netImgView;
}
@Override
public void destroyItem(ViewGroup container, int position, Object object) {
if (object instanceof View) {
container.removeView((View) object);
}
}
@Override
public boolean isViewFromObject(View view, Object object) {
return view == object;
}
}
/** 設置顯示條目的點擊事件 */
public void setOnPageItemClickListener(OnPageItemClickListener<T> pageItemClickListener) {
this.pageItemClickListener = pageItemClickListener;
}
}

是個接口,主要實現取得圖片的url:

public interface PagerData{
public String getImageUrl();//用于顯示網絡圖片
public void setImageUrl(String imgUrl);
}

有了以上的準備,只需要在Activity中取得圖片的url地址,調用refreshDatas()方法把參數傳入就可以了,activity中關鍵代碼:

viewPager = (AutoScrollViewPager<AdvertisementInfo>) headerView.findViewById(R.id.viewPager );//獲取ViewPager對象,

                advertisementVp.refreshDatas();//傳入對應參數
        advertisementVp.start(3000);

ok啦,時間原因,沒有貼出所有代碼,僅供參考。

 本文由用戶 fydxdk 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!