package com.example.jingbin.cloudreader.view.viewbigimage;
import android.content.Context;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.net.Uri;
import android.os.Bundle;
import android.os.Environment;
import android.provider.MediaStore;
import android.support.v4.app.FragmentActivity;
import android.support.v4.view.PagerAdapter;
import android.support.v4.view.ViewPager;
import android.support.v4.view.ViewPager.OnPageChangeListener;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.ProgressBar;
import android.widget.TextView;
import android.widget.Toast;
import com.bumptech.glide.Glide;
import com.bumptech.glide.load.resource.drawable.GlideDrawable;
import com.bumptech.glide.request.FutureTarget;
import com.bumptech.glide.request.RequestListener;
import com.bumptech.glide.request.target.Target;
import com.example.jingbin.cloudreader.R;
import com.example.jingbin.cloudreader.utils.ToastUtil;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.List;
import java.util.concurrent.ExecutionException;
import uk.co.senab.photoview.PhotoView;
import uk.co.senab.photoview.PhotoViewAttacher;
/**
* 用于查看大图
*
* @author jingbin
*/
public class ViewBigImageActivity extends FragmentActivity implements OnPageChangeListener, PhotoViewAttacher.OnPhotoTapListener {
// 保存图片
private TextView tv_save_big_image;
// 接收传过来的uri地址
List<String> imageuri;
// 接收穿过来当前选择的图片的数量
int code;
// 用于判断是头像还是文章图片 1:头像 2:文章大图
int selet;
// 用于管理图片的滑动
ViewPager very_image_viewpager;
// 当前页数
private int page;
/**
* 显示当前图片的页数
*/
TextView very_image_viewpager_text;
/**
* 用于判断是否是加载本地图片
*/
private boolean isLocal;
ViewPagerAdapter adapter;
/**
* 本应用图片的id
*/
private int imageId;
/**
* 是否是本应用中的图片
*/
private boolean isApp;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_view_big_image);
getView();
}
/**
* 保存图片至相册
*/
public static void saveImageToGallery(Context context, Bitmap bmp) {
// 首先保存图片
File appDir = new File(Environment.getExternalStorageDirectory(), "云阅相册");
if (!appDir.exists()) {
appDir.mkdir();
}
String fileName = System.currentTimeMillis() + ".jpg";
File file = new File(appDir, fileName);
try {
FileOutputStream fos = new FileOutputStream(file);
bmp.compress(Bitmap.CompressFormat.JPEG, 100, fos);
fos.flush();
fos.close();
} catch (IOException e) {
e.printStackTrace();
}
// 其次把文件插入到系统图库
try {
MediaStore.Images.Media.insertImage(context.getContentResolver(),
file.getAbsolutePath(), fileName, null);
} catch (FileNotFoundException e) {
e.printStackTrace();
}
// 最后通知图库更新
context.sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, Uri.parse("file://" + file.getAbsoluteFile())));
}
/**
* Glide 获得图片缓存路径
*/
private String getImagePath(String imgUrl) {
String path = null;
FutureTarget<File> future = Glide.with(ViewBigImageActivity.this)
.load(imgUrl)
.downloadOnly(500, 500);
try {
File cacheFile = future.get();
path = cacheFile.getAbsolutePath();
} catch (InterruptedException | ExecutionException e) {
e.printStackTrace();
}
return path;
}
/*
* 接收控件
*/
private void getView() {
/************************* 接收控件 ***********************/
very_image_viewpager_text = (TextView) findViewById(R.id.very_image_viewpager_text);
tv_save_big_image = (TextView) findViewById(R.id.tv_save_big_image);
very_image_viewpager = (ViewPager) findViewById(R.id.very_image_viewpager);
tv_save_big_image.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
ToastUtil.showToast("开始下载图片");
if (isApp) {// 本地图片
Bitmap bitmap = BitmapFactory.decodeResource(getResources(), imageId);
if (bitmap != null) {
saveImageToGallery(ViewBigImageActivity.this, bitmap);
ToastUtil.showToast("保存成功");
// Toast.makeText(ViewBigImageActivity.this, "保存成功", Toast.LENGTH_SHORT).show();
}
} else {// 网络图片
final BitmapFactory.Options bmOptions = new BitmapFactory.Options();
new Thread(new Runnable() {
@Override
public void run() {
// 子线程获得图片路径
final String imagePath = getImagePath(imageuri.get(page));
// 主线程更新
ViewBigImageActivity.this.runOnUiThread(new Runnable() {
@Override
public void run() {
if (imagePath != null) {
Bitmap bitmap = BitmapFactory.decodeFile(imagePath, bmOptions);
if (bitmap != null) {
saveImageToGallery(ViewBigImageActivity.this, bitmap);
ToastUtil.showToast("已保存至"+Environment.getExternalStorageDirectory().getAbsolutePath()+"/云阅相册");
// Toast.makeText(ViewBigImageActivity.this, "保存成功", Toast.LENGTH_SHORT).show();
}
}
}
});
}
}).start();
}
}
});
/************************* 接收传值 ***********************/
Bundle bundle = getIntent().getExtras();
code = bundle.getInt("code");
selet = bundle.getInt("selet");
isLocal = bundle.getBoolean("isLocal", false);
imageuri = bundle.getStringArrayList("imageuri");
/**是否是本应用中的图片*/
isApp = bundle.getBoolean("isApp", false);
/**本应用图片的id*/
imageId = bundle.getInt("id", 0);
/**
* 给viewpager设置适配器
*/
if (isApp) {
MyPageAdapter myPageAdapter = new MyPageAdapter();
very_image_viewpager.setAdapter(myPageAdapter);
very_image_viewpager.setEnabled(false);
} else {
adapter = new ViewPagerAdapter();
very_image_viewpager.setAdapter(adapter);
very_image_viewpager.setCurrentItem(code);
page = code;
very_image_viewpager.setOnPageChangeListener(this);
very_image_viewpager.setEnabled(false);
// 设定当前的页数和总页数
if (selet == 2) {
very_image_viewpager_text.setText((code + 1) + " / " + imageuri.size());
}
}
}
/**
* 本应用图片适配器
*/
class MyPageAdapter extends PagerAdapter {
@Override
public int getCount() {
return 1;
}
@Override
public boolean isViewFromObject(View view, Object object) {
return view == object;
}
@Override
public Object instantiateItem(ViewGroup container, int position) {
View view = getLayoutInflater().inflate(R.layout.viewpager_very_image, container, false);
PhotoView zoom_image_view = (PhotoView) view.findViewById(R.id.zoom_image_view);
ProgressBar spinner = (ProgressBar) view.findViewById(R.id.loading);
spinner.setVisibility(View.GONE);
if (imageId != 0) {
zoom_image_view.setImageResource(imageId);
}
zoom_image_view.setOnPhotoTapListener(ViewBigImageActivity.this);
container.addView(view, 0);
return view;
}
@Override
public void destroyItem(ViewGroup container, int position, Object object) {
View view = (View) object;
container.removeView(view);
}
}
/**
* ViewPager的适配器
*
* @author guolin
*/
class ViewPagerAdapter extends PagerAdapter {
LayoutInflater inflater;
ViewPagerAdapter() {
inflater = getLayoutInflater();
}
@Override
public Object instantiateItem(ViewGroup container, int position) {
View view = inflater.inflate(R.layout.viewpager_very_image, container, false);
final PhotoView zoom_image_view = (PhotoView) view.findViewById(R.id.zoom_image_view);
final ProgressBar spinner = (ProgressBar) view.findViewById(R.id.loading);
// 保存网络图片的路径
String adapter_image_Entity = (String) getItem(position);
//TODO
String imageUrl;
if (isLocal) {
imageUrl = "file://" + adapter_image_Entity;
tv_save_big_image.setVisibility(View.GONE);
} else {
imageUrl = adapter_image_Entity;
}
spinner.setVisibility(View.VISIBLE);
spinner.setClickable(false);
Glide.with(ViewBigImageActivity.this).load(imageUrl)
.crossFade(700)
.listener(new RequestListener<String, GlideDrawable>() {
@Override
public boolean onException(Exception e, String model, Target<GlideDrawable> target, boolean isFirstResource) {
Toast.makeText(getApplicationContext(), "资源加载异常", Toast.LENGTH_SHORT).show();
spinner.setVisibility(View.GONE);
return false;
}
//这个用于监听图片是否加载完成
@Override
public boolean onResourceReady(GlideDrawable resource, String model, Target<GlideDrawable> target, boolean isFromMemoryCache, boolean isFirstResource) {
// Toast.makeText(getApplicationContext(), "图片加载完成", Toast.LENGTH_SHORT).show();
spinner.setVisibility(View.GONE);
/**这里应该是加载成功后图片的高*/
int height = zoom_image_view.getHeight();
int wHeight = getWindowManager().getDefaultDisplay().getHeight();
if (height > wHeight) {
zoom_image_view.setScaleType(ImageView.ScaleType.CENTER_CROP);
} else {
zoom_image_view.setScaleType(ImageView.ScaleType.FIT_CENTER);
}
return false;
}
}).into(zoom_image_view);
zoom_image_view.setOnPhotoTapListener(ViewBigImageActivity.this);
container.addView(view, 0);
return view;
}
@Override
public int getCount() {
if (imageuri == null || imageuri.size() == 0) {
return 0;
}
return imageuri.size();
}
@Override
public boolean isViewFromObject(View arg0, Object arg1) {
return arg0 == arg1;
}
@Override
public void destroyItem(ViewGroup container, int position, Object object) {
View view = (View) object;
container.removeView(view);
}
Object getItem(int position) {
return imageuri.get(position);
}
}
/**
* 下面是对Viewpager的监听
*/
@Override
public void onPageScrollStateChanged(int arg0) {
}
@Override
public void onPageScrolled(int arg0, float arg1, int arg2) {
}
/**
* 本方法主要监听viewpager滑动的时候的操作
*/
@Override
public void onPageSelected(int arg0) {
// 每当页数发生改变时重新设定一遍当前的页数和总页数
very_image_viewpager_text.setText((arg0 + 1) + " / " + imageuri.size());
page = arg0;
}
@Override
public void onPhotoTap(View view, float x, float y) {
finish();
}
@Override
public void onOutsidePhotoTap() {
// finish();
}
}