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啦,時間原因,沒有貼出所有代碼,僅供參考。
本文由用戶 f663x 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!