Base
public class MyApplication extends Application {
@Override
public void onCreate() {
super.onCreate();
//在Application中创建默认的ImageLoaderConfiguration配置参数,并初始化到ImageLoader中
ImageLoader.getInstance().init(ImageLoaderConfiguration.createDefault(this));
}
} /**
* 基类,提供共用的ImageLoader,共用的菜单
* @author 白乾涛
*/
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.clearDiskCache();//清除磁盘缓存。建议使用clearDiskCache()。经查源码clearDiscCache中就一行代码,那就是调用clearDiskCache方法。
return true;
default:
return false;
}
}
@Override
public void onBackPressed() {
imageLoader.stop();
super.onBackPressed();
}
} /**
* 带有两个滑动控制菜单的基类,设置是否在滑动过程中、在猛的滑动界面的时候停止加载图片。适用于ListView或GridView
* @author 白乾涛
*/
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 onResume() {
super.onResume();
//设置是否在滑动过程中、在猛的滑动界面的时候停止加载图片。
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 void onRestoreInstanceState(Bundle savedInstanceState) {
pauseOnScroll = savedInstanceState.getBoolean(STATE_PAUSE_ON_SCROLL, false);
pauseOnFling = savedInstanceState.getBoolean(STATE_PAUSE_ON_FLING, true);
}
@Override
//onCreateOptionsMenu只会在Menu显示之前去调用一次,之后就不会再去调用。
//onPrepareOptionsMenu是每次在显示Menu之前都会去调用,只要按一次Menu按鍵,就会调用一次。所以可以在这里动态的改变menu。
public boolean onPrepareOptionsMenu(Menu menu) {
//menu.clear(); //如果没有clear而直接add的话,那么菜单中菜单项是会“追加”的
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);
listView.setOnScrollListener(new PauseOnScrollListener(imageLoader, pauseOnScroll, pauseOnFling));
return true;
case R.id.item_pause_on_fling:
pauseOnFling = !pauseOnFling;
item.setChecked(pauseOnFling);
listView.setOnScrollListener(new PauseOnScrollListener(imageLoader, pauseOnScroll, pauseOnFling));
return true;
default://默认调用父类的方法
return super.onOptionsItemSelected(item);
}
}
} ListView
public class ListViewActivity extends AbsListViewBaseActivity {
private ViewHolder holder;
private DisplayImageOptions options;
private SimpleImageLoadingListener loadingListener;
/**图片的地址*/
private String[] imageUrls;
/**记录所有已加载的URL*/
private static final List<String> displayedImages = Collections.synchronizedList(new LinkedList<String>());
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
imageUrls = getIntent().getExtras().getStringArray(Extra.IMAGES);
options = new DisplayImageOptions.Builder()//
.showImageOnLoading(R.drawable.ic_stub).showImageForEmptyUri(R.drawable.ic_empty).showImageOnFail(R.drawable.ic_error)//
.cacheInMemory(true).cacheOnDisk(true).considerExifParams(true).displayer(new CircleBitmapDisplayer(0xffff0000, 2)).build();//圆形描边
loadingListener = new SimpleImageLoadingListener() {
@Override
public void onLoadingComplete(String imageUri, View view, Bitmap loadedImage) {
//加载完图片后append图片宽高信息!注意:只能在回调中获取,在其他地方获取都是不靠谱的!
if (loadedImage != null) { //加载失败时loadedImage可能为null
holder.text.append(loadedImage.getWidth() + " * " + loadedImage.getHeight());//Bitmap会被压缩后加载仅内存,然后ImageView会对其进行缩放
((BaseAdapter) ((ListView) listView).getAdapter()).notifyDataSetChanged();//必须调用
//第一次加载时显示渐变动画
boolean firstDisplay = !displayedImages.contains(imageUri);
if (firstDisplay) {
FadeInBitmapDisplayer.animate((ImageView) view, 500);
displayedImages.add(imageUri);
}
}
}
};
//******************************************************************************************
listView = new ListView(this);
((ListView) listView).setAdapter(new ItemAdapter());
listView.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
Intent intent = new Intent(ListViewActivity.this, ViewPagerActivity.class);
intent.putExtra(Extra.IMAGES, imageUrls);
intent.putExtra(Extra.IMAGE_POSITION, position);
startActivity(intent);
}
});
setContentView(listView);
}
@Override
public void onBackPressed() {
displayedImages.clear();
super.onBackPressed();
}
//***********************************************************************************************************************************************
private class ItemAdapter extends BaseAdapter {
@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) {
if (convertView == null) {
convertView = getLayoutInflater().inflate(R.layout.item_list_image, parent, false);
holder = new ViewHolder();
holder.text = (TextView) convertView.findViewById(R.id.text);
holder.image = (ImageView) convertView.findViewById(R.id.image);
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
holder.text.setText(position + ":");//必须放在displayImage之前,否则会产生线程安全问题(直接导致loadingListener中无法append图片宽高信息)
imageLoader.displayImage(imageUrls[position], holder.image, options, loadingListener);
return convertView;
}
}
//*********************************************************************************************************************************************
private class ViewHolder {
public TextView text;
public ImageView image;
}
} ViewPage
public class ViewPagerActivity extends BaseActivity {
private static final String STATE_POSITION = "STATE_POSITION";//初始位置
private DisplayImageOptions options;
private ViewPager pager;
private String[] imageUrls;
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Bundle bundle = getIntent().getExtras();
if (getIntent() == null || getIntent().getExtras() == null) {
finish();
}
imageUrls = bundle.getStringArray(Extra.IMAGES);
int pagerPosition = bundle.getInt(Extra.IMAGE_POSITION, 0);
if (savedInstanceState != null) {
pagerPosition = savedInstanceState.getInt(STATE_POSITION);
}
options = new DisplayImageOptions.Builder().showImageForEmptyUri(R.drawable.ic_empty).showImageOnFail(R.drawable.ic_error)
.resetViewBeforeLoading(true).cacheOnDisk(true).imageScaleType(ImageScaleType.EXACTLY).bitmapConfig(Bitmap.Config.RGB_565)
.considerExifParams(true).displayer(new FadeInBitmapDisplayer(300)).build();
pager = new ViewPager(this);
pager.setAdapter(new ImagePagerAdapter());
pager.setCurrentItem(pagerPosition);
setContentView(pager);
}
@Override
public void onSaveInstanceState(Bundle outState) {
outState.putInt(STATE_POSITION, pager.getCurrentItem());
}
//******************************************************************************************
private class ImagePagerAdapter extends PagerAdapter {
@Override
public void destroyItem(ViewGroup container, int position, Object object) {
container.removeView((View) object);
}
@Override
public int getCount() {
return imageUrls.length;
}
@Override
public boolean isViewFromObject(View view, Object object) {
return view.equals(object);
}
@Override
public Object instantiateItem(ViewGroup view, int position) {
View imageLayout = LayoutInflater.from(ViewPagerActivity.this).inflate(R.layout.item_pager_image, view, false);
ImageView imageView = (ImageView) imageLayout.findViewById(R.id.image);
final ProgressBar spinner = (ProgressBar) imageLayout.findViewById(R.id.loading);
imageLoader.displayImage(imageUrls[position], imageView, options, new SimpleImageLoadingListener() {
@Override
public void onLoadingStarted(String imageUri, View view) {
spinner.setVisibility(View.VISIBLE);
}
@Override
public void onLoadingFailed(String imageUri, View view, FailReason failReason) {
String message = null;
switch (failReason.getType()) { //加载失败原因
case IO_ERROR:
message = "Input/Output error";
break;
case DECODING_ERROR:
message = "Image can't be decoded";
break;
case NETWORK_DENIED:
message = "Downloads are denied";
break;
case OUT_OF_MEMORY:
message = "Out Of Memory error";
break;
case UNKNOWN:
message = "Unknown error";
break;
}
Toast.makeText(ViewPagerActivity.this, message, Toast.LENGTH_SHORT).show();
spinner.setVisibility(View.GONE);
}
@Override
public void onLoadingComplete(String imageUri, View view, Bitmap loadedImage) {
spinner.setVisibility(View.GONE);
}
});
view.addView(imageLayout, 0);
return imageLayout;
}
}
} 公司封装的工具类
import java.util.ArrayList;
import java.util.List;
import android.app.Activity;
import android.content.ContentResolver;
import android.content.Context;
import android.database.Cursor;
import android.graphics.Bitmap;
import android.graphics.Bitmap.Config;
import android.graphics.BitmapFactory;
import android.provider.MediaStore;
import android.text.TextUtils;
import android.widget.ImageView;
import com.lokinfo.m95xiu.application.LokApp;
import com.lokinfo.m95xiu.util.M95Log;
import com.nostra13.universalimageloader.core.DisplayImageOptions;
import com.nostra13.universalimageloader.core.ImageLoader;
import com.nostra13.universalimageloader.core.ImageLoaderConfiguration;
import com.nostra13.universalimageloader.core.assist.ImageScaleType;
import com.nostra13.universalimageloader.core.assist.QueueProcessingType;
import com.nostra13.universalimageloader.core.display.CircleBitmapDisplayer;
import com.nostra13.universalimageloader.core.display.RoundedBitmapDisplayer;
public class ImageHelper {
public static void init(Context context){
DisplayImageOptions options = new DisplayImageOptions.Builder()
.cacheInMemory(true)//设置下载的图片是否缓存在内存中
.cacheOnDisk(true)//设置下载的图片是否缓存在SD卡中
.considerExifParams(true) //是否考虑JPEG图像EXIF参数(旋转,翻转)
.imageScaleType(ImageScaleType.EXACTLY_STRETCHED)//设置图片以如何的编码方式显示
.bitmapConfig(Config.RGB_565)//设置图片的解码类型//
.build();//构建完成
ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(context.getApplicationContext())
.memoryCacheExtraOptions(480, 800)
.threadPoolSize(3)//线程池内加载的数量
.threadPriority(Thread.NORM_PRIORITY)
.denyCacheImageMultipleSizesInMemory()
.tasksProcessingOrder(QueueProcessingType.FIFO)
.defaultDisplayImageOptions(options)
.writeDebugLogs()
.build();//开始构建
ImageLoader.getInstance().init(config);//全局初始化此配置
}
public static void loadImage(String urlString , ImageView imageView , int defaultRes){
DisplayImageOptions options = new DisplayImageOptions.Builder()
.showImageOnLoading(defaultRes) //设置图片在下载期间显示的图片
.showImageForEmptyUri(defaultRes)//设置图片Uri为空或是错误的时候显示的图片
.showImageOnFail(defaultRes) //设置图片加载/解码过程中错误时候显示的图片
.cacheInMemory(true)//设置下载的图片是否缓存在内存中
.cacheOnDisk(true)//设置下载的图片是否缓存在SD卡中
.considerExifParams(true) //是否考虑JPEG图像EXIF参数(旋转,翻转)
.imageScaleType(ImageScaleType.EXACTLY_STRETCHED)//设置图片以如何的编码方式显示
.bitmapConfig(Config.RGB_565)//设置图片的解码类型//
.resetViewBeforeLoading(true)//设置图片在下载前是否重置,复位
.build();//构建完成
ImageLoader.getInstance().displayImage(urlString, imageView, options);
}
/**
* 加载圆角图片
* @param urlString
* @param imageView
* @param cornerRadius 圆角大小
* @param defaultRes
*/
public static void LoadRoundImage(String urlString , ImageView imageView , int cornerRadius , int defaultRes){
DisplayImageOptions options = new DisplayImageOptions.Builder()
.showImageOnLoading(defaultRes) //设置图片在下载期间显示的图片
.showImageForEmptyUri(defaultRes)//设置图片Uri为空或是错误的时候显示的图片
.showImageOnFail(defaultRes) //设置图片加载/解码过程中错误时候显示的图片
.cacheInMemory(true)//设置下载的图片是否缓存在内存中
.cacheOnDisk(true)//设置下载的图片是否缓存在SD卡中
.considerExifParams(true) //是否考虑JPEG图像EXIF参数(旋转,翻转)
.imageScaleType(ImageScaleType.EXACTLY_STRETCHED)//设置图片以如何的编码方式显示
.bitmapConfig(Config.RGB_565)//设置图片的解码类型//
.resetViewBeforeLoading(true)//设置图片在下载前是否重置,复位
.displayer(new RoundedBitmapDisplayer(cornerRadius))//是否设置为圆角,弧度为多少
.build();//构建完成
ImageLoader.getInstance().displayImage(urlString, imageView, options);
}
/**
* 加载圆形图片
* @param urlString
* @param imageView
* @param defaultRes
*/
public static void LoadCircleImage(String urlString , ImageView imageView, int defaultRes){
Bitmap circleBitmap = BitmapFactory.decodeResource(LokApp.app().getApplicationContext().getResources(), defaultRes);
CircleImageDrawable circleImageDrawable = new CircleImageDrawable(circleBitmap);
DisplayImageOptions options = new DisplayImageOptions.Builder()
.showImageOnLoading(circleImageDrawable) //设置图片在下载期间显示的图片
.showImageForEmptyUri(circleImageDrawable)//设置图片Uri为空或是错误的时候显示的图片
.showImageOnFail(circleImageDrawable) //设置图片加载/解码过程中错误时候显示的图片
.cacheInMemory(true)//设置下载的图片是否缓存在内存中
.cacheOnDisk(true)//设置下载的图片是否缓存在SD卡中
.considerExifParams(true) //是否考虑JPEG图像EXIF参数(旋转,翻转)
.imageScaleType(ImageScaleType.EXACTLY_STRETCHED)//设置图片以如何的编码方式显示
.bitmapConfig(Config.RGB_565)//设置图片的解码类型//
.resetViewBeforeLoading(true)//设置图片在下载前是否重置,复位
.displayer(new CircleBitmapDisplayer())
.build();//构建完成
ImageLoader.getInstance().displayImage(urlString, imageView, options);
}
/**
* 获取手机上所有图片的地址
* @param context
* @return
*/
public static List<String> getAllImageFlilPath(Activity context){
List<String> paths = new ArrayList<String>();
ContentResolver cr = context.getContentResolver();
Cursor cursor = null;
try{
cursor = cr.query(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, null, null, null, MediaStore.Images.Media.DEFAULT_SORT_ORDER);
while(cursor.moveToNext()){
String imgPath = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA));
if (!TextUtils.isEmpty(imgPath)){
paths.add(imgPath);
}
}
}catch(Exception e){
M95Log.e("Exception", "getAllImageFlilPath" + e.getMessage());
e.printStackTrace();
}finally{
if(cursor != null) cursor.close();
}
return paths;
}
} 附件列表