package com.ywwxhz.activitys;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.Color;
import android.graphics.drawable.Drawable;
import android.net.Uri;
import android.os.Bundle;
import android.os.Environment;
import android.support.v4.app.FragmentActivity;
import android.support.v4.view.PagerAdapter;
import android.support.v4.view.ViewPager;
import android.view.Gravity;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.FrameLayout;
import android.widget.TextView;
import android.widget.Toast;
import com.davemorrissey.labs.subscaleview.ImageSource;
import com.davemorrissey.labs.subscaleview.SubsamplingScaleImageView;
import com.linroid.filtermenu.library.FilterMenu;
import com.linroid.filtermenu.library.FilterMenuLayout;
import com.nostra13.universalimageloader.core.DisplayImageOptions;
import com.nostra13.universalimageloader.core.ImageLoader;
import com.nostra13.universalimageloader.core.assist.FailReason;
import com.nostra13.universalimageloader.core.assist.ImageScaleType;
import com.nostra13.universalimageloader.core.listener.ImageLoadingProgressListener;
import com.nostra13.universalimageloader.core.listener.SimpleImageLoadingListener;
import com.pnikosis.materialishprogress.ProgressWheel;
import com.ywwxhz.MyApplication;
import com.ywwxhz.cnbetareader.R;
import com.ywwxhz.lib.ThemeManger;
import com.ywwxhz.lib.kits.FileKit;
import com.ywwxhz.lib.kits.PrefKit;
import com.ywwxhz.lib.kits.Toolkit;
import com.ywwxhz.lib.kits.UIKit;
import com.ywwxhz.widget.FixViewPager;
import com.ywwxhz.widget.TranslucentStatus.TranslucentStatusHelper;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Locale;
import de.keyboardsurfer.android.widget.crouton.Crouton;
import pl.droidsonroids.gif.GifDrawable;
import pl.droidsonroids.gif.GifImageView;
/**
* cnBetaReader
* <p/>
* Created by 远望の无限(ywwxhz) on 14-4-15 17:51.
*/
public class ImageViewActivity extends FragmentActivity implements ViewPager.OnPageChangeListener {
public static final String IMAGE_URLS = "image_urls";
public static final String CURRENT_POS = "current";
private static final String imageNumFormate = " %d / %d ";
private FixViewPager pager;
private TextView imagenum;
private String[] imageSrcs;
private int pos;
private List<View> views;
private List<ImageItem> imageItems;
private int screenHeight;
private int screenWidth;
private boolean debug;
private boolean preload_image;
public void onCreate(Bundle savedInstanceState) {
ThemeManger.onActivityCreateSetTheme(this);
getWindow().setBackgroundDrawableResource(R.color.gray_80);
super.onCreate(savedInstanceState);
if (getIntent().getExtras().containsKey(IMAGE_URLS) && getIntent().getExtras().containsKey(CURRENT_POS)) {
debug = MyApplication.getInstance().getDebug();
preload_image = PrefKit.getBoolean(this, R.string.pref_preload_image_key, true);
screenHeight = getResources().getDisplayMetrics().heightPixels;
screenWidth = getResources().getDisplayMetrics().widthPixels;
this.imageSrcs = getIntent().getStringArrayExtra(IMAGE_URLS);
this.pos = getIntent().getIntExtra(CURRENT_POS, 0);
if (imageSrcs.length == 0) {
this.finish();
return;
}
TranslucentStatusHelper.TranslucentStatusBar(this);
setContentView(R.layout.activity_imageview);
initView();
loadAndShowPos(pos);
} else {
this.finish();
}
}
private void initView() {
FilterMenuLayout filtermenu = (FilterMenuLayout) findViewById(R.id.filter_menu);
this.imagenum = (TextView) findViewById(R.id.image_num);
this.pager = (FixViewPager) findViewById(R.id.pager);
attachMenu(filtermenu);
DisplayImageOptions options = new DisplayImageOptions.Builder().cacheOnDisk(true)
.imageScaleType(ImageScaleType.IN_SAMPLE_POWER_OF_2)
.considerExifParams(true).build();
views = new ArrayList<>(imageSrcs.length);
imageItems = new ArrayList<>(imageSrcs.length);
int width = UIKit.dip2px(this, 4);
int progressWidth = UIKit.dip2px(this, 80);
for (String imageSrc : imageSrcs) {
FrameLayout view = new FrameLayout(this);
//View view = LayoutInflater.from(this).inflate(R.layout.image_item, pager, false);
View imageView;
FrameLayout.LayoutParams pvparams = new FrameLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);
if (!imageSrc.endsWith(".gif")) {
imageView = new SubsamplingScaleImageView(this);
((SubsamplingScaleImageView) imageView).setDebug(debug);
((SubsamplingScaleImageView) imageView).setMinimumDpi(50);
} else {
imageView = new GifImageView(this);
}
imageView.setLayoutParams(pvparams);
view.addView(imageView);
ProgressWheel progress = new ProgressWheel(this);
progress.setRimWidth(width);
progress.setBarWidth(width);
progress.setBarColor(Color.parseColor("#fff0f4e2"));
progress.setRimColor(Color.parseColor("#44000000"));
FrameLayout.LayoutParams pgparams = new FrameLayout.LayoutParams(progressWidth, progressWidth);
pgparams.gravity = Gravity.CENTER;
progress.setLayoutParams(pgparams);
progress.spin();
view.addView(progress);
imageItems.add(new ImageItem(imageSrc, imageView, progress, options));
views.add(view);
}
PagerAdapter mPagerAdapter = new PagerAdapter() {
@Override
public int getCount() {
return imageSrcs.length;
}
@Override
public boolean isViewFromObject(View view, Object object) {
return view == object;
}
@Override
public void destroyItem(ViewGroup container, int position, Object object) {
container.removeView(views.get(position));
}
@Override
public Object instantiateItem(ViewGroup container, int position) {
container.addView(views.get(position));
return views.get(position);
}
};
pager.setAdapter(mPagerAdapter);
pager.setOnPageChangeListener(this);
pager.setPageTransformer(true, new MyPageTransformer());
pager.setCurrentItem(pos);
}
private FilterMenu attachMenu(FilterMenuLayout layout) {
return new FilterMenu.Builder(this)
.addItem(R.drawable.ic_save)
.addItem(R.drawable.ic_share)
.addItem(R.drawable.ic_reflush)
.withListener(new FilterMenu.OnMenuChangeListener() {
@Override
public void onMenuItemClick(View view, int position) {
if (position != 2) {
String image_url = imageSrcs[pager.getCurrentItem()];
File imageFile = ImageLoader.getInstance().getDiskCache().get(image_url);
if (imageFile != null) {
switch (position) {
case 0:
saveImage(image_url, imageFile);
break;
case 1:
shareImage(image_url, imageFile);
break;
}
} else {
Toast.makeText(ImageViewActivity.this, "图片还未下载完成", Toast.LENGTH_SHORT).show();
}
} else {
imageItems.get(pager.getCurrentItem()).displayImage(true);
}
}
@Override
public void onMenuCollapse() {
}
@Override
public void onMenuExpand() {
}
})
.attach(layout)
.build();
}
private void shareImage(String imageUrl, File imageFile) {
Toolkit.SharePhoto(imageFile.getAbsolutePath(), this);
}
private void saveImage(String imageUrl, File imageFile) {
FileKit.copyFile(imageFile.getAbsolutePath(),
new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES), "cnBetaPlus"),
Uri.parse(imageUrl).getLastPathSegment());
String path = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES), "cnBetaPlus").toString()
+ "/" + Uri.parse(imageUrl).getLastPathSegment();
Toast.makeText(ImageViewActivity.this, String.format(Locale.CHINA, "保存成功 文件路径:%s", path), Toast.LENGTH_LONG).show();
sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, Uri.parse("file://" + path)));
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case android.R.id.home:
finish();
return true;
}
return super.onOptionsItemSelected(item);
}
@Override
public void onBackPressed() {
this.finish();
}
@Override
protected void onDestroy() {
Crouton.clearCroutonsForActivity(this);
super.onDestroy();
}
@Override
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
}
@Override
public void onPageSelected(int position) {
loadAndShowPos(position);
}
@Override
public void onPageScrollStateChanged(int state) {
}
class ImageItem {
public final int NOTSHOW = 0;
public final int SHOWING = 1;
public final int SHOWSUCCESS = 3;
public final int SHOWFAILURE = 4;
private String imageSrc;
private View imageview;
private ProgressWheel progress;
private DisplayImageOptions options;
private int showStatus = NOTSHOW;
public ImageItem(String imageSrc, View imageview, ProgressWheel progress, DisplayImageOptions options) {
this.imageSrc = imageSrc;
this.imageview = imageview;
this.progress = progress;
this.options = options;
this.showStatus = NOTSHOW;
}
public void displayImage(boolean current) {
if (showStatus == NOTSHOW || showStatus == SHOWFAILURE) {
ImageLoader.getInstance().loadImage(imageSrc, null, options, new SimpleImageLoadingListener() {
@Override
public void onLoadingStarted(String imageUri, View view) {
if (showStatus == NOTSHOW || showStatus == SHOWFAILURE) {
progress.spin();
progress.setVisibility(View.VISIBLE);
}
showStatus = SHOWING;
}
@Override
public void onLoadingComplete(String imageUri, View view, Bitmap loadedImage) {
progress.setVisibility(View.GONE);
File imageFile = ImageLoader.getInstance().getDiskCache().get(imageUri);
if (imageFile != null) {
if (imageview instanceof SubsamplingScaleImageView) {
if (loadedImage.getWidth() * 1.5 < loadedImage.getHeight()) {
((SubsamplingScaleImageView) imageview).setMinimumScaleType(SubsamplingScaleImageView.SCALE_TYPE_CENTER_CROP);
}
((SubsamplingScaleImageView) imageview).setImage(ImageSource.uri(Uri.fromFile(imageFile)));
} else {
try {
GifDrawable g = new GifDrawable(imageFile);
((GifImageView) imageview).setImageDrawable(g);
} catch (IOException e) {
e.printStackTrace();
}
}
showStatus = SHOWSUCCESS;
} else {
showStatus = SHOWFAILURE;
}
}
@Override
public void onLoadingFailed(String imageUri, View view, FailReason failReason) {
progress.setVisibility(View.GONE);
showStatus = SHOWFAILURE;
}
}, new ImageLoadingProgressListener() {
@Override
public void onProgressUpdate(String imageUri, View view, int current, int total) {
progress.setProgress((float) current / total);
}
});
} else if (showStatus == SHOWSUCCESS) {
if (imageview instanceof GifImageView) {
Drawable drawable = ((GifImageView) imageview).getDrawable();
if (drawable instanceof GifDrawable) {
if (current) {
((GifDrawable) drawable).start();
} else {
((GifDrawable) drawable).stop();
}
}
}
}
}
}
private void loadAndShowPos(int pos) {
imageItems.get(pos).displayImage(true);
if (preload_image) {
if (pos > 0) {
imageItems.get(pos - 1).displayImage(false);
}
if (pos < imageItems.size() - 1) {
imageItems.get(pos + 1).displayImage(false);
}
}
imagenum.setText(String.format(Locale.CHINA, imageNumFormate, pos + 1, imageSrcs.length));
}
private class MyPageTransformer implements ViewPager.PageTransformer {
@Override
public void transformPage(View view, float position) {
int pageWidth = view.getWidth();
if (position < -1) { // [-Infinity,-1)
// This page is way off-screen to the left.
view.setAlpha(0);
} else if (position <= 0) { // [-1,0]
// Use the default slide transition when
// moving to the left page
view.setAlpha(1);
view.setTranslationX(0);
} else if (position <= 1) { // (0,1]
// Fade the page out.
view.setAlpha(1 - position);
// Counteract the default slide transition
view.setTranslationX(pageWidth / 2 * -position);
} else { // (1,+Infinity]
// This page is way off-screen to the right.
view.setAlpha(0);
}
}
}
}