android:layout_gravity=“left|center_vertical”
android:layout_marginLeft=“20dip”
android:textSize=“22sp” />
GridView异步加载图片显示
/2013.8.19_Universal_Image_Loader_Demo/res/layout/ac_image_grid.xml
android:id=“@+id/gridview” android:layout_width=“fill_parent” android:layout_height=“fill_parent” android:gravity=“center” android:horizontalSpacing=“4dip” android:numColumns=“3” android:stretchMode=“columnWidth” android:verticalSpacing=“4dip” android:padding=“4dip” /> /2013.8.19_Universal_Image_Loader_Demo/res/layout/item_grid_image.xml android:id=“@+id/image” android:layout_width=“fill_parent” android:layout_height=“120dip” android:adjustViewBounds=“true” android:contentDescription=“@string/descr_image” android:scaleType=“centerCrop” /> ViewPager异步加载图片显示
**/2013.8.19_Universal_Image_Loader_Demo/res/layout/ac_image_pager.xml ** android:id=“@+id/pager” android:layout_width=“fill_parent” android:layout_height=“fill_parent” /> /2013.8.19_Universal_Image_Loader_Demo/res/layout/ item_pager_image.xml android:layout_width=“fill_parent” android:layout_height=“fill_parent” android:padding=“1dip” > android:id=“@+id/image” android:layout_width=“wrap_content” android:layout_height=“wrap_content” android:layout_gravity=“center” android:adjustViewBounds=“true” android:contentDescription=“@string/descr_image” /> android:id=“@+id/loading” android:layout_width=“wrap_content” android:layout_height=“wrap_content” android:layout_gravity=“center” android:visibility=“gone” /> Gallery画廊异步加载图片显示
**/2013.8.19_Universal_Image_Loader_Demo/res/layout/ac_image_gallery.xml ** android:id=“@+id/gallery” android:layout_width=“fill_parent” android:layout_height=“wrap_content” android:layout_gravity=“center_vertical” android:spacing=“1dip” /> /2013.8.19_Universal_Image_Loader_Demo/res/layout/item_gallery_image.xml android:id=“@+id/image” android:layout_width=“120dip” android:layout_height=“120dip” android:layout_gravity=“center” android:adjustViewBounds=“true” android:contentDescription=“@string/descr_image” android:scaleType=“centerCrop” /> 还有一个就是桌面小部件 以上只是布局文件,没有什么可以说,具体Activity代码实现如下: 先是这个: /2013.8.19_Universal_Image_Loader_Demo/src/com/nostra13/example/universalimageloader/HomeActivity.java 主界面Activity代码 /******************************************************************************* Copyright 2011-2013 Sergey Tarasevich Licensed under the Apache License, Version 2.0 (the “License”); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an “AS IS” BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. *******************************************************************************/ package com.nostra13.example.universalimageloader; import static com.nostra13.example.universalimageloader.Constants.IMAGES; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import android.content.Intent; import android.os.Bundle; import android.view.View; import com.nostra13.example.universalimageloader.Constants.Extra; import com.nostra13.universalimageloader.utils.L; /** */ public class HomeActivity extends BaseActivity { private static final String TEST_FILE_NAME = “Universal Image Loader @#&=±_.,!()~'%20.png”; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.ac_home); // 定义文件对象,目录:/mnt/sdcard, 文件名:TEST_FILE_NAME File testImageOnSdCard = new File(“/mnt/sdcard”, TEST_FILE_NAME); if (!testImageOnSdCard.exists()) { // 如果文件不存在 // 把文件复制到SD卡 copyTestImageToSdCard(testImageOnSdCard); } } // 点击进入ListView展示界面 public void onImageListClick(View view) { Intent intent = new Intent(this, ImageListActivity.class); intent.putExtra(Extra.IMAGES, IMAGES); startActivity(intent); } // 点击进入GridView展示界面 public void onImageGridClick(View view) { Intent intent = new Intent(this, ImageGridActivity.class); intent.putExtra(Extra.IMAGES, IMAGES); startActivity(intent); } // 点击进入ViewPager展示界面 public void onImagePagerClick(View view) { Intent intent = new Intent(this, ImagePagerActivity.class); intent.putExtra(Extra.IMAGES, IMAGES); startActivity(intent); } // 点击进入画廊展示界面 public void onImageGalleryClick(View view) { Intent intent = new Intent(this, ImageGalleryActivity.class); intent.putExtra(Extra.IMAGES, IMAGES); startActivity(intent); } @Override public void onBackPressed() { imageLoader.stop(); // 停止加载图片 super.onBackPressed(); } /** 开一个线程把assert目录下的图片复制到SD卡目录下 @param testImageOnSdCard */ private void copyTestImageToSdCard(final File testImageOnSdCard) { new Thread(new Runnable() { @Override public void run() { try { InputStream is = getAssets().open(TEST_FILE_NAME); FileOutputStream fos = new FileOutputStream(testImageOnSdCard); byte[] buffer = new byte[8192]; int read; try { while ((read = is.read(buffer)) != -1) { fos.write(buffer, 0, read); // 写入输出流 } } finally { fos.flush(); // 写入SD卡 fos.close(); // 关闭输出流 is.close(); // 关闭输入流 } } catch (IOException e) { L.w(“Can’t copy test image onto SD card”); } } }).start(); // 启动线程 } } /2013.8.19_Universal_Image_Loader_Demo/src/com/nostra13/example/universalimageloader/ BaseActivity.java /******************************************************************************* Copyright 2011-2013 Sergey Tarasevich Licensed under the Apache License, Version 2.0 (the “License”); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an “AS IS” BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. *******************************************************************************/ package com.nostra13.example.universalimageloader; import android.app.Activity; import android.view.Menu; import android.view.MenuItem; import com.nostra13.universalimageloader.core.ImageLoader; /** */ public abstract class BaseActivity extends Activity { protected ImageLoader imageLoader = ImageLoader.getInstance(); @Override public boolean onCreateOptionsMenu(Menu menu) { // 加载菜单 getMenuInflater().inflate(R.menu.main_menu, menu); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case R.id.item_clear_memory_cache: imageLoader.clearMemoryCache(); // 清除内存缓存 return true; case R.id.item_clear_disc_cache: imageLoader.clearDiscCache(); // 清除SD卡中的缓存 return true; default: return false; } } } /2013.8.19_Universal_Image_Loader_Demo/src/com/nostra13/example/universalimageloader/AbsListViewBaseActivity.java /******************************************************************************* Copyright 2011-2013 Sergey Tarasevich Licensed under the Apache License, Version 2.0 (the “License”); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an “AS IS” BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. *******************************************************************************/ package com.nostra13.example.universalimageloader; import android.os.Bundle; import android.view.Menu; import android.view.MenuItem; import android.widget.AbsListView; import com.nostra13.universalimageloader.core.assist.PauseOnScrollListener; /** @author Sergey Tarasevich (nostra13[at]gmail[dot]com) */ public class AbsListViewBaseActivity extends BaseActivity { protected static final String STATE_PAUSE_ON_SCROLL = “STATE_PAUSE_ON_SCROLL”; protected static final String STATE_PAUSE_ON_FLING = “STATE_PAUSE_ON_FLING”; protected AbsListView listView; protected boolean pauseOnScroll = false; protected boolean pauseOnFling = true; @Override public void onRestoreInstanceState(Bundle savedInstanceState) { pauseOnScroll = savedInstanceState.getBoolean(STATE_PAUSE_ON_SCROLL, false); pauseOnFling = savedInstanceState.getBoolean(STATE_PAUSE_ON_FLING, true); } @Override public void onResume() { super.onResume(); applyScrollListener(); } private void applyScrollListener() { listView.setOnScrollListener(new PauseOnScrollListener(imageLoader, pauseOnScroll, pauseOnFling)); } @Override public void onSaveInstanceState(Bundle outState) { outState.putBoolean(STATE_PAUSE_ON_SCROLL, pauseOnScroll); outState.putBoolean(STATE_PAUSE_ON_FLING, pauseOnFling); } @Override public boolean onPrepareOptionsMenu(Menu menu) { MenuItem pauseOnScrollItem = menu.findItem(R.id.item_pause_on_scroll); pauseOnScrollItem.setVisible(true); pauseOnScrollItem.setChecked(pauseOnScroll); MenuItem pauseOnFlingItem = menu.findItem(R.id.item_pause_on_fling); pauseOnFlingItem.setVisible(true); pauseOnFlingItem.setChecked(pauseOnFling); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case R.id.item_pause_on_scroll: pauseOnScroll = !pauseOnScroll; item.setChecked(pauseOnScroll); applyScrollListener(); return true; case R.id.item_pause_on_fling: pauseOnFling = !pauseOnFling; item.setChecked(pauseOnFling); applyScrollListener(); return true; default: return super.onOptionsItemSelected(item); } } } /2013.8.19_Universal_Image_Loader_Demo/src/com/nostra13/example/universalimageloader/Constants.java 常量类代码 /******************************************************************************* Copyright 2011-2013 Sergey Tarasevich Licensed under the Apache License, Version 2.0 (the “License”); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an “AS IS” BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. *******************************************************************************/ package com.nostra13.example.universalimageloader; /** @author Sergey Tarasevich (nostra13[at]gmail[dot]com) 常量类 */ public final class Constants { // 一堆图片链接 public static final String[] IMAGES = new String[] { // Heavy images “https://lh6.googleusercontent.com/-jZgveEqb6pg/T3R4kXScycI/AAAAAAAAAE0/xQ7CvpfXDzc/s1024/sample_image_01.jpg”, “https://lh4.googleusercontent.com/-K2FMuOozxU0/T3R4lRAiBTI/AAAAAAAAAE8/a3Eh9JvnnzI/s1024/sample_image_02.jpg”, “https://lh5.googleusercontent.com/-SCS5C646rxM/T3R4l7QB6xI/AAAAAAAAAFE/xLcuVv3CUyA/s1024/sample_image_03.jpg”, “https://lh6.googleusercontent.com/-f0NJR6-_Thg/T3R4mNex2wI/AAAAAAAAAFI/45oug4VE8MI/s1024/sample_image_04.jpg”, “https://lh3.googleusercontent.com/-n-xcJmiI0pg/T3R4mkSchHI/AAAAAAAAAFU/EoiNNb7kk3A/s1024/sample_image_05.jpg”, “https://lh3.googleusercontent.com/-X43vAudm7f4/T3R4nGSChJI/AAAAAAAAAFk/3bna6D-2EE8/s1024/sample_image_06.jpg”, “https://lh5.googleusercontent.com/-MpZneqIyjXU/T3R4nuGO1aI/AAAAAAAAAFg/r09OPjLx1ZY/s1024/sample_image_07.jpg”, “https://lh6.googleusercontent.com/-ql3YNfdClJo/T3XvW9apmFI/AAAAAAAAAL4/_6HFDzbahc4/s1024/sample_image_08.jpg”, “https://lh5.googleusercontent.com/-Pxa7eqF4cyc/T3R4oasvPEI/AAAAAAAAAF0/-uYDH92h8LA/s1024/sample_image_09.jpg”, “https://lh4.googleusercontent.com/-Li-rjhFEuaI/T3R4o-VUl4I/AAAAAAAAAF8/5E5XdMnP1oE/s1024/sample_image_10.jpg”, “https://lh5.googleusercontent.com/-_HU4fImgFhA/T3R4pPVIwWI/AAAAAAAAAGA/0RfK_Vkgth4/s1024/sample_image_11.jpg”, “https://lh6.googleusercontent.com/-0gnNrVjwa0Y/T3R4peGYJwI/AAAAAAAAAGU/uX_9wvRPM9I/s1024/sample_image_12.jpg”, “https://lh3.googleusercontent.com/-HBxuzALS_Zs/T3R4qERykaI/AAAAAAAAAGQ/_qQ16FaZ1q0/s1024/sample_image_13.jpg”, “https://lh4.googleusercontent.com/-cKojDrARNjQ/T3R4qfWSGPI/AAAAAAAAAGY/MR5dnbNaPyY/s1024/sample_image_14.jpg”, “https://lh3.googleusercontent.com/-WujkdYfcyZ8/T3R4qrIMGUI/AAAAAAAAAGk/277LIdgvnjg/s1024/sample_image_15.jpg”, “https://lh6.googleusercontent.com/-FMHR7Vy3PgI/T3R4rOXlEKI/AAAAAAAAAGs/VeXrDNDBkaw/s1024/sample_image_16.jpg”, “https://lh4.googleusercontent.com/-mrR0AJyNTH0/T3R4rZs6CuI/AAAAAAAAAG0/UE1wQqCOqLA/s1024/sample_image_17.jpg”, “https://lh6.googleusercontent.com/-z77w0eh3cow/T3R4rnLn05I/AAAAAAAAAG4/BaerfWoNucU/s1024/sample_image_18.jpg”, “https://lh5.googleusercontent.com/-aWVwh1OU5Bk/T3R4sAWw0yI/AAAAAAAAAHE/4_KAvJttFwA/s1024/sample_image_19.jpg”, “https://lh6.googleusercontent.com/-q-js52DMnWQ/T3R4tZhY2sI/AAAAAAAAAHM/A8kjp2Ivdqg/s1024/sample_image_20.jpg”, “https://lh5.googleusercontent.com/-_jIzvvzXKn4/T3R4t7xpdVI/AAAAAAAAAHU/7QC6eZ10jgs/s1024/sample_image_21.jpg”, “https://lh3.googleusercontent.com/-lnGi4IMLpwU/T3R4uCMa7vI/AAAAAAAAAHc/1zgzzz6qTpk/s1024/sample_image_22.jpg”, “https://lh5.googleusercontent.com/-fFCzKjFPsPc/T3R4u0SZPFI/AAAAAAAAAHk/sbgjzrktOK0/s1024/sample_image_23.jpg”, “https://lh4.googleusercontent.com/-8TqoW5gBE_Y/T3R4vBS3NPI/AAAAAAAAAHs/EZYvpNsaNXk/s1024/sample_image_24.jpg”, “https://lh6.googleusercontent.com/-gc4eQ3ySdzs/T3R4vafoA7I/AAAAAAAAAH4/yKii5P6tqDE/s1024/sample_image_25.jpg”, “https://lh5.googleusercontent.com/–NYOPCylU7Q/T3R4vjAiWkI/AAAAAAAAAH8/IPNx5q3ptRA/s1024/sample_image_26.jpg”, “https://lh6.googleusercontent.com/-9IJM8so4vCI/T3R4vwJO2yI/AAAAAAAAAIE/ljlr-cwuqZM/s1024/sample_image_27.jpg”, “https://lh4.googleusercontent.com/-KW6QwOHfhBs/T3R4w0RsQiI/AAAAAAAAAIM/uEFLVgHPFCk/s1024/sample_image_28.jpg”, “https://lh4.googleusercontent.com/-z2557Ec1ctY/T3R4x3QA2hI/AAAAAAAAAIk/9-GzPL1lTWE/s1024/sample_image_29.jpg”, “https://lh5.googleusercontent.com/-LaKXAn4Kr1c/T3R4yc5b4lI/AAAAAAAAAIY/fMgcOVQfmD0/s1024/sample_image_30.jpg”, “https://lh4.googleusercontent.com/-F9LRToJoQdo/T3R4yrLtyQI/AAAAAAAAAIg/ri9uUCWuRmo/s1024/sample_image_31.jpg”, “https://lh4.googleusercontent.com/-6X-xBwP-QpI/T3R4zGVboII/AAAAAAAAAIs/zYH4PjjngY0/s1024/sample_image_32.jpg”, “https://lh5.googleusercontent.com/-VdLRjbW4LAs/T3R4zXu3gUI/AAAAAAAAAIw/9aFp9t7mCPg/s1024/sample_image_33.jpg”, “https://lh6.googleusercontent.com/-gL6R17_fDJU/T3R4zpIXGjI/AAAAAAAAAI8/Q2Vjx-L9X20/s1024/sample_image_34.jpg”, “https://lh3.googleusercontent.com/-1fGH4YJXEzo/T3R40Y1B7KI/AAAAAAAAAJE/MnTsa77g-nk/s1024/sample_image_35.jpg”, “https://lh4.googleusercontent.com/-Ql0jHSrea-A/T3R403mUfFI/AAAAAAAAAJM/qzI4SkcH9tY/s1024/sample_image_36.jpg”, “https://lh5.googleusercontent.com/-BL5FIBR_tzI/T3R41DA0AKI/AAAAAAAAAJk/GZfeeb-SLM0/s1024/sample_image_37.jpg”, “https://lh4.googleusercontent.com/-wF2Vc9YDutw/T3R41fR2BCI/AAAAAAAAAJc/JdU1sHdMRAk/s1024/sample_image_38.jpg”, “https://lh6.googleusercontent.com/-ZWHiPehwjTI/T3R41zuaKCI/AAAAAAAAAJg/hR3QJ1v3REg/s1024/sample_image_39.jpg”, // Light images “http://tabletpcssource.com/wp-content/uploads/2011/05/android-logo.png”, “http://simpozia.com/pages/images/stories/windows-icon.png”, “https://si0.twimg.com/profile_images/1135218951/gmail_profile_icon3_normal.png”, “http://www.krify.net/wp-content/uploads/2011/09/Macromedia_Flash_dock_icon.png”, “http://radiotray.sourceforge.net/radio.png”, “http://www.bandwidthblog.com/wp-content/uploads/2011/11/twitter-logo.png”, “http://weloveicons.s3.amazonaws.com/icons/100907_itunes1.png”, “http://weloveicons.s3.amazonaws.com/icons/100929_applications.png”, “http://www.idyllicmusic.com/index_files/get_apple-iphone.png”, “http://www.frenchrevolutionfood.com/wp-content/uploads/2009/04/Twitter-Bird.png”, “http://3.bp.blogspot.com/-ka5MiRGJ_S4/TdD9OoF6bmI/AAAAAAAAE8k/7ydKtptUtSg/s1600/Google_Sky%2BMaps_Android.png”, “http://www.desiredsoft.com/images/icon_webhosting.png”, “http://goodereader.com/apps/wp-content/uploads/downloads/thumbnails/2012/01/hi-256-0-99dda8c730196ab93c67f0659d5b8489abdeb977.png”, “http://1.bp.blogspot.com/-mlaJ4p_3rBU/TdD9OWxN8II/AAAAAAAAE8U/xyynWwr3_4Q/s1600/antivitus_free.png”, “http://cdn3.iconfinder.com/data/icons/transformers/computer.png”, “http://cdn.geekwire.com/wp-content/uploads/2011/04/firefox.png?7794fe”, “https://ssl.gstatic.com/android/market/com.rovio.angrybirdsseasons/hi-256-9-347dae230614238a639d21508ae492302340b2ba”, “http://androidblaze.com/wp-content/uploads/2011/12/tablet-pc-256x256.jpg”, “http://www.theblaze.com/wp-content/uploads/2011/08/Apple.png”, “http://1.bp.blogspot.com/-y-HQwQ4Kuu0/TdD9_iKIY7I/AAAAAAAAE88/3G4xiclDZD0/s1600/Twitter_Android.png”, “http://3.bp.blogspot.com/-nAf4IMJGpc8/TdD9OGNUHHI/AAAAAAAAE8E/VM9yU_lIgZ4/s1600/Adobe%2BReader_Android.png”, “http://cdn.geekwire.com/wp-content/uploads/2011/05/oovoo-android.png?7794fe”, “http://icons.iconarchive.com/icons/kocco/ndroid/128/android-market-2-icon.png”, “http://thecustomizewindows.com/wp-content/uploads/2011/11/Nicest-Android-Live-Wallpapers.png”, “http://c.wrzuta.pl/wm16596/a32f1a47002ab3a949afeb4f”, “http://macprovid.vo.llnwd.net/o43/hub/media/1090/6882/01_headline_Muse.jpg”, // Special cases “http://cdn.urbanislandz.com/wp-content/uploads/2011/10/MMSposter-large.jpg”, // very large image “file:///sdcard/Universal Image Loader @#&=±_.,!()~'%20.png”, // Image from SD card with encoded symbols “assets://Liv 《Android学习笔记总结+最新移动架构视频+大厂安卓面试真题+项目实战源码讲义》无偿开源 徽信搜索公众号【编程进阶路】 ing Things @#&=±_.,!()~'%20.jpg”, // Image from assets “drawable://” + R.drawable.ic_launcher, // Image from drawables “http://upload.wikimedia.org/wikipedia/ru/b/b6/袣邪泻_泻芯褌_褋_屑褘褕邪屑懈_胁芯械胁邪谢.png”, // Link with UTF-8 “https://www.eff.org/sites/default/files/chrome150_0.jpg”, // Image from HTTPS “http://bit.ly/soBiXr”, // Redirect link “http://img001.us.expono.com/100001/100001-1bc30-2d736f_m.jpg”, // EXIF “”, // Empty link “http://wrong.site.com/corruptedLink”, // Wrong link }; private Constants() { } // 配置 public static class Config { public static final boolean DEVELOPER_MODE = false; } // 额外类 public static class Extra { public static final String IMAGES = “com.nostra13.example.universalimageloader.IMAGES”; public static final String IMAGE_POSITION = “com.nostra13.example.universalimageloader.IMAGE_POSITION”; } } /2013.8.19_Universal_Image_Loader_Demo/src/com/nostra13/example/universalimageloader/ImageListActivity.java /******************************************************************************* Copyright 2011-2013 Sergey Tarasevich Licensed under the Apache License, Version 2.0 (the “License”); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an “AS IS” BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. *******************************************************************************/ package com.nostra13.example.universalimageloader; import java.util.Collections; import java.util.LinkedList; import java.util.List; import android.content.Intent; import android.graphics.Bitmap; import android.os.Bundle; import android.view.View; import android.view.ViewGroup; import android.widget.AdapterView; import android.widget.AdapterView.OnItemClickListener; import android.widget.BaseAdapter; import android.widget.ImageView; import android.widget.ListView; import android.widget.TextView; import com.nostra13.example.universalimageloader.Constants.Extra; import com.nostra13.universalimageloader.core.DisplayImageOptions; import com.nostra13.universalimageloader.core.assist.ImageLoadingListener; import com.nostra13.universalimageloader.core.assist.SimpleImageLoadingListener; import com.nostra13.universalimageloader.core.display.FadeInBitmapDisplayer; import com.nostra13.universalimageloader.core.display.RoundedBitmapDisplayer; /** */ public class ImageListActivity extends AbsListViewBaseActivity { DisplayImageOptions options; // DisplayImageOptions是用于设置图片显示的类 String[] imageUrls; // 图片路径 @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.ac_image_list); Bundle bundle = getIntent().getExtras(); imageUrls = bundle.getStringArray(Extra.IMAGES); // 使用DisplayImageOptions.Builder()创建DisplayImageOptions options = new DisplayImageOptions.Builder() .showStubImage(R.drawable.ic_stub) // 设置图片下载期间显示的图片 .showImageForEmptyUri(R.drawable.ic_empty) // 设置图片Uri为空或是错误的时候显示的图片 .showImageOnFail(R.drawable.ic_error) // 设置图片加载或解码过程中发生错误显示的图片 .cacheInMemory(true) // 设置下载的图片是否缓存在内存中 .cacheOnDisc(true) // 设置下载的图片是否缓存在SD卡中 .displayer(new RoundedBitmapDisplayer(20)) // 设置成圆角图片 .build(); // 创建配置过得DisplayImageOption对象 listView = (ListView) findViewById(android.R.id.list); ((ListView) listView).setAdapter(new ItemAdapter()); listView.setOnItemClickListener(new OnItemClickListener() { @Override public void onItemClick(AdapterView> parent, View view, int position, long id) { // 点击列表项转入ViewPager显示界面 startImagePagerActivity(position); } }); } @Override public void onBackPressed() { AnimateFirstDisplayListener.displayedImages.clear(); super.onBackPressed(); } private void startImagePagerActivity(int position) { Intent intent = new Intent(this, ImagePagerActivity.class); intent.putExtra(Extra.IMAGES, imageUrls); intent.putExtra(Extra.IMAGE_POSITION, position); startActivity(intent); } /** 自定义列表项适配器 */ class ItemAdapter extends BaseAdapter { private ImageLoadingListener animateFirstListener = new AnimateFirstDisplayListener(); private class ViewHolder { public TextView text; public ImageView image; } @Override public int getCount() { return imageUrls.length; } @Override public Object getItem(int position) { return position; } @Override public long getItemId(int position) { return position; } @Override public View getView(final int position, View convertView, ViewGroup parent) { View view = convertView; final ViewHolder holder; if (convertView == null) { view = getLayoutInflater().inflate(R.layout.item_list_image, parent, false); holder = new ViewHolder(); holder.text = (TextView) view.findViewById(R.id.text); holder.image = (ImageView) view.findViewById(R.id.image); view.setTag(holder); // 给View添加一个格外的数据 } else { holder = (ViewHolder) view.getTag(); // 把数据取出来 } holder.text.setText("Item " + (position + 1)); // TextView设置文本 /** 显示图片 参数1:图片url 参数2:显示图片的控件 参数3:显示图片的设置 参数4:监听器 */ imageLoader.displayImage(imageUrls[position], holder.image, options, animateFirstListener); return view; } } /** 图片加载第一次显示监听器 @author Administrator */ private static class AnimateFirstDisplayListener extends SimpleImageLoadingListener { static final List displayedImages = Collections.synchronizedList(new LinkedList()); @Override public void onLoadingComplete(String imageUri, View view, Bitmap loadedImage) { if (loadedImage != null) { ImageView imageView = (ImageView) view; // 是否第一次显示 boolean firstDisplay = !displayedImages.contains(imageUri); if (firstDisplay) { // 图片淡入效果 FadeInBitmapDisplayer.animate(imageView, 500); displayedImages.add(imageUri); } } } } } /2013.8.19_Universal_Image_Loader_Demo/src/com/nostra13/example/universalimageloader/ImageGridActivity.java 网格视图Activity /******************************************************************************* Copyright 2011-2013 Sergey Tarasevich Licensed under the Apache License, Version 2.0 (the “License”); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an “AS IS” BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. *******************************************************************************/ package com.nostra13.example.universalimageloader; import android.content.Intent; import android.graphics.Bitmap; import android.os.Bundle; import android.view.View; import android.view.ViewGroup; import android.widget.AdapterView; import android.widget.AdapterView.OnItemClickListener; import android.widget.BaseAdapter; import android.widget.GridView; import android.widget.ImageView; import com.nostra13.example.universalimageloader.Constants.Extra; import com.nostra13.universalimageloader.core.DisplayImageOptions; /** 网格视图显示Activity @author Sergey Tarasevich (nostra13[at]gmail[dot]com) */ public class ImageGridActivity extends AbsListViewBaseActivity { String[] imageUrls; // 图片Url DisplayImageOptions options; // 显示图片的设置 @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.ac_image_grid); Bundle bundle = getIntent().getExtras(); imageUrls = bundle.getStringArray(Extra.IMAGES); options = new DisplayImageOptions.Builder() .showStubImage(R.drawable.ic_stub) .showImageForEmptyUri(R.drawable.ic_empty) .showImageOnFail(R.drawable.ic_error) .cacheInMemory(true) .cacheOnDisc(true) .bitmapConfig(Bitmap.Config.RGB_565) //设置图片的解码类型 .build(); listView = (GridView) findViewById(R.id.gridview); ((GridView) listView).setAdapter(new ImageAdapter()); // 填充数据 listView.setOnItemClickListener(new OnItemClickListener() { @Override public void onItemClick(AdapterView> parent, View view, int position, long id) { startImagePagerActivity(position); } }); }