/*
* The MIT License (MIT)
*
* Copyright (c) 2014-2015 Umeng, Inc
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*/
package com.umeng.comm.ui.adapters;
import android.content.DialogInterface.OnDismissListener;
import android.graphics.Bitmap;
import android.graphics.Point;
import android.support.v4.view.PagerAdapter;
import android.text.TextUtils;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.view.ViewGroup.LayoutParams;
import android.widget.ImageView;
import android.widget.ProgressBar;
import com.umeng.comm.core.beans.ImageItem;
import com.umeng.comm.core.imageloader.ImgDisplayOption;
import com.umeng.comm.core.imageloader.LocalImageLoader;
import com.umeng.comm.core.imageloader.UMImageLoader;
import com.umeng.comm.core.imageloader.UMImageLoader.ImageLoadingListener;
import com.umeng.comm.core.imageloader.cache.ImageCache;
import com.umeng.comm.core.imageloader.utils.Md5Helper;
import com.umeng.comm.core.sdkmanager.ImageLoaderManager;
import com.umeng.comm.core.utils.ResFinder;
import com.umeng.comm.ui.presenter.impl.ImageBrowserPresenter;
import com.umeng.comm.ui.widgets.ScaleImageView;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
/**
* feed图片浏览的Adapter
*/
public class ImagePagerAdapter extends PagerAdapter {
private final List<ImageItem> mPaths = new ArrayList<ImageItem>();
UMImageLoader mImageLoader;
public boolean isPreView = false;// 是否是预览
private OnDismissListener mListener;
ImageBrowserPresenter mPresenter;
/**
* 缓存的图片path MD5值,也就是缓存的key
*/
private List<String> mCachedImagePath = new LinkedList<String>();
public ImagePagerAdapter() {
mImageLoader = ImageLoaderManager.getInstance().getCurrentSDK();
}
@Override
public int getCount() {
return mPaths.size();
}
@Override
public Object instantiateItem(ViewGroup container, int position) {
if (mPresenter == null) {
mPresenter = new ImageBrowserPresenter(container.getContext());
}
View view = createView(container, mPaths.get(position));
container.addView(view, LayoutParams.MATCH_PARENT,
LayoutParams.MATCH_PARENT);
return view;
}
/**
* ' 存储缓存在内存中的图片URL的MD5值列表,便于在Dialog销毁时清空这些缓存
*
* @param originPath
*/
private void storeImageItemMd5(String originPath) {
String md5 = Md5Helper.toMD5(originPath);
mCachedImagePath.add(md5);
}
@Override
public boolean isViewFromObject(View view, Object object) {
return view == object;
}
@Override
public void destroyItem(ViewGroup container, int position, Object object) {
container.removeView((View) object);
}
/**
* 确保创建的View被销毁
*/
@Override
public int getItemPosition(Object object) {
return POSITION_NONE;
}
public void addImagePaths(List<ImageItem> paths) {
mPaths.addAll(paths);
notifyDataSetChanged();
}
private void clearImageCache() {
for (String md5 : mCachedImagePath) {
ImageCache.getInstance().removeFromMemory(md5);
}
}
public void cleanCache() {
mPaths.clear();
notifyDataSetChanged();
// 清空缓存
clearImageCache();
mImageLoader.reset();
}
private View createView(final ViewGroup parent, final ImageItem imageItem) {
// 根视图布局
int layoutResId = ResFinder.getLayout("umeng_comm_img_browser_item_layout");
View rootView = LayoutInflater.from(parent.getContext())
.inflate(layoutResId, parent, false);
return setupWidgets(rootView, imageItem);
}
private View setupWidgets(View rootView, final ImageItem imageItem) {
// 图片ImageView
int imageResId = ResFinder.getId("umeng_comm_imagebrowser_view");
final ScaleImageView imageView = (ScaleImageView) rootView.findViewById(imageResId);
imageView.setOndismissListener(mListener);
final String middleImgUrl = imageItem.middleImageUrl;
// 保存图片
View saveView = rootView.findViewById(ResFinder.getId("umeng_comm_save_img_tv"));
if (isPreView) {
saveView.setVisibility(View.GONE);
mImageLoader.displayImage(middleImgUrl, imageView);
return imageView;
}
final ProgressBar progressBar = (ProgressBar) rootView.findViewById(ResFinder
.getId("umeng_comm_image_progressbar"));
// 保存图片
saveView.setOnClickListener(
new View.OnClickListener() {
@Override
public void onClick(View v) {
mPresenter.saveImage(middleImgUrl);
}
});
// 加载原图
rootView.findViewById(ResFinder.getId("umeng_comm_origin_img_tv")).setOnClickListener(
new OnClickListener() {
@Override
public void onClick(View v) {
displayImage(imageView, progressBar, imageItem, true);
}
});
// 加载图片
displayImage(imageView, progressBar, imageItem, false);
return rootView;
}
/**
* 加载图片,默认加载的是ImageItem中的中等质量的图片,当originImage参数为true时则加载原图.
*
* @param imageView 显示图片的ImageView
* @param progressBar 进度条
* @param image 图片的ImageItem
* @param originImage 是否加载原图
*/
private void displayImage(ImageView imageView, final ProgressBar progressBar,
final ImageItem image, boolean originImage) {
String imageUrl = originImage ? image.originImageUrl : image.middleImageUrl;
// 存储缓存在内存中的图片URL的MD5值列表,便于
storeImageItemMd5(imageUrl);
// 设置原图
Bitmap bitmap = LocalImageLoader.getInstance().loadBitmap(imageUrl, getSize(imageView));
ImgDisplayOption option = null;
if (bitmap == null) {
option = ImgDisplayOption.getCommonDisplayOption();
} else {
imageView.setImageBitmap(bitmap);
option = new ImgDisplayOption();
}
// 显示时不缩放图片
option.requestOrigin = true;
mImageLoader.displayImage(imageUrl, imageView, option,
new ImageLoadingListener() {
@Override
public void onLoadingStarted(String imageUri, View view) {
// 显示加载的Dialog
progressBar.setVisibility(View.VISIBLE);
}
@Override
public void onLoadingFailed(String imageUri, View view) {
}
@Override
public void onLoadingComplete(String imageUri, View view, Bitmap loadedImage) {
// 关闭显示的Dialog
progressBar.setVisibility(View.GONE);
if (view == null) {
return;
}
ScaleImageView imageView = (ScaleImageView) view;
if (isUriEqualsWithImageViewTag(imageView.getTag(), imageUri)
&& loadedImage != null) {
imageView.setImageBitmap(loadedImage);
imageView.updateScale();
}
}
});
}
/**
* 根据image设置宽高。如果是wrap_content,match_parent则返回宽高250</br>
*
* @param imageView
* @return
*/
private Point getSize(ImageView imageView) {
Point size = new Point();
if (imageView.getWidth() > 0) {
size.x = imageView.getWidth();
size.y = imageView.getHeight();
} else {
size.x = size.y = 250;
}
return size;
}
private boolean isUriEqualsWithImageViewTag(Object tag, String url) {
return tag != null && !TextUtils.isEmpty(url) && tag.equals(url);
}
public void setOnDismissListener(OnDismissListener listener) {
mListener = listener;
}
}