package me.xiaopan.sketchsample.fragment;
import android.app.Activity;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.pm.ResolveInfo;
import android.content.res.AssetFileDescriptor;
import android.graphics.Rect;
import android.graphics.drawable.Drawable;
import android.net.Uri;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v7.app.AlertDialog;
import android.text.TextUtils;
import android.text.format.Formatter;
import android.view.View;
import android.widget.ImageView;
import android.widget.Toast;
import org.greenrobot.eventbus.EventBus;
import org.greenrobot.eventbus.Subscribe;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.LinkedList;
import java.util.List;
import me.xiaopan.androidinjector.InjectContentView;
import me.xiaopan.androidinjector.InjectExtra;
import me.xiaopan.androidinjector.InjectView;
import me.xiaopan.sketch.Sketch;
import me.xiaopan.sketch.cache.DiskCache;
import me.xiaopan.sketch.cache.MemoryCache;
import me.xiaopan.sketch.display.FadeInImageDisplayer;
import me.xiaopan.sketch.drawable.LoadingDrawable;
import me.xiaopan.sketch.drawable.RefBitmap;
import me.xiaopan.sketch.drawable.SketchDrawable;
import me.xiaopan.sketch.drawable.SketchGifDrawable;
import me.xiaopan.sketch.feature.large.LargeImageViewer;
import me.xiaopan.sketch.feature.zoom.ImageZoomer;
import me.xiaopan.sketch.request.CancelCause;
import me.xiaopan.sketch.request.DisplayListener;
import me.xiaopan.sketch.request.DisplayOptions;
import me.xiaopan.sketch.request.ErrorCause;
import me.xiaopan.sketch.request.ImageFrom;
import me.xiaopan.sketch.request.RequestLevel;
import me.xiaopan.sketch.request.UriScheme;
import me.xiaopan.sketch.state.MemoryCacheStateImage;
import me.xiaopan.sketch.util.SketchUtils;
import me.xiaopan.sketchsample.MyFragment;
import me.xiaopan.sketchsample.R;
import me.xiaopan.sketchsample.activity.ApplyBackgroundCallback;
import me.xiaopan.sketchsample.util.ApplyWallpaperAsyncTask;
import me.xiaopan.sketchsample.util.SaveAssetImageAsyncTask;
import me.xiaopan.sketchsample.util.SaveContentImageAsyncTask;
import me.xiaopan.sketchsample.util.SaveImageAsyncTask;
import me.xiaopan.sketchsample.util.SaveResImageAsyncTask;
import me.xiaopan.sketchsample.util.Settings;
import me.xiaopan.sketchsample.widget.HintView;
import me.xiaopan.sketchsample.widget.MappingView;
import me.xiaopan.sketchsample.widget.MyImageView;
@InjectContentView(R.layout.fragment_image)
public class ImageFragment extends MyFragment {
public static final String PARAM_REQUIRED_STRING_IMAGE_URI = "PARAM_REQUIRED_STRING_IMAGE_URI";
public static final String PARAM_REQUIRED_STRING_LOADING_IMAGE_OPTIONS_KEY = "PARAM_REQUIRED_STRING_LOADING_IMAGE_OPTIONS_KEY";
public static final String PARAM_REQUIRED_BOOLEAN_SHOW_TOOLS = "PARAM_REQUIRED_BOOLEAN_SHOW_TOOLS";
@InjectView(R.id.image_imageFragment_image)
private MyImageView imageView;
@InjectView(R.id.mapping_imageFragment)
private MappingView mappingView;
@InjectView(R.id.hint_imageFragment_hint)
private HintView hintView;
@InjectExtra(PARAM_REQUIRED_STRING_IMAGE_URI)
private String imageUri;
@InjectExtra(PARAM_REQUIRED_STRING_LOADING_IMAGE_OPTIONS_KEY)
private String loadingImageOptionsId;
@InjectExtra(PARAM_REQUIRED_BOOLEAN_SHOW_TOOLS)
private boolean showTools;
private SetWindowBackground setWindowBackground = new SetWindowBackground();
private GifPlayFollowPageVisible gifPlayFollowPageVisible = new GifPlayFollowPageVisible();
private ShowImageHelper showImageHelper = new ShowImageHelper();
private ImageZoomHelper imageZoomHelper = new ImageZoomHelper();
private MappingHelper mappingHelper = new MappingHelper();
private LargeImageHelper largeImageHelper = new LargeImageHelper();
private SingleClickHelper singleClickHelper = new SingleClickHelper();
private LongClickHelper longClickHelper = new LongClickHelper();
public static ImageFragment build(String imageUri, String loadingImageOptionsId, boolean showTools) {
Bundle bundle = new Bundle();
bundle.putString(PARAM_REQUIRED_STRING_IMAGE_URI, imageUri);
bundle.putString(PARAM_REQUIRED_STRING_LOADING_IMAGE_OPTIONS_KEY, loadingImageOptionsId);
bundle.putBoolean(PARAM_REQUIRED_BOOLEAN_SHOW_TOOLS, showTools);
ImageFragment fragment = new ImageFragment();
fragment.setArguments(bundle);
return fragment;
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setWindowBackground.onCreate(getActivity());
}
@Override
public void onViewCreated(View view, Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
imageZoomHelper.onViewCreated();
largeImageHelper.onViewCreated();
mappingHelper.onViewCreated();
longClickHelper.onViewCreated();
singleClickHelper.onViewCreated();
showImageHelper.onViewCreated();
EventBus.getDefault().register(this);
}
@Override
public void onDestroyView() {
EventBus.getDefault().unregister(this);
super.onDestroyView();
}
@Override
public void onUserVisibleChanged(boolean isVisibleToUser) {
largeImageHelper.onUserVisibleChanged();
setWindowBackground.onUserVisibleChanged();
gifPlayFollowPageVisible.onUserVisibleChanged();
}
@SuppressWarnings("unused")
@Subscribe
public void onEvent(String key) {
if (Settings.PREFERENCE_SUPPORT_ZOOM.equals(key)) {
imageZoomHelper.onConfigChanged();
mappingHelper.onViewCreated();
longClickHelper.onViewCreated();
singleClickHelper.onViewCreated();
} else if (Settings.PREFERENCE_READ_MODE.equals(key)) {
imageZoomHelper.onReadModeConfigChanged();
} else if (Settings.PREFERENCE_SUPPORT_LARGE_IMAGE.equals(key)) {
largeImageHelper.onConfigChanged();
}
}
public static class PlayImageEvent {
}
private class ShowImageHelper implements DisplayListener {
private void onViewCreated() {
imageView.setAutoApplyGlobalAttr(false);
imageView.setDisplayListener(this);
initOptions();
imageView.displayImage(imageUri);
}
private void initOptions() {
DisplayOptions options = imageView.getOptions();
// 允许播放GIF
options.setDecodeGifImage(true);
// 有占位图选项信息的话就使用内存缓存占位图但不使用任何显示器,否则就是用渐入显示器
if (!TextUtils.isEmpty(loadingImageOptionsId)) {
String loadingImageMemoryCacheKey = SketchUtils.makeRequestKey(imageUri, loadingImageOptionsId);
MemoryCache memoryCache = Sketch.with(getActivity()).getConfiguration().getMemoryCache();
RefBitmap cachedRefBitmap = memoryCache.get(loadingImageMemoryCacheKey);
if (cachedRefBitmap != null) {
options.setLoadingImage(new MemoryCacheStateImage(loadingImageMemoryCacheKey, null));
} else {
options.setImageDisplayer(new FadeInImageDisplayer());
}
} else {
options.setImageDisplayer(new FadeInImageDisplayer());
}
}
@Override
public void onStarted() {
hintView.loading("正在加载图片,请稍后...");
}
@Override
public void onCompleted(ImageFrom imageFrom, String mimeType) {
hintView.hidden();
setWindowBackground.onDisplayCompleted();
gifPlayFollowPageVisible.onDisplayCompleted();
}
@Override
public void onError(ErrorCause errorCause) {
hintView.hint(R.drawable.ic_error, "图片显示失败", "重新显示", new View.OnClickListener() {
@Override
public void onClick(View v) {
imageView.displayImage(imageUri);
}
});
}
@Override
public void onCanceled(CancelCause cancelCause) {
if (cancelCause == null) {
return;
}
switch (cancelCause) {
case REQUEST_LEVEL_IS_LOCAL:
hintView.hint(R.drawable.ic_error, "level is local", "直接显示", new View.OnClickListener() {
@Override
public void onClick(View v) {
RequestLevel requestLevel = imageView.getOptions().getRequestLevel();
imageView.getOptions().setRequestLevel(RequestLevel.NET);
imageView.displayImage(imageUri);
imageView.getOptions().setRequestLevel(requestLevel);
}
});
break;
case REQUEST_LEVEL_IS_MEMORY:
hintView.hint(R.drawable.ic_error, "level is memory", "直接显示", new View.OnClickListener() {
@Override
public void onClick(View v) {
RequestLevel requestLevel = imageView.getOptions().getRequestLevel();
imageView.getOptions().setRequestLevel(RequestLevel.NET);
imageView.displayImage(imageUri);
imageView.getOptions().setRequestLevel(requestLevel);
}
});
break;
case BE_CANCELLED:
break;
case PAUSE_DOWNLOAD:
hintView.hint(R.drawable.ic_error, "为节省流量已暂停下载新图片", "不管了,直接下载", new View.OnClickListener() {
@Override
public void onClick(View v) {
RequestLevel requestLevel = imageView.getOptions().getRequestLevel();
imageView.getOptions().setRequestLevel(RequestLevel.NET);
imageView.displayImage(imageUri);
imageView.getOptions().setRequestLevel(requestLevel);
}
});
break;
case PAUSE_LOAD:
hintView.hint(R.drawable.ic_error, "已暂停加载新图片", "直接加载", new View.OnClickListener() {
@Override
public void onClick(View v) {
RequestLevel requestLevel = imageView.getOptions().getRequestLevel();
imageView.getOptions().setRequestLevel(RequestLevel.NET);
imageView.displayImage(imageUri);
imageView.getOptions().setRequestLevel(requestLevel);
}
});
break;
}
}
}
private class SetWindowBackground {
private ApplyBackgroundCallback applyBackgroundCallback;
private void onCreate(Activity activity) {
if (activity instanceof ApplyBackgroundCallback) {
setWindowBackground.applyBackgroundCallback = (ApplyBackgroundCallback) activity;
}
}
private void onUserVisibleChanged() {
if (applyBackgroundCallback != null && isVisibleToUser()) {
applyBackgroundCallback.onApplyBackground(imageUri);
}
}
private void onDisplayCompleted() {
onUserVisibleChanged();
}
}
private class GifPlayFollowPageVisible {
private void onUserVisibleChanged() {
Drawable drawable = imageView.getDrawable();
Drawable lastDrawable = SketchUtils.getLastDrawable(drawable);
if (lastDrawable != null && (lastDrawable instanceof SketchGifDrawable)) {
((SketchGifDrawable) lastDrawable).followPageVisible(isVisibleToUser(), false);
}
}
private void onDisplayCompleted() {
Drawable drawable = imageView.getDrawable();
Drawable lastDrawable = SketchUtils.getLastDrawable(drawable);
if (lastDrawable != null && (lastDrawable instanceof SketchGifDrawable)) {
((SketchGifDrawable) lastDrawable).followPageVisible(isVisibleToUser(), true);
}
}
}
private class ImageZoomHelper {
private void onViewCreated() {
imageView.setSupportZoom(Settings.getBoolean(imageView.getContext(), Settings.PREFERENCE_SUPPORT_ZOOM));
onReadModeConfigChanged();
}
private void onConfigChanged() {
onViewCreated();
}
private void onReadModeConfigChanged() {
if (imageView.isSupportZoom()) {
boolean readMode = Settings.getBoolean(getActivity(), Settings.PREFERENCE_READ_MODE);
imageView.getImageZoomer().setReadMode(readMode);
}
}
}
private class LargeImageHelper {
private void onViewCreated() {
imageView.setSupportLargeImage(Settings.getBoolean(imageView.getContext(), Settings.PREFERENCE_SUPPORT_LARGE_IMAGE));
// 初始化超大图查看器的暂停状态,这一步很重要
if (Settings.getBoolean(getActivity(), Settings.PREFERENCE_PAGE_VISIBLE_TO_USER_DECODE_LARGE_IMAGE)
&& imageView.isSupportLargeImage()) {
imageView.getLargeImageViewer().setPause(!isVisibleToUser());
}
}
private void onConfigChanged() {
onViewCreated();
}
private void onUserVisibleChanged() {
// 不可见的时候暂停超大图查看器,节省内存
if (Settings.getBoolean(getActivity(), Settings.PREFERENCE_PAGE_VISIBLE_TO_USER_DECODE_LARGE_IMAGE)) {
if (imageView.isSupportLargeImage()) {
imageView.getLargeImageViewer().setPause(!isVisibleToUser());
}
} else {
if (imageView.isSupportLargeImage()
&& isVisibleToUser() && imageView.getLargeImageViewer().isPaused()) {
imageView.getLargeImageViewer().setPause(false);
}
}
}
}
private class MappingHelper {
private void onViewCreated() {
// MappingView跟随碎片变化刷新碎片区域
if (imageView.isSupportLargeImage()) {
imageView.getLargeImageViewer().setOnTileChangedListener(new LargeImageViewer.OnTileChangedListener() {
@Override
public void onTileChanged(LargeImageViewer largeImageViewer) {
mappingView.tileChanged(largeImageViewer);
}
});
}
// MappingView跟随Matrix变化刷新显示区域
if (imageView.isSupportZoom()) {
imageView.getImageZoomer().addOnMatrixChangeListener(new ImageZoomer.OnMatrixChangeListener() {
Rect visibleRect = new Rect();
@Override
public void onMatrixChanged(ImageZoomer imageZoomer) {
imageZoomer.getVisibleRect(visibleRect);
mappingView.update(imageZoomer.getDrawableSize(), visibleRect);
}
});
}
// 点击MappingView定位到指定位置
mappingView.setOnSingleClickListener(new MappingView.OnSingleClickListener() {
@Override
public boolean onSingleClick(float x, float y) {
Drawable drawable = imageView.getDrawable();
if (drawable == null) {
return false;
}
if (drawable.getIntrinsicWidth() == 0 || drawable.getIntrinsicHeight() == 0) {
return false;
}
if (mappingView.getWidth() == 0 || mappingView.getHeight() == 0) {
return false;
}
final float widthScale = (float) drawable.getIntrinsicWidth() / mappingView.getWidth();
final float heightScale = (float) drawable.getIntrinsicHeight() / mappingView.getHeight();
final float realX = x * widthScale;
final float realY = y * heightScale;
boolean showLocationAnimation = Settings.getBoolean(imageView.getContext(), Settings.PREFERENCE_LOCATION_ANIMATE);
return location(realX, realY, showLocationAnimation);
}
});
mappingView.getOptions().setImageDisplayer(new FadeInImageDisplayer());
mappingView.getOptions().setMaxSize(600, 600);
mappingView.getOptions().setCorrectImageOrientation(Settings.getBoolean(getContext(), Settings.PREFERENCE_CORRECT_IMAGE_ORIENTATION));
mappingView.displayImage(imageUri);
mappingView.setVisibility(showTools ? View.VISIBLE : View.GONE);
}
private boolean location(float x, float y, boolean animate) {
if (!imageView.isSupportZoom()) {
return false;
}
imageView.getImageZoomer().location(x, y, animate);
return true;
}
}
private class SingleClickHelper {
private void onViewCreated() {
// 单击显示操作选项
if (imageView.isSupportZoom()) {
imageView.getImageZoomer().setOnViewTapListener(new ImageZoomer.OnViewTapListener() {
@Override
public void onViewTap(View view, float x, float y) {
Fragment parentFragment = getParentFragment();
if (parentFragment != null && parentFragment instanceof ImageZoomer.OnViewTapListener) {
((ImageZoomer.OnViewTapListener) parentFragment).onViewTap(view, x, y);
}
}
});
} else {
imageView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Fragment parentFragment = getParentFragment();
if (parentFragment != null && parentFragment instanceof ImageZoomer.OnViewTapListener) {
((ImageZoomer.OnViewTapListener) parentFragment).onViewTap(v, 0, 0);
}
}
});
}
}
}
private class LongClickHelper {
private void onViewCreated() {
if (imageView.isSupportZoom()) {
imageView.getImageZoomer().setOnViewLongPressListener(new ImageZoomer.OnViewLongPressListener() {
@Override
public void onViewLongPress(View view, float x, float y) {
show();
}
});
} else {
imageView.setOnLongClickListener(new View.OnLongClickListener() {
@Override
public boolean onLongClick(View v) {
show();
return true;
}
});
}
}
private void show() {
AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
final boolean supportZoom = imageView.isSupportZoom();
final ImageZoomer imageZoomer = supportZoom ? imageView.getImageZoomer() : null;
final boolean supportLargeImage = imageView.isSupportLargeImage();
final LargeImageViewer largeImageViewer = imageView.getLargeImageViewer();
Drawable drawable = SketchUtils.getLastDrawable(imageView.getDrawable());
final List<MenuItem> menuItemList = new LinkedList<MenuItem>();
String imageInfo;
if (drawable instanceof LoadingDrawable) {
imageInfo = "图片正在加载,请稍后";
} else if (drawable instanceof SketchDrawable) {
imageInfo = makeImageInfo(drawable, (SketchDrawable) drawable);
} else {
imageInfo = "未知来源图片";
}
menuItemList.add(new MenuItem(imageInfo, null));
String scaleTypeTitle = "切换ScaleType(" + (supportZoom ? imageZoomer.getScaleType() : imageView.getScaleType()) + ")";
menuItemList.add(new MenuItem(scaleTypeTitle, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
showScaleTypeMenu();
}
}));
String largeImageTileTitle = supportLargeImage ? (largeImageViewer.isShowTileRect() ? "不显示分块区域" : "显示分块区域") : "分块区域(未开启大图功能)";
menuItemList.add(new MenuItem(largeImageTileTitle, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
setShowTile();
}
}));
String readModeTitle = supportZoom ? (imageZoomer.isReadMode() ? "关闭阅读模式" : "开启阅读模式") : ("阅读模式(未开启缩放功能)");
menuItemList.add(new MenuItem(readModeTitle, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
setReadMode();
}
}));
String moreTitle = "更多功能";
menuItemList.add(new MenuItem(moreTitle, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
showMoreMenu();
}
}));
String[] items = new String[menuItemList.size()];
for (int w = 0, size = menuItemList.size(); w < size; w++) {
items[w] = menuItemList.get(w).title;
}
builder.setItems(items, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
DialogInterface.OnClickListener clickListener = menuItemList.get(which).clickListener;
if (clickListener != null) {
clickListener.onClick(dialog, which);
}
}
});
builder.setNegativeButton("取消", null);
builder.show();
}
private String makeImageInfo(Drawable drawable, SketchDrawable sketchDrawable) {
StringBuilder messageBuilder = new StringBuilder();
messageBuilder.append("\n");
messageBuilder.append(sketchDrawable.getUri());
long imageLength = 0;
UriScheme uriScheme = UriScheme.valueOfUri(sketchDrawable.getUri());
if (uriScheme == UriScheme.FILE) {
imageLength = new File(UriScheme.FILE.crop(sketchDrawable.getUri())).length();
} else if (uriScheme == UriScheme.NET) {
DiskCache.Entry diskCacheEntry = Sketch.with(getContext()).getConfiguration().getDiskCache().get(sketchDrawable.getUri());
if (diskCacheEntry != null) {
imageLength = diskCacheEntry.getFile().length();
}
} else if (uriScheme == UriScheme.ASSET) {
AssetFileDescriptor assetFileDescriptor = null;
try {
assetFileDescriptor = getContext().getAssets().openFd(UriScheme.ASSET.crop(sketchDrawable.getUri()));
} catch (IOException e) {
e.printStackTrace();
}
imageLength = assetFileDescriptor != null ? assetFileDescriptor.getLength() : 0;
} else if (uriScheme == UriScheme.DRAWABLE) {
AssetFileDescriptor assetFileDescriptor = getContext().getResources().openRawResourceFd(Integer.valueOf(UriScheme.DRAWABLE.crop(sketchDrawable.getUri())));
imageLength = assetFileDescriptor != null ? assetFileDescriptor.getLength() : 0;
} else if (uriScheme == UriScheme.CONTENT) {
AssetFileDescriptor assetFileDescriptor = null;
try {
assetFileDescriptor = getContext().getContentResolver().openAssetFileDescriptor(Uri.parse(sketchDrawable.getUri()), "r");
} catch (FileNotFoundException e) {
e.printStackTrace();
}
imageLength = assetFileDescriptor != null ? assetFileDescriptor.getLength() : 0;
}
String needDiskSpace = imageLength > 0 ? Formatter.formatFileSize(getContext(), imageLength) : "未知";
int previewDrawableByteCount = sketchDrawable.getByteCount();
int pixelByteCount = previewDrawableByteCount / drawable.getIntrinsicWidth() / drawable.getIntrinsicHeight();
int originImageByteCount = sketchDrawable.getOriginWidth() * sketchDrawable.getOriginHeight() * pixelByteCount;
String needMemory = Formatter.formatFileSize(getContext(), originImageByteCount);
messageBuilder.append("\n");
messageBuilder.append("\n");
messageBuilder.append("原始图:")
.append(sketchDrawable.getOriginWidth()).append("x").append(sketchDrawable.getOriginHeight())
.append("/").append(sketchDrawable.getMimeType().substring(6))
.append("/").append(needDiskSpace);
messageBuilder.append("\n");
messageBuilder.append("预览图:")
.append(drawable.getIntrinsicWidth()).append("x").append(drawable.getIntrinsicHeight())
.append("/").append(sketchDrawable.getBitmapConfig())
.append("/").append(Formatter.formatFileSize(getContext(), previewDrawableByteCount));
messageBuilder.append("\n");
messageBuilder.append("原图方向/占用内存:").append(sketchDrawable.getOrientation()).append("/").append(needMemory);
if (imageView.isSupportZoom()) {
ImageZoomer imageZoomer = imageView.getImageZoomer();
messageBuilder.append("\n");
messageBuilder.append("\n");
messageBuilder.append("缩放:").append(SketchUtils.formatFloat(imageZoomer.getZoomScale(), 2));
Rect visibleRect = new Rect();
imageZoomer.getVisibleRect(visibleRect);
messageBuilder.append("/").append(visibleRect.toShortString());
}
if (imageView.isSupportLargeImage()) {
LargeImageViewer largeImageViewer = imageView.getLargeImageViewer();
if (largeImageViewer.isReady()) {
String tilesNeedMemory = Formatter.formatFileSize(getContext(), largeImageViewer.getTilesAllocationByteCount());
messageBuilder.append("\n");
messageBuilder.append("碎片:")
.append(largeImageViewer.getTiles())
.append("/")
.append(largeImageViewer.getTileList().size())
.append("/")
.append(tilesNeedMemory);
messageBuilder.append("\n");
messageBuilder.append("碎片解码区域:").append(largeImageViewer.getDecodeRect().toShortString());
messageBuilder.append("\n");
messageBuilder.append("碎片SRC区域:").append(largeImageViewer.getDecodeSrcRect().toShortString());
} else if (largeImageViewer.isInitializing()) {
messageBuilder.append("\n");
messageBuilder.append("大图功能正在初始化...");
}
}
messageBuilder.append("\n");
return messageBuilder.toString();
}
private void showScaleTypeMenu() {
AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
builder.setTitle("修改ScaleType");
String[] items = new String[7];
items[0] = "CENTER";
items[1] = "CENTER_CROP";
items[2] = "CENTER_INSIDE";
items[3] = "FIT_START";
items[4] = "FIT_CENTER";
items[5] = "FIT_END";
items[6] = "FIT_XY";
builder.setItems(items, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
switch (which) {
case 0:
imageView.setScaleType(ImageView.ScaleType.CENTER);
break;
case 1:
imageView.setScaleType(ImageView.ScaleType.CENTER_CROP);
break;
case 2:
imageView.setScaleType(ImageView.ScaleType.CENTER_INSIDE);
break;
case 3:
imageView.setScaleType(ImageView.ScaleType.FIT_START);
break;
case 4:
imageView.setScaleType(ImageView.ScaleType.FIT_CENTER);
break;
case 5:
imageView.setScaleType(ImageView.ScaleType.FIT_END);
break;
case 6:
imageView.setScaleType(ImageView.ScaleType.FIT_XY);
break;
}
}
});
builder.setNegativeButton("取消", null);
builder.show();
}
private void showMoreMenu() {
final List<MenuItem> menuItemList = new LinkedList<MenuItem>();
String rotateTitle = imageView.isSupportZoom() ? ("顺时针旋转90度(" + imageView.getImageZoomer().getRotateDegrees() + ")") : "旋转图片(未开启缩放功能)";
menuItemList.add(new MenuItem(rotateTitle, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
rotate();
}
}));
menuItemList.add(new MenuItem("幻灯片播放", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
play();
}
}));
menuItemList.add(new MenuItem("分享图片", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
share();
}
}));
menuItemList.add(new MenuItem("保存图片", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
save();
}
}));
menuItemList.add(new MenuItem("设为壁纸", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
setWallpaper();
}
}));
AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
String[] items = new String[menuItemList.size()];
for (int w = 0, size = menuItemList.size(); w < size; w++) {
items[w] = menuItemList.get(w).title;
}
builder.setItems(items, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
DialogInterface.OnClickListener clickListener = menuItemList.get(which).clickListener;
if (clickListener != null) {
clickListener.onClick(dialog, which);
}
}
});
builder.setNegativeButton("取消", null);
builder.show();
}
private void setShowTile() {
if (imageView.isSupportLargeImage()) {
LargeImageViewer largeImageViewer = imageView.getLargeImageViewer();
boolean newShowTileRect = !largeImageViewer.isShowTileRect();
largeImageViewer.setShowTileRect(newShowTileRect);
} else {
Toast.makeText(getContext(), "请先到首页左侧菜单开启大图功能", Toast.LENGTH_SHORT).show();
}
}
private void setReadMode() {
if (imageView.isSupportZoom()) {
ImageZoomer imageZoomer = imageView.getImageZoomer();
boolean newReadMode = !imageZoomer.isReadMode();
imageZoomer.setReadMode(newReadMode);
} else {
Toast.makeText(getContext(), "请先到首页左侧菜单开启缩放功能", Toast.LENGTH_SHORT).show();
}
}
private void rotate() {
if (imageView.isSupportZoom()) {
if (!imageView.getImageZoomer().rotateBy(90)) {
Toast.makeText(getContext(), "旋转角度必须是90的倍数或开启大图功能后无法使用旋转功能", Toast.LENGTH_LONG).show();
}
} else {
Toast.makeText(getContext(), "请先到首页左侧菜单开启缩放功能", Toast.LENGTH_SHORT).show();
}
}
private File getImageFile(String imageUri) {
if (TextUtils.isEmpty(imageUri)) {
return null;
}
UriScheme uriScheme = !TextUtils.isEmpty(imageUri) ? UriScheme.valueOfUri(imageUri) : null;
if (uriScheme == null) {
return null;
}
if (uriScheme == UriScheme.NET) {
DiskCache.Entry diskCacheEntry = Sketch.with(getActivity()).getConfiguration().getDiskCache().get(imageUri);
if (diskCacheEntry != null) {
return diskCacheEntry.getFile();
} else {
Toast.makeText(getActivity(), "图片还没有下载好哦,再等一会儿吧!", Toast.LENGTH_LONG).show();
return null;
}
} else if (uriScheme == UriScheme.FILE) {
return new File(UriScheme.FILE.crop(imageUri));
} else {
Toast.makeText(getActivity(), "我去,怎么会有这样的URL " + imageUri, Toast.LENGTH_LONG).show();
return null;
}
}
private void share() {
Drawable drawable = imageView.getDrawable();
String imageUri = drawable != null && drawable instanceof SketchDrawable ? ((SketchDrawable) drawable).getUri() : null;
if (TextUtils.isEmpty(imageUri)) {
Toast.makeText(getActivity(), "稍等一会儿", Toast.LENGTH_LONG).show();
return;
}
File imageFile = getImageFile(imageUri);
if (imageFile == null) {
return;
}
Intent intent = new Intent(Intent.ACTION_SEND);
intent.putExtra(Intent.EXTRA_STREAM, Uri.fromFile(imageFile));
intent.setType("image/" + parseFileType(imageFile.getName()));
List<ResolveInfo> infoList = getActivity().getPackageManager().queryIntentActivities(intent, 0);
if (infoList == null || infoList.isEmpty()) {
Toast.makeText(getActivity(), "您的设备上没有能够分享的APP", Toast.LENGTH_LONG).show();
return;
}
startActivity(intent);
}
private void setWallpaper() {
Drawable drawable = imageView.getDrawable();
String imageUri = drawable != null && drawable instanceof SketchDrawable ? ((SketchDrawable) drawable).getUri() : null;
if (TextUtils.isEmpty(imageUri)) {
Toast.makeText(getActivity(), "稍等一会儿", Toast.LENGTH_LONG).show();
return;
}
File imageFile = getImageFile(imageUri);
if (imageFile == null) {
return;
}
new ApplyWallpaperAsyncTask(getActivity(), imageFile) {
@Override
protected void onPostExecute(Boolean aBoolean) {
if (getActivity() != null) {
Toast.makeText(getActivity(), aBoolean ? "设置壁纸成功" : "设置壁纸失败", Toast.LENGTH_LONG).show();
}
}
}.execute(0);
}
private void play() {
EventBus.getDefault().post(new PlayImageEvent());
}
private void save() {
Drawable drawable = imageView.getDrawable();
String imageUri = drawable != null && drawable instanceof SketchDrawable ? ((SketchDrawable) drawable).getUri() : null;
if (TextUtils.isEmpty(imageUri)) {
Toast.makeText(getActivity(), "稍等一会儿", Toast.LENGTH_LONG).show();
return;
}
UriScheme uriScheme = UriScheme.valueOfUri(imageUri);
if (uriScheme == UriScheme.NET) {
DiskCache.Entry imageFile3DiskCacheEntry = Sketch.with(getActivity()).getConfiguration().getDiskCache().get(imageUri);
if (imageFile3DiskCacheEntry != null) {
new SaveImageAsyncTask(getActivity(), imageFile3DiskCacheEntry.getFile(), imageUri).execute("");
} else {
Toast.makeText(getActivity(), "图片还没有下载好哦,再等一会儿吧!", Toast.LENGTH_LONG).show();
}
} else if (uriScheme == UriScheme.ASSET) {
new SaveAssetImageAsyncTask(getActivity(), UriScheme.ASSET.crop(imageUri)).execute("");
} else if (uriScheme == UriScheme.CONTENT) {
new SaveContentImageAsyncTask(getActivity(), Uri.parse(imageUri)).execute("");
} else if (uriScheme == UriScheme.DRAWABLE) {
new SaveResImageAsyncTask(getActivity(), Integer.valueOf(UriScheme.DRAWABLE.crop(imageUri))).execute("");
} else if (uriScheme == UriScheme.FILE) {
Toast.makeText(getActivity(), "当前图片本就是本地的无需保存", Toast.LENGTH_LONG).show();
} else {
Toast.makeText(getActivity(), "我去,怎么会有这样的URL " + imageUri, Toast.LENGTH_LONG).show();
}
}
private String parseFileType(String fileName) {
int lastIndexOf = fileName.lastIndexOf(".");
if (lastIndexOf < 0) {
return null;
}
String fileType = fileName.substring(lastIndexOf + 1);
if ("".equals(fileType.trim())) {
return null;
}
return fileType;
}
private class MenuItem {
private String title;
private AlertDialog.OnClickListener clickListener;
public MenuItem(String title, AlertDialog.OnClickListener clickListener) {
this.title = title;
this.clickListener = clickListener;
}
}
}
}