diff --git a/app/build.gradle b/app/build.gradle index 4ed67954b6..ac7009cc0a 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -284,6 +284,10 @@ dependencies { implementation "com.airbnb.android:lottie:$lottie" + implementation("com.github.piasy:BigImageViewer:1.6.2",{ + exclude group: 'com.squareup.okhttp3' + }) + implementation project(':libraries:LGLibrary') implementation project(':libraries:MTA') implementation project(':libraries:QQShare') diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 33d566712d..48627dbe69 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -41,7 +41,8 @@ com.shuyu.gsyvideoplayer.armv7a, com.shuyu.gsyvideoplayer.x86, com.shuyu.gsy.base, - shuyu.com.androidvideocache" /> + shuyu.com.androidvideocache, + pl.droidsonroids.gif" /> 0) { val transformUrlX2 = addLimitWidth(url, width * 2) diff --git a/app/src/main/java/com/gh/common/util/SimpleImageLoader.java b/app/src/main/java/com/gh/common/util/SimpleImageLoader.java new file mode 100644 index 0000000000..31bcf4c51f --- /dev/null +++ b/app/src/main/java/com/gh/common/util/SimpleImageLoader.java @@ -0,0 +1,42 @@ +package com.gh.common.util; + +import com.github.piasy.biv.loader.ImageLoader; + +import java.io.File; + +public class SimpleImageLoader implements ImageLoader.Callback { + @Override + public void onCacheHit(int imageType, File image) { + + } + + @Override + public void onCacheMiss(int imageType, File image) { + + } + + @Override + public void onStart() { + + } + + @Override + public void onProgress(int progress) { + + } + + @Override + public void onFinish() { + + } + + @Override + public void onSuccess(File image) { + + } + + @Override + public void onFail(Exception error) { + + } +} diff --git a/app/src/main/java/com/gh/common/view/ZoomSimpleDraweeView.java b/app/src/main/java/com/gh/common/view/ZoomSimpleDraweeView.java deleted file mode 100644 index 7c8bdda311..0000000000 --- a/app/src/main/java/com/gh/common/view/ZoomSimpleDraweeView.java +++ /dev/null @@ -1,296 +0,0 @@ -package com.gh.common.view; - -import android.content.Context; -import android.graphics.Canvas; -import android.graphics.Matrix; -import android.graphics.RectF; -import android.net.Uri; -import android.util.AttributeSet; -import android.view.GestureDetector; -import android.view.MotionEvent; -import android.view.ScaleGestureDetector; - -import com.facebook.drawee.view.SimpleDraweeView; -import com.gh.gamecenter.eventbus.EBReuse; - -import org.greenrobot.eventbus.EventBus; - - -/** - * Created by khy on 2016/10/26. - */ -public class ZoomSimpleDraweeView extends SimpleDraweeView { - private final float[] matrixValues = new float[9]; - private ScaleGestureDetector mScaleDetector; - private GestureDetector mGestureDetector; - private float mCurrentScale = 1f; - private Matrix mCurrentMatrix; - private setOnSingleClickListener mClickListener; - private setOnLongClickListener mLongClickListener; - private float imgagePro = -1; // 图片宽高比 - - public ZoomSimpleDraweeView(Context context) { - super(context); - init(); - } - - private void init() { - mCurrentMatrix = new Matrix(); - - ScaleGestureDetector.OnScaleGestureListener scaleListener = new ScaleGestureDetector - .SimpleOnScaleGestureListener() { - - @Override - public boolean onScale(ScaleGestureDetector detector) { - float scaleFactor = detector.getScaleFactor(); - if (mCurrentScale < 4f || detector.getScaleFactor() < 1f) { - mCurrentScale *= scaleFactor; - mCurrentMatrix.postScale(scaleFactor, scaleFactor, detector.getFocusX(), detector.getFocusY()); - invalidate(); - } - return true; - } - - @Override - public void onScaleEnd(ScaleGestureDetector detector) { - super.onScaleEnd(detector); - - if (mCurrentScale < 1f) { - reset(); - } - checkBorder(); - } - - }; - mScaleDetector = new ScaleGestureDetector(getContext(), scaleListener); - - GestureDetector.SimpleOnGestureListener gestureListener = new GestureDetector.SimpleOnGestureListener() { - @Override - public boolean onSingleTapUp(MotionEvent e) { - - return super.onSingleTapUp(e); - } - - @Override - public void onLongPress(MotionEvent e) { - super.onLongPress(e); - if (mLongClickListener != null) { - mLongClickListener.onLongClick(); - } - } - - @Override - public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) { - if (mCurrentScale > 1f) { - mCurrentMatrix.postTranslate(-distanceX, -distanceY); - invalidate(); - checkBorder(); - } - return true; - } - - @Override - public boolean onDoubleTap(MotionEvent e) { - final float x = e.getX(); - final float y = e.getY(); - float scaleSize; //扩大或缩小的倍数 - - if (mCurrentScale > 1.5f) { //缩小时直接回到原画大小 - scaleSize = 0.5f; - ZoomSimpleDraweeView.this.post(new AutoScaleRunnable(mCurrentScale * scaleSize, getWidth() / 2f, getHeight() / 2f, false)); - } else { - scaleSize = 2.0f; - ZoomSimpleDraweeView.this.post(new AutoScaleRunnable(mCurrentScale * scaleSize, x, y, true)); - } - return true; - } - - @Override - public boolean onSingleTapConfirmed(MotionEvent e) { - if (mClickListener != null) { - mClickListener.onClick(); - } - return true; - } - }; - mGestureDetector = new GestureDetector(getContext(), gestureListener); - } - - /** - * 重置图片 - */ - public void reset() { - mCurrentMatrix.reset(); - mCurrentScale = 1f; - invalidate(); - EventBus.getDefault().post(new EBReuse("isStopMove")); - } - - /** - * 检查图片边界是否移到view以内 - * 目的是让图片边缘不要移动到view里面 - */ - private void checkBorder() { - RectF rectF = getDisplayRect(mCurrentMatrix); - boolean reset = false; - float dx = 0; - float dy = 0; - - - if (rectF.left > 0) { - dx = getLeft() - rectF.left; - reset = true; - } - if (rectF.top > 0) { - dy = getTop() - rectF.top; - reset = true; - } - if (rectF.right < getRight()) { - dx = getRight() - rectF.right; - reset = true; - } - if (rectF.bottom < getHeight()) { - dy = getHeight() - rectF.bottom; - reset = true; - } - if (reset) { - mCurrentMatrix.postTranslate(dx, dy); - invalidate(); - } - if (dy == 0 && reset || mCurrentScale == 1f) { - EventBus.getDefault().post(new EBReuse("isStopMove")); - } else { - EventBus.getDefault().post(new EBReuse("isStartove")); - } - } - - /** - * Helper method that maps the supplied Matrix to the current Drawable - * - * @param matrix - Matrix to map Drawable against - * @return RectF - Displayed Rectangle - */ - private RectF getDisplayRect(Matrix matrix) { -// int bottom; -// if (imgagePro != -1){ -// bottom = (int) (getRight()*imgagePro); -// } else { -// bottom = getBottom(); -// } - RectF rectF = new RectF(getLeft(), getTop(), getRight(), getBottom()); - matrix.mapRect(rectF); - return rectF; - } - - public ZoomSimpleDraweeView(Context context, AttributeSet attrs) { - super(context, attrs); - init(); - } - - public ZoomSimpleDraweeView(Context context, AttributeSet attrs, int defStyle) { - super(context, attrs, defStyle); - init(); - } - - @Override - public void setImageURI(Uri uri) { - reset(); - super.setImageURI(uri); - } - - @Override - protected void onDraw(Canvas canvas) { - int saveCount = canvas.save(); - canvas.concat(mCurrentMatrix); - super.onDraw(canvas); - canvas.restoreToCount(saveCount); - } - - @Override - public boolean onTouchEvent(MotionEvent event) { - mScaleDetector.onTouchEvent(event); - if (!mScaleDetector.isInProgress()) { - mGestureDetector.onTouchEvent(event); - } - - return true; - } - - public final float getScale() { - mCurrentMatrix.getValues(matrixValues); - return matrixValues[Matrix.MSCALE_X]; - } - - //图片宽高比例 - public void setImagePro(float imgPro) { - this.imgagePro = imgPro; - } - - public void setOnSingleClickListener(setOnSingleClickListener listener) { - mClickListener = listener; - } - - public void setOnLongClickListener(setOnLongClickListener listener) { - mLongClickListener = listener; - } - - public interface setOnLongClickListener { - void onLongClick(); - } - - public interface setOnSingleClickListener { - void onClick(); - } - - /** - * 自动缩放的任务 - */ - private class AutoScaleRunnable implements Runnable { - static final float BIGGER = 1.07f; - static final float SMALLER = 0.96f; - private float mTargetScale; - private boolean isExp; - - /** - * 缩放的中心 - */ - private float x; - private float y; - - /** - * @param isExp :判断是否是放大 - */ - public AutoScaleRunnable(float targetScale, float x, float y, boolean isExp) { - this.mTargetScale = targetScale; - this.x = x; - this.y = y; - this.isExp = isExp; - - } - - @Override - public void run() { - if (isExp) { //放大 - mCurrentMatrix.postScale(BIGGER, BIGGER, x, y); - invalidate(); - if (mCurrentScale < mTargetScale && mCurrentScale <= 4) { - ZoomSimpleDraweeView.this.postDelayed(this, 10); - mCurrentScale = mCurrentScale * BIGGER; - } else { - checkBorder(); - mCurrentScale = getScale(); - } - } else {//缩小 - mCurrentMatrix.postScale(SMALLER, SMALLER, x, y); - invalidate(); - checkBorder(); - if (getScale() > 1.01) { - ZoomSimpleDraweeView.this.postDelayed(this, 1); - mCurrentScale = mCurrentScale * SMALLER; - } else { - reset(); - } - } - } - } -} diff --git a/app/src/main/java/com/gh/gamecenter/ViewImageActivity.java b/app/src/main/java/com/gh/gamecenter/ViewImageActivity.java index b47a1eda31..1d6d9a2953 100644 --- a/app/src/main/java/com/gh/gamecenter/ViewImageActivity.java +++ b/app/src/main/java/com/gh/gamecenter/ViewImageActivity.java @@ -1,11 +1,12 @@ package com.gh.gamecenter; +import android.annotation.SuppressLint; import android.app.Activity; import android.app.Dialog; import android.content.Context; import android.content.Intent; import android.content.res.Configuration; -import android.graphics.Bitmap; +import android.graphics.BitmapFactory; import android.graphics.Color; import android.net.Uri; import android.os.Bundle; @@ -18,40 +19,39 @@ import android.widget.LinearLayout; import android.widget.RelativeLayout; import android.widget.TextView; -import com.facebook.binaryresource.BinaryResource; -import com.facebook.cache.common.CacheKey; -import com.facebook.common.executors.CallerThreadExecutor; -import com.facebook.common.references.CloseableReference; -import com.facebook.datasource.DataSource; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.core.content.ContextCompat; +import androidx.viewpager.widget.PagerAdapter; +import androidx.viewpager.widget.ViewPager.OnPageChangeListener; + +import com.davemorrissey.labs.subscaleview.SubsamplingScaleImageView; import com.facebook.drawee.backends.pipeline.Fresco; -import com.facebook.drawee.interfaces.DraweeController; import com.facebook.imagepipeline.core.ImagePipeline; -import com.facebook.imagepipeline.datasource.BaseBitmapDataSubscriber; -import com.facebook.imagepipeline.image.CloseableImage; import com.facebook.imagepipeline.request.ImageRequest; -import com.facebook.imagepipeline.request.ImageRequestBuilder; import com.gh.base.BaseActivity; import com.gh.common.Base64ImageHolder; import com.gh.common.util.DisplayUtils; import com.gh.common.util.EntranceUtils; import com.gh.common.util.ImageUtils; import com.gh.common.util.MD5Utils; -import com.gh.common.util.MessageShareUtils; import com.gh.common.util.NetworkUtils; import com.gh.common.util.PermissionHelper; -import com.gh.common.view.EmptyDrawable; +import com.gh.common.util.SimpleImageLoader; import com.gh.common.view.Gh_RelativeLayout; import com.gh.common.view.Gh_RelativeLayout.OnSingleTapListener; import com.gh.common.view.Gh_ViewPager; -import com.gh.common.view.ZoomSimpleDraweeView; import com.gh.gamecenter.entity.ImageInfoEntity; import com.gh.gamecenter.retrofit.Response; import com.gh.gamecenter.retrofit.RetrofitManager; +import com.github.piasy.biv.view.BigImageView; +import com.github.piasy.biv.view.FrescoImageViewFactory; import com.lightgame.utils.Utils; import java.io.File; +import java.io.FileInputStream; import java.io.FileOutputStream; -import java.io.IOException; +import java.io.InputStream; import java.io.OutputStream; import java.util.ArrayList; import java.util.HashMap; @@ -59,11 +59,6 @@ import java.util.HashSet; import java.util.Locale; import java.util.Map; -import androidx.annotation.NonNull; -import androidx.annotation.Nullable; -import androidx.core.content.ContextCompat; -import androidx.viewpager.widget.PagerAdapter; -import androidx.viewpager.widget.ViewPager.OnPageChangeListener; import butterknife.BindView; import io.reactivex.android.schedulers.AndroidSchedulers; import io.reactivex.schedulers.Schedulers; @@ -90,14 +85,13 @@ public class ViewImageActivity extends BaseActivity implements OnPageChangeListe private ViewImageAdapter adapter; private ImagePipeline mImagePipeline; - + private boolean mShowBase64Image = false; private static final String KEY_BASE64 = "base64"; - + private static final String KEY_URLS = "urls"; private static final String KEY_CURRENT = "current"; - private static final String KEY_SCALETYPE = "ScaleType"; private ArrayList urls; private HashSet mViewedSet; // 让调用者知道该图片是否被看过了 @@ -106,7 +100,7 @@ public class ViewImageActivity extends BaseActivity implements OnPageChangeListe private int mLimitWidth; private boolean isOrientation; - + public static Intent getBase64ViewImageIntent(Context context, boolean showSingleBase64Image) { Intent checkIntent = new Intent(context, ViewImageActivity.class); checkIntent.putExtra(KEY_BASE64, showSingleBase64Image); @@ -131,7 +125,6 @@ public class ViewImageActivity extends BaseActivity implements OnPageChangeListe super.onCreate(savedInstanceState); mViewedSet = new HashSet<>(); mImageInfoMap = new HashMap<>(); - // init data int current = 0; Bundle extras = getIntent().getExtras(); @@ -183,31 +176,29 @@ public class ViewImageActivity extends BaseActivity implements OnPageChangeListe if (object != null) { mProgressHint.setWidth(mProgressHint.getWidth()); RelativeLayout view = (RelativeLayout) object; - final ZoomSimpleDraweeView draweeView = view.findViewById(R.id.viewimage_iv_show); - draweeView.getHierarchy().setProgressBarImage(new EmptyDrawable(progress -> { - if (position == mViewPager.getCurrentItem()) { // 防止下载过程中切换图片 - int percent = progress / 100; - if (percent < 100) { - mProgressHint.setText((percent + "%")); - } else { - mProgressHint.setText("已完成"); - mBaseHandler.postDelayed(() -> { - if (position == mViewPager.getCurrentItem()) { // 防止等待过程中切换图片 - mProgressHint.setVisibility(View.GONE); - } - }, 500); + final BigImageView imageView = view.findViewById(R.id.viewimage_iv_show); + String url = urls.get(position); + imageView.showImage(Uri.parse(url)); + imageView.setImageLoaderCallback(new SimpleImageLoader() { + @Override + public void onProgress(int progress) { + if (position == mViewPager.getCurrentItem()) { // 防止下载过程中切换图片 + if (progress < 100) { + mProgressHint.setText((progress + "%")); + } else { + mProgressHint.setText("已完成"); + mBaseHandler.postDelayed(() -> { + if (position == mViewPager.getCurrentItem()) { // 防止等待过程中切换图片 + mProgressHint.setVisibility(View.GONE); + } + }, 500); + } } } - })); - draweeView.setController(Fresco.newDraweeControllerBuilder() - // 高清图片 - .setImageRequest(ImageRequest.fromUri(urls.get(position))) - // 低分辨率图片 - .setLowResImageRequest(ImageRequest.fromUri(ImageUtils.addLimitWidth(urls.get(position), mLimitWidth))) - .build()); + }); } }); - + DisplayUtils.transparentStatusAndNavigation(this); } @@ -263,8 +254,10 @@ public class ViewImageActivity extends BaseActivity implements OnPageChangeListe return; } - ZoomSimpleDraweeView zoomDraweeView = ghRelativeLayout.findViewById(R.id.viewimage_iv_show); - zoomDraweeView.reset(); // 重置矩阵,还原图片 + BigImageView imageView = ghRelativeLayout.findViewById(R.id.viewimage_iv_show); + SubsamplingScaleImageView ssiv = imageView.getSSIV(); + if (ssiv != null) ssiv.resetScaleAndCenter(); + } } mIndicatorTv.setText(String.format("%d/%d", position + 1, urls.size())); @@ -295,16 +288,10 @@ public class ViewImageActivity extends BaseActivity implements OnPageChangeListe }); } - private void loadImage(String url, final ZoomSimpleDraweeView imageView) { - if (url.contains(".gif")) { - DraweeController controller = Fresco.newDraweeControllerBuilder() - .setUri(url) - .setAutoPlayAnimations(true) - .build(); - imageView.setController(controller); - } else { - imageView.setImageURI(url); // 加载原图 - } + private void loadImage(String url, final BigImageView imageView) { + // 添加GIF支持 + imageView.setImageViewFactory(new FrescoImageViewFactory()); + imageView.showImage(Uri.parse(url)); } private class ViewImageAdapter extends PagerAdapter implements OnSingleTapListener { @@ -317,6 +304,7 @@ public class ViewImageActivity extends BaseActivity implements OnPageChangeListe return urls.size(); } + @SuppressLint("MissingPermission") @NonNull @Override public Object instantiateItem(@NonNull ViewGroup container, int position) { @@ -324,28 +312,45 @@ public class ViewImageActivity extends BaseActivity implements OnPageChangeListe ImageRequest imageRequest = ImageRequest.fromUri(url); boolean isInMemoryCache = mImagePipeline.isInBitmapMemoryCache(imageRequest); boolean isInDiskCache = imageRequest != null && mImagePipeline.isInDiskCacheSync(imageRequest); - - Gh_RelativeLayout view = (Gh_RelativeLayout) View.inflate(container.getContext(), R.layout.viewimage_normal_item, null); - ZoomSimpleDraweeView imageView = view.findViewById(R.id.viewimage_iv_show); - if (isInMemoryCache - || isInDiskCache - || NetworkUtils.isWifiOr4GConnected(ViewImageActivity.this) - || url.contains(".gif")) { - loadImage(url, imageView); - } else { - ImageUtils.addLimitWidthAndLoad(imageView, url, mLimitWidth, imageInfo -> { - if (imageInfo != null && mImageInfoMap.get(url) == null) { - loadImageInfo(position, imageInfo.getWidth()); // 加载图片参数,目的是用户显示原文按钮 - } - }); + Gh_RelativeLayout view = (Gh_RelativeLayout) View.inflate(container.getContext(), R.layout.viewimage_normal_item, null); + BigImageView imageView = view.findViewById(R.id.viewimage_iv_show); + + if (!isInMemoryCache + && !isInDiskCache + && !NetworkUtils.isWifiOr4GConnected(ViewImageActivity.this) + && !url.contains(".gif")) { + url = ImageUtils.getTransformLimitUrl(url, mLimitWidth, getApplicationContext()); } - //单点退出 - imageView.setOnSingleClickListener(ViewImageActivity.this::finish); + String finalUrl = url; + imageView.setImageLoaderCallback(new SimpleImageLoader() { + @Override + public void onSuccess(File image) { + if (!finalUrl.equals(urls.get(position))) { + BitmapFactory.Options options = new BitmapFactory.Options(); + options.inJustDecodeBounds = true; + BitmapFactory.decodeFile(new File(image.getPath()).getAbsolutePath(), options); + loadImageInfo(position, options.outWidth); // 加载图片参数,目的是用户显示原文按钮 + } + SubsamplingScaleImageView ssiv = imageView.getSSIV(); + if (ssiv != null) { + ssiv.setMaxScale(10f); // 这个缩放倍数最好很具宽高自动调节 + ssiv.setOnImageEventListener(new SubsamplingScaleImageView.DefaultOnImageEventListener() { + @Override + public void onReady() { + ssiv.resetScaleAndCenter(); + } + }); + ssiv.setOnClickListener(v -> finish()); + + } + } + }); + loadImage(url, imageView); //长按 - imageView.setOnLongClickListener(() -> { + imageView.setOnLongClickListener(v -> { final Dialog dialog = new Dialog(ViewImageActivity.this); LinearLayout container1 = new LinearLayout(ViewImageActivity.this); @@ -353,8 +358,11 @@ public class ViewImageActivity extends BaseActivity implements OnPageChangeListe container1.setBackgroundColor(Color.WHITE); final TextView reportTv = new TextView(ViewImageActivity.this); - reportTv.setPadding(DisplayUtils.dip2px(ViewImageActivity.this, 20), DisplayUtils.dip2px(ViewImageActivity.this, 12), - 0, DisplayUtils.dip2px(ViewImageActivity.this, 12)); + reportTv.setPadding( + DisplayUtils.dip2px(ViewImageActivity.this, 20), + DisplayUtils.dip2px(ViewImageActivity.this, 12), + 0, + DisplayUtils.dip2px(ViewImageActivity.this, 12)); reportTv.setText(R.string.save_pic); reportTv.setTextSize(17); reportTv.setTextColor(ContextCompat.getColor(getApplicationContext(), R.color.title)); @@ -371,13 +379,15 @@ public class ViewImageActivity extends BaseActivity implements OnPageChangeListe dialog.show(); } - reportTv.setOnClickListener(v -> { + reportTv.setOnClickListener(v1 -> { PermissionHelper.checkStoragePermissionBeforeAction(ViewImageActivity.this, () -> { - findImageBM(); + saveImageToFile(imageView.getCurrentImageFile(), finalUrl); dialog.cancel(); }); dialog.cancel(); }); + + return false; }); view.setTag(position); @@ -385,100 +395,51 @@ public class ViewImageActivity extends BaseActivity implements OnPageChangeListe return view; } - private void findImageBM() { - String url = urls.get(mViewPager.getCurrentItem()); - String limitUrl = ImageUtils.addLimitWidth(urls.get(mViewPager.getCurrentItem()), mLimitWidth); - String targetUrl; - - if (mImagePipeline.isInBitmapMemoryCache(ImageRequest.fromUri(url))) { - targetUrl = url; - } else if (mImagePipeline.isInBitmapMemoryCache(ImageRequest.fromUri(limitUrl))) { - targetUrl = limitUrl; - } else { - targetUrl = url; - } - - - ImageRequest imageRequest = ImageRequestBuilder - .newBuilderWithSource(Uri.parse(targetUrl)) - .setProgressiveRenderingEnabled(true) - .build(); - - DataSource> - dataSource = mImagePipeline.fetchDecodedImage(imageRequest, ViewImageActivity.this); - final String finalCurUrl = targetUrl; - dataSource.subscribe(new BaseBitmapDataSubscriber() { - @Override - protected void onNewResultImpl(Bitmap bitmap) { - if (bitmap != null) { // gif bitmap is null - saveImage(bitmap, finalCurUrl); - } else { - ImageRequest imageRequest = ImageRequest.fromUri(Uri.parse(finalCurUrl)); - CacheKey encodedCacheKey = mImagePipeline.getCacheKeyFactory().getEncodedCacheKey(imageRequest, null); - BinaryResource resource = Fresco.getImagePipelineFactory().getMainFileCache().getResource(encodedCacheKey); - try { - String fileName = finalCurUrl.substring(finalCurUrl.lastIndexOf("/")); - String savePath = Environment.getExternalStorageDirectory().getAbsolutePath() + "/Pictures/ghzhushou/"; - - File targetFile = new File(savePath, fileName); - OutputStream outStream = new FileOutputStream(targetFile); - outStream.write(resource.read()); - Utils.toast(ViewImageActivity.this, "图片已保存到/Pictures/ghzhushou/"); - MessageShareUtils.refreshImage(ViewImageActivity.this, targetFile); - } catch (Exception e) { - Utils.log("图片保存失败:" + e.toString()); - e.printStackTrace(); - } - } - } - - @Override - protected void onFailureImpl(DataSource> dataSource) { - - } - }, CallerThreadExecutor.getInstance()); - } - - private void saveImage(Bitmap bitmap, String curUrl) { - - String fileName = ""; - - if (mShowBase64Image) { - fileName = MD5Utils.getUrlMD5(curUrl.substring(0, 50)) + ".png"; - } else { - fileName = curUrl.substring(curUrl.lastIndexOf("/")); - } - - String savePath = Environment.getExternalStorageDirectory().getAbsolutePath() + "/Pictures/ghzhushou/"; - + private void saveImageToFile(File src, String curUrl) { + InputStream in = null; + OutputStream out = null; try { + String fileName; + if (mShowBase64Image) { + fileName = MD5Utils.getUrlMD5(curUrl.substring(0, 50)) + ".png"; + } else { + fileName = curUrl.substring(curUrl.lastIndexOf("/")); + } + String savePath = Environment.getExternalStorageDirectory().getAbsolutePath() + "/Pictures/ghzhushou/"; File file = new File(savePath); if (!file.exists()) { file.mkdirs(); } - File f = new File(savePath, fileName); - if (f.exists()) { - f.delete(); + File dst = new File(savePath, fileName); + if (dst.exists()) { + dst.delete(); + } + + in = new FileInputStream(src); + out = new FileOutputStream(dst); + byte[] buf = new byte[1024]; + int len; + while ((len = in.read(buf)) > 0) { + out.write(buf, 0, len); } - FileOutputStream out = new FileOutputStream(f); - bitmap.compress(Bitmap.CompressFormat.PNG, 90, out); - out.flush(); - out.close(); - Utils.log("图片保存成功"); Utils.toast(ViewImageActivity.this, "图片已保存到/Pictures/ghzhushou/"); - MessageShareUtils.refreshImage(ViewImageActivity.this, f); - } catch (IOException e) { + } catch (Exception e) { Utils.log("图片保存失败:" + e.toString()); - e.printStackTrace(); + } finally { + try { + if (out != null) out.close(); + if (in != null) in.close(); + } catch (Exception ignore) { + } } } + @Override public void destroyItem(@NonNull ViewGroup container, int position, @NonNull Object object) { container.removeView((View) object); - object = null; } @Override diff --git a/app/src/main/java/com/halo/assistant/HaloApp.java b/app/src/main/java/com/halo/assistant/HaloApp.java index 789c8d1f99..b1ec079633 100644 --- a/app/src/main/java/com/halo/assistant/HaloApp.java +++ b/app/src/main/java/com/halo/assistant/HaloApp.java @@ -7,7 +7,10 @@ import android.net.ConnectivityManager; import android.net.Uri; import android.text.TextUtils; -import com.facebook.drawee.backends.pipeline.Fresco; +import androidx.collection.ArrayMap; +import androidx.lifecycle.ProcessLifecycleOwner; +import androidx.localbroadcastmanager.content.LocalBroadcastManager; + import com.gh.base.GHActivityLifecycleCallbacksImpl; import com.gh.common.LocalBroadcastReceiver; import com.gh.common.PushManager; @@ -31,6 +34,8 @@ import com.gh.gamecenter.receiver.MeizuPushReceiver; import com.gh.gamecenter.receiver.NetworkStateReceiver; import com.gh.gamecenter.receiver.UmengMessageReceiver; import com.gh.gid.GidHelper; +import com.github.piasy.biv.BigImageViewer; +import com.github.piasy.biv.loader.fresco.FrescoImageLoader; import com.leon.channel.helper.ChannelReaderUtil; import com.llew.huawei.verifier.LoadedApkHuaWei; import com.m7.imkfsdk.chat.ChatActivity; @@ -39,10 +44,6 @@ import com.squareup.picasso.Picasso; import java.util.concurrent.Executor; import java.util.concurrent.Executors; -import androidx.collection.ArrayMap; -import androidx.lifecycle.ProcessLifecycleOwner; -import androidx.localbroadcastmanager.content.LocalBroadcastManager; - public class HaloApp extends TinkerAppLike { private static HaloApp mInstance; @@ -142,8 +143,8 @@ public class HaloApp extends TinkerAppLike { // 注册回调以用于做各种统计 registerActivityLifecycleCallbacks(new GHActivityLifecycleCallbacksImpl()); - //初始化Fresco - Fresco.initialize(getApplication()); + //初始化Fresco(BigImageViewer 已包含Fresco) + BigImageViewer.initialize(FrescoImageLoader.with(getApplication())); ExposureManager.init(); diff --git a/app/src/main/res/layout/viewimage_normal_item.xml b/app/src/main/res/layout/viewimage_normal_item.xml index 4d37ef4ec7..3762d80c8f 100644 --- a/app/src/main/res/layout/viewimage_normal_item.xml +++ b/app/src/main/res/layout/viewimage_normal_item.xml @@ -1,21 +1,21 @@ - + - + + layout="@layout/reuse_loading" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_centerInParent="true" + android:visibility="gone" /> - \ No newline at end of file + \ No newline at end of file diff --git a/build.gradle b/build.gradle index 41c6a84420..02d04a7521 100644 --- a/build.gradle +++ b/build.gradle @@ -38,6 +38,7 @@ allprojects { maven { url 'https://jitpack.io' } maven { url "https://dl.bintray.com/thelasterstar/maven/" }//weiboSDK maven { url 'http://maven.aliyun.com/nexus/content/repositories/releases/' } + maven { url "http://dl.bintray.com/piasy/maven" } } }