package org.aisen.weibo.sina.ui.fragment.picture; import java.io.File; import javax.microedition.khronos.opengles.GL10; import javax.microedition.khronos.opengles.GL11; import org.aisen.weibo.sina.R; import org.aisen.weibo.sina.support.utils.AppSettings; import org.aisen.weibo.sina.ui.widget.PictureProgressView; import org.android.loader.BitmapLoader; import org.android.loader.core.BitmapDecoder; import org.android.loader.core.ImageConfig; import org.android.loader.download.DownloadProcess; import org.sina.android.bean.PicUrls; import uk.co.senab.photoview.PhotoView; import android.annotation.SuppressLint; import android.app.Activity; import android.content.Intent; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.BitmapFactory.Options; import android.graphics.Rect; import android.opengl.GLES10; import android.os.Bundle; import android.view.LayoutInflater; import android.view.Menu; import android.view.MenuInflater; import android.view.MenuItem; import android.view.View; import android.webkit.WebView; import android.widget.ImageView; import android.widget.ShareActionProvider; import com.m.common.utils.BitmapUtil; import com.m.common.utils.BitmapUtil.BitmapType; import com.m.common.utils.FileUtility; import com.m.common.utils.SystemUtility; import com.m.common.utils.Utils; import com.m.support.Inject.ViewInject; import com.m.ui.fragment.ABaseFragment; import fr.castorflex.android.smoothprogressbar.SmoothProgressBar; /** * 部分代码参考自四次元 * * @author Jeff.Wang * * @date 2014年9月18日 */ @SuppressLint("SdCardPath") public class PictureFragment extends ABaseFragment { public static ABaseFragment newInstance(PicUrls url) { PictureFragment fragment = new PictureFragment(); Bundle args = new Bundle(); args.putSerializable("url", url); fragment.setArguments(args); return fragment; } @ViewInject(idStr = "photoview") PhotoView photoView; @ViewInject(idStr = "webview") WebView mWebView; @ViewInject(idStr = "txtFailure", click = "loadPicture") View viewFailure; @ViewInject(id = R.id.viewProgress) PictureProgressView progressView; @ViewInject(id = R.id.progress) SmoothProgressBar progressBar; private PicUrls image; @Override protected int inflateContentView() { return R.layout.ui_picture; } @Override protected void layoutInit(LayoutInflater inflater, Bundle savedInstanceSate) { super.layoutInit(inflater, savedInstanceSate); image = savedInstanceSate == null ? (PicUrls) getArguments().getSerializable("url") : (PicUrls) savedInstanceSate.getSerializable("url"); progressBar.setIndeterminate(true); loadPicture(viewFailure); setHasOptionsMenu(true); } @Override public void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); outState.putSerializable("url", image); } private String getImage() { return image.getThumbnail_pic().replace("thumbnail", "bmiddle"); } void loadPicture(View v) { File file = BitmapLoader.getInstance().getCacheFile(getImage()); if (!file.exists()) { progressBar.setVisibility(View.VISIBLE); progressView.setVisibility(View.VISIBLE); } // try { // file.delete(); // } catch (Exception e) { // } viewFailure.setVisibility(View.GONE); ImageView imgView = new ImageView(getActivity()); ImageConfig config = new ImageConfig(); config.setId("Picture"); config.setProgress(new PictureDownloadProgress()); BitmapLoader.getInstance().display(null, getImage(), imgView, config); } class PictureDownloadProgress extends DownloadProcess { private long length; @Override public void receiveLength(long length) { this.length = length; } @Override public void receiveProgress(long progressed) { if (getActivity() == null) return; if (progressBar.getVisibility() == View.VISIBLE) progressBar.setVisibility(View.GONE); progressView.setProgress(Math.round(progressed * 100.0f / length)); } @Override public void prepareDownload(String url) { } @Override public void finishedDownload(byte[] bytes) { if (getActivity() == null) return; getActivity().invalidateOptionsMenu(); progressView.setVisibility(View.INVISIBLE); Options opts = new Options(); opts.inJustDecodeBounds = true; BitmapFactory.decodeByteArray(bytes, 0, bytes.length, opts); // gif if (BitmapUtil.getType(bytes) == BitmapType.gif) { readGifPicture(mWebView, bytes); } // 图片太大 else if (opts.outWidth > 1024 || opts.outHeight > 1024) { readLargePicture(mWebView, bytes); } // 解析图片 else { readPicture(bytes, photoView); } getActivity().invalidateOptionsMenu(); } @Override public void downloadFailed(Exception e) { if (getActivity() == null) return; progressView.setVisibility(View.INVISIBLE); viewFailure.setVisibility(View.VISIBLE); } } @SuppressLint("SetJavaScriptEnabled") private void readGifPicture(final WebView webview, byte[] bytes) { File file = BitmapLoader.getInstance().getCacheFile(getImage()); BitmapFactory.Options options = new BitmapFactory.Options(); options.inJustDecodeBounds = true; BitmapFactory.decodeByteArray(bytes, 0, bytes.length, options); int picWidth = options.outWidth; int picHeight = options.outHeight; int availableWidth = SystemUtility.getScreenWidth() - getResources().getDimensionPixelOffset(R.dimen.normal_gif_webview_margin_left) - getResources().getDimensionPixelOffset(R.dimen.normal_gif_webview_margin_right); int availableHeight = getAppHeight(getActivity()); int maxPossibleResizeHeight = availableWidth * availableHeight / picWidth; if (picWidth >= availableWidth || picHeight >= availableHeight || maxPossibleResizeHeight >= availableHeight) { readLargePicture(webview, bytes); return; } webview.getSettings().setJavaScriptEnabled(true); webview.getSettings().setUseWideViewPort(true); webview.getSettings().setLoadWithOverviewMode(true); webview.getSettings().setBuiltInZoomControls(false); webview.getSettings().setDisplayZoomControls(false); webview.getSettings().setSupportZoom(false); webview.setVerticalScrollBarEnabled(false); webview.setHorizontalScrollBarEnabled(false); String str1 = "file://" + file.getAbsolutePath().replace("/mnt/sdcard/", "/sdcard/"); String str2 = "<html>\n<head>\n <style>\n html,body{background:#3b3b3b;margin:0;padding:0;} *{-webkit-tap-highlight-color:rgba(0, 0, 0, 0);}\n </style>\n <script type=\"text/javascript\">\n var imgUrl = \"" + str1 + "\";" + " var objImage = new Image();\n" + " var realWidth = 0;\n" + " var realHeight = 0;\n" + "\n" + " function onLoad() {\n" + " objImage.onload = function() {\n" + " realWidth = objImage.width;\n" + " realHeight = objImage.height;\n" + "\n" + " document.gagImg.src = imgUrl;\n" + " onResize();\n" + " }\n" + " objImage.src = imgUrl;\n" + " }\n" + "\n" + " function onResize() {\n" + " var scale = 1;\n" + " var newWidth = document.gagImg.width;\n" + " if (realWidth > newWidth) {\n" + " scale = realWidth / newWidth;\n" + " } else {\n" + " scale = newWidth / realWidth;\n" + " }\n" + "\n" + " hiddenHeight = Math.ceil(30 * scale);\n" + " document.getElementById('hiddenBar').style.height = hiddenHeight + \"px\";\n" + " document.getElementById('hiddenBar').style.marginTop = -hiddenHeight + \"px\";\n" + " }\n" + " </script>\n" + "</head>\n" + "<body onload=\"onLoad()\" onresize=\"onResize()\" onclick=\"Android.toggleOverlayDisplay();\">\n" + " <table style=\"width: 100%;height:100%;\">\n" + " <tr style=\"width: 100%;\">\n" + " <td valign=\"middle\" align=\"center\" style=\"width: 100%;\">\n" + " <div style=\"display:block\">\n" + " <img name=\"gagImg\" src=\"\" width=\"100%\" style=\"\" />\n" + " </div>\n" + " <div id=\"hiddenBar\" style=\"position:absolute; width: 100%; background: #3b3b3b;\"></div>\n" + " </td>\n" + " </tr>\n" + " </table>\n" + "</body>\n" + "</html>"; webview.loadDataWithBaseURL("file:///android_asset/", str2, "text/html", "utf-8", null); webview.postDelayed(new Runnable() { @Override public void run() { webview.setVisibility(View.VISIBLE); } }, 500); } @SuppressLint("SetJavaScriptEnabled") private void readLargePicture(final WebView large, byte[] bytes) { File file = BitmapLoader.getInstance().getCacheFile(getImage()); large.getSettings().setJavaScriptEnabled(true); large.getSettings().setUseWideViewPort(true); large.getSettings().setLoadWithOverviewMode(true); large.getSettings().setBuiltInZoomControls(true); large.getSettings().setDisplayZoomControls(false); large.setVerticalScrollBarEnabled(false); large.setHorizontalScrollBarEnabled(false); String str1 = "file://" + file.getAbsolutePath().replace("/mnt/sdcard/", "/sdcard/"); String str2 = "<html>\n<head>\n <style>\n html,body{background:#3b3b3b;margin:0;padding:0;} *{-webkit-tap-highlight-color:rgba(0, 0, 0, 0);}\n </style>\n <script type=\"text/javascript\">\n var imgUrl = \"" + str1 + "\";" + " var objImage = new Image();\n" + " var realWidth = 0;\n" + " var realHeight = 0;\n" + "\n" + " function onLoad() {\n" + " objImage.onload = function() {\n" + " realWidth = objImage.width;\n" + " realHeight = objImage.height;\n" + "\n" + " document.gagImg.src = imgUrl;\n" + " onResize();\n" + " }\n" + " objImage.src = imgUrl;\n" + " }\n" + "\n" + " function onResize() {\n" + " var scale = 1;\n" + " var newWidth = document.gagImg.width;\n" + " if (realWidth > newWidth) {\n" + " scale = realWidth / newWidth;\n" + " } else {\n" + " scale = newWidth / realWidth;\n" + " }\n" + "\n" + " hiddenHeight = Math.ceil(30 * scale);\n" + " document.getElementById('hiddenBar').style.height = hiddenHeight + \"px\";\n" + " document.getElementById('hiddenBar').style.marginTop = -hiddenHeight + \"px\";\n" + " }\n" + " </script>\n" + "</head>\n" + "<body onload=\"onLoad()\" onresize=\"onResize()\" onclick=\"Android.toggleOverlayDisplay();\">\n" + " <table style=\"width: 100%;height:100%;\">\n" + " <tr style=\"width: 100%;\">\n" + " <td valign=\"middle\" align=\"center\" style=\"width: 100%;\">\n" + " <div style=\"display:block\">\n" + " <img name=\"gagImg\" src=\"\" width=\"100%\" style=\"\" />\n" + " </div>\n" + " <div id=\"hiddenBar\" style=\"position:absolute; width: 100%; background: #3b3b3b;\"></div>\n" + " </td>\n" + " </tr>\n" + " </table>\n" + "</body>\n" + "</html>"; large.loadDataWithBaseURL("file:///android_asset/", str2, "text/html", "utf-8", null); large.setTag(new Object()); large.postDelayed(new Runnable() { @Override public void run() { large.setVisibility(View.VISIBLE); } }, 500); } private void readPicture(byte[] bytes, ImageView imageView) { Bitmap bitmap = BitmapDecoder.decodeSampledBitmapFromByte(bytes); imageView.setImageBitmap(bitmap); imageView.setVisibility(View.VISIBLE); } public static int getBitmapMaxWidthAndMaxHeight() { // 2014-08-26 最大高度改小一点 int[] maxSizeArray = new int[1]; GLES10.glGetIntegerv(GL10.GL_MAX_TEXTURE_SIZE, maxSizeArray, 0); if (maxSizeArray[0] == 0) { GLES10.glGetIntegerv(GL11.GL_MAX_TEXTURE_SIZE, maxSizeArray, 0); } if (maxSizeArray[0] > 0) return maxSizeArray[0]; return 1280; } public static int getAppHeight(Activity paramActivity) { Rect localRect = new Rect(); paramActivity.getWindow().getDecorView().getWindowVisibleDisplayFrame(localRect); return localRect.height(); } @Override public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { inflater.inflate(R.menu.picture, menu); super.onCreateOptionsMenu(menu, inflater); } @Override public void onPrepareOptionsMenu(Menu menu) { File file = BitmapLoader.getInstance().getCacheFile(getImage()); menu.findItem(R.id.savePicture).setVisible(file.exists()); menu.findItem(R.id.share).setVisible(file.exists()); Intent shareIntent = Utils.getShareIntent("", "", getImage()); MenuItem shareItem = menu.findItem(R.id.share); ShareActionProvider shareProvider = (ShareActionProvider) shareItem.getActionProvider(); shareProvider.setShareHistoryFileName("channe_share.xml"); shareProvider.setShareIntent(shareIntent); super.onPrepareOptionsMenu(menu); } @Override public boolean onOptionsItemSelected(MenuItem item) { // 下载 if (item.getItemId() == R.id.savePicture) { downloadImage(); } // 分享 else if (item.getItemId() == R.id.share) { } return super.onOptionsItemSelected(item); } private void downloadImage() { File file = BitmapLoader.getInstance().getCacheFile(getImage()); String path = SystemUtility.getSdcardPath() + File.separator + AppSettings.getImageSavePath() + File.separator + file.getName(); File newFile = new File(path); if (!newFile.exists()) { if (!newFile.getParentFile().exists()) newFile.getParentFile().mkdirs(); try { FileUtility.copyFile(file, newFile); } catch (Exception e) { } } showMessage(R.string.msg_save_pic_success); } }